mirror of
https://github.com/twiglet/cs2j.git
synced 2025-01-18 13:15:17 +01:00
keep track of contexts so that we can spot possible properties
This commit is contained in:
parent
afeaaf4bfe
commit
4c9cc2dd4a
@ -164,18 +164,38 @@ class_member_declaration:
|
|||||||
exception:
|
exception:
|
||||||
EXCEPTION;
|
EXCEPTION;
|
||||||
|
|
||||||
primary_expression returns [TypeRepTemplate dotNetType]:
|
primary_expression returns [TypeRepTemplate dotNetType]
|
||||||
|
scope {
|
||||||
|
bool parentIsApply;
|
||||||
|
}
|
||||||
|
@init {
|
||||||
|
$primary_expression::parentIsApply = false;
|
||||||
|
}:
|
||||||
^(INDEX expression expression_list?)
|
^(INDEX expression expression_list?)
|
||||||
// | ^(APPLY identifier argument_list?)
|
// | ^(APPLY identifier argument_list?)
|
||||||
// | ^(APPLY ^('.' expression identifier) argument_list?)
|
// | ^(APPLY ^('.' expression identifier) argument_list?)
|
||||||
| ^(APPLY expression argument_list?)
|
| ^(APPLY {$primary_expression::parentIsApply = true; } expression {$primary_expression::parentIsApply = false; } argument_list?)
|
||||||
| ^(POSTINC expression)
|
| ^(POSTINC expression)
|
||||||
| ^(POSTDEC expression)
|
| ^(POSTDEC expression)
|
||||||
| ^(access_operator expression identifier generic_argument_list?)
|
| ^(access_operator expression identifier generic_argument_list?)
|
||||||
| predefined_type { $dotNetType = $predefined_type.dotNetType; }
|
| predefined_type { $dotNetType = $predefined_type.dotNetType; }
|
||||||
| 'this' { $dotNetType = SymTabLookup("this"); }
|
| 'this' { $dotNetType = SymTabLookup("this"); }
|
||||||
| SUPER { $dotNetType = SymTabLookup("super"); }
|
| SUPER { $dotNetType = SymTabLookup("super"); }
|
||||||
| identifier { $dotNetType = SymTabLookup($identifier.thetext); }
|
| identifier
|
||||||
|
{
|
||||||
|
TypeRepTemplate idType = SymTabLookup($identifier.thetext);
|
||||||
|
if (idType == null) {
|
||||||
|
// Not a variable
|
||||||
|
// Is it a property? Enusre we are not being applied to arguments or about to be assigned
|
||||||
|
if (($primary_expression.Count == 1 || !((primary_expression_scope)($primary_expression.ToArray()[1])).parentIsApply) &&
|
||||||
|
($assignment.Count == 0 || !$assignment::parentIsSetter)) {
|
||||||
|
|
||||||
|
Debug($identifier.tree.Token.Line + ": '" + $identifier.thetext + "' might be a property");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
$dotNetType = idType;
|
||||||
|
}
|
||||||
| primary_expression_start
|
| primary_expression_start
|
||||||
// ('this' brackets) => 'this' brackets primary_expression_part*
|
// ('this' brackets) => 'this' brackets primary_expression_part*
|
||||||
// | ('base' brackets) => 'this' brackets primary_expression_part*
|
// | ('base' brackets) => 'this' brackets primary_expression_part*
|
||||||
@ -457,8 +477,14 @@ expression returns [TypeRepTemplate dotNetType]:
|
|||||||
;
|
;
|
||||||
expression_list:
|
expression_list:
|
||||||
expression (',' expression)* ;
|
expression (',' expression)* ;
|
||||||
assignment:
|
assignment
|
||||||
unary_expression assignment_operator expression ;
|
scope {
|
||||||
|
bool parentIsSetter;
|
||||||
|
}
|
||||||
|
@init {
|
||||||
|
$assignment::parentIsSetter = true;
|
||||||
|
}:
|
||||||
|
unary_expression assignment_operator {$assignment::parentIsSetter = false; } expression ;
|
||||||
unary_expression returns [TypeRepTemplate dotNetType]:
|
unary_expression returns [TypeRepTemplate dotNetType]:
|
||||||
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
|
//('(' arguments ')' ('[' | '.' | '(')) => primary_or_array_creation_expression
|
||||||
|
|
||||||
@ -994,11 +1020,15 @@ switch_section:
|
|||||||
switch_label:
|
switch_label:
|
||||||
^('case' constant_expression)
|
^('case' constant_expression)
|
||||||
| 'default';
|
| 'default';
|
||||||
iteration_statement:
|
iteration_statement
|
||||||
|
scope SymTab;
|
||||||
|
@init {
|
||||||
|
$SymTab::symtab = new Dictionary<string,TypeRepTemplate>();
|
||||||
|
}:
|
||||||
^('while' boolean_expression SEP embedded_statement)
|
^('while' boolean_expression SEP embedded_statement)
|
||||||
| do_statement
|
| do_statement
|
||||||
| ^('for' for_initializer? SEP for_condition? SEP for_iterator? SEP embedded_statement)
|
| ^('for' for_initializer? SEP for_condition? SEP for_iterator? SEP embedded_statement)
|
||||||
| ^('foreach' local_variable_type identifier expression SEP embedded_statement);
|
| ^('foreach' local_variable_type identifier { $SymTab::symtab[$identifier.thetext] = $local_variable_type.dotNetType; } expression SEP embedded_statement);
|
||||||
do_statement:
|
do_statement:
|
||||||
'do' embedded_statement 'while' '(' boolean_expression ')' ';' ;
|
'do' embedded_statement 'while' '(' boolean_expression ')' ';' ;
|
||||||
for_initializer:
|
for_initializer:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user