1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

support for ref/out params in calls in if-then-else conditional expression

This commit is contained in:
Kevin Glynn 2011-05-02 12:54:18 +02:00
parent 1c0fa6586b
commit 0a7af29e58

View File

@ -335,6 +335,7 @@ scope MkNonGeneric {
protected int dummyStaticConstructorCatchVarCtr = 0; protected int dummyStaticConstructorCatchVarCtr = 0;
protected int dummyTyVarCtr = 0; protected int dummyTyVarCtr = 0;
protected int dummyRefVarCtr = 0; protected int dummyRefVarCtr = 0;
protected int dummyVarCtr = 0;
// It turns out that 'default:' doesn't have to be last in the switch statement, so // It turns out that 'default:' doesn't have to be last in the switch statement, so
// we need some jiggery pokery when converting to if-then-else. // we need some jiggery pokery when converting to if-then-else.
@ -878,6 +879,7 @@ argument_value returns [TypeRepTemplate dotNetType, TypeRepTemplate typeofType]
magicCreateOutVar[$o.token, refVar, ($variable_reference.dotNetType != null ? (CommonTree)$variable_reference.dotNetType.Tree : null)] magicUpdateFromRefVar[$o.token, refVar, $variable_reference.tree] magicCreateOutVar[$o.token, refVar, ($variable_reference.dotNetType != null ? (CommonTree)$variable_reference.dotNetType.Tree : null)] magicUpdateFromRefVar[$o.token, refVar, $variable_reference.tree]
{ $dotNetType = $variable_reference.dotNetType; { $dotNetType = $variable_reference.dotNetType;
$typeofType = $variable_reference.typeofType; $typeofType = $variable_reference.typeofType;
AddToImports("CS2JNet.JavaSupport.language.RefSupport");
adaptor.AddChild($embedded_statement::preStatements, $magicCreateOutVar.tree); adaptor.AddChild($embedded_statement::preStatements, $magicCreateOutVar.tree);
adaptor.AddChild($embedded_statement::postStatements, $magicUpdateFromRefVar.tree); adaptor.AddChild($embedded_statement::postStatements, $magicUpdateFromRefVar.tree);
} }
@ -895,6 +897,7 @@ ref_variable_reference returns [TypeRepTemplate dotNetType, TypeRepTemplate type
magicCreateRefVar[$r.token, refVar, ($v1.dotNetType != null ? (CommonTree)$v1.dotNetType.Tree : null), $v1.tree] magicUpdateFromRefVar[$r.token, refVar, $v1.tree] magicCreateRefVar[$r.token, refVar, ($v1.dotNetType != null ? (CommonTree)$v1.dotNetType.Tree : null), $v1.tree] magicUpdateFromRefVar[$r.token, refVar, $v1.tree]
{ {
$dotNetType = $v1.dotNetType; $typeofType = $v1.typeofType; $dotNetType = $v1.dotNetType; $typeofType = $v1.typeofType;
AddToImports("CS2JNet.JavaSupport.language.RefSupport");
adaptor.AddChild($embedded_statement::preStatements, $magicCreateRefVar.tree); adaptor.AddChild($embedded_statement::preStatements, $magicCreateRefVar.tree);
adaptor.AddChild($embedded_statement::postStatements, $magicUpdateFromRefVar.tree); adaptor.AddChild($embedded_statement::postStatements, $magicUpdateFromRefVar.tree);
} }
@ -2100,9 +2103,25 @@ embedded_statement[bool isStatementListCtxt]scope {
@init { @init {
$embedded_statement::preStatements = (CommonTree)adaptor.Nil; $embedded_statement::preStatements = (CommonTree)adaptor.Nil;
$embedded_statement::postStatements = (CommonTree)adaptor.Nil; $embedded_statement::postStatements = (CommonTree)adaptor.Nil;
bool hasPreOrPost = false;
string idName = null;
}
@after {
}: }:
block block
| ^(IF boolean_expression SEP embedded_statement[/* isStatementListCtxt */ false] else_statement?) | ^(ift=IF boolean_expression
{ hasPreOrPost = adaptor.GetChildCount($embedded_statement::preStatements) > 0 || adaptor.GetChildCount($embedded_statement::postStatements) > 0;
if (hasPreOrPost) {
idName = "boolVar___" + dummyVarCtr++;
}
}
SEP embedded_statement[/* isStatementListCtxt */ false] else_statement?)
magicType[hasPreOrPost, $ift.token, "boolean", null]
magicAssignment[hasPreOrPost, $ift.token, $magicType.tree, idName, $boolean_expression.tree]
-> {!hasPreOrPost }? ^($ift boolean_expression SEP embedded_statement else_statement?)
-> {isStatementListCtxt}?
{ $embedded_statement::preStatements } magicAssignment { $embedded_statement::postStatements } ^($ift IDENTIFIER[$ift.token, idName] SEP embedded_statement else_statement?)
-> OPEN_BRACE[$ift.token, "{"] { $embedded_statement::preStatements } magicAssignment { $embedded_statement::postStatements } ^($ift IDENTIFIER[$ift.token, idName] SEP embedded_statement else_statement?) CLOSE_BRACE[$ift.token, "}"]
| switch_statement[isStatementListCtxt] | switch_statement[isStatementListCtxt]
| iteration_statement // while, do, for, foreach | iteration_statement // while, do, for, foreach
| jump_statement // break, continue, goto, return, throw | jump_statement // break, continue, goto, return, throw
@ -2113,8 +2132,9 @@ embedded_statement[bool isStatementListCtxt]scope {
| yield_statement | yield_statement
| ^('unsafe' block) | ^('unsafe' block)
| fixed_statement | fixed_statement
| expression_statement -> {isStatementListCtxt}? { $embedded_statement::preStatements } expression_statement { $embedded_statement::postStatements } | expression_statement { hasPreOrPost = adaptor.GetChildCount($embedded_statement::preStatements) > 0 || adaptor.GetChildCount($embedded_statement::postStatements) > 0; }
-> OPEN_BRACE[$expression_statement.tree.Token, "{"] { $embedded_statement::preStatements } expression_statement { $embedded_statement::postStatements } CLOSE_BRACE[$expression_statement.tree.Token, "}"] // expression! -> {isStatementListCtxt || !hasPreOrPost }? { $embedded_statement::preStatements } expression_statement { $embedded_statement::postStatements }
-> OPEN_BRACE[$expression_statement.tree.Token, "{"] { $embedded_statement::preStatements } expression_statement { $embedded_statement::postStatements } CLOSE_BRACE[$expression_statement.tree.Token, "}"] // expression!
; ;
switch_statement[ bool isStatementListCtxt] switch_statement[ bool isStatementListCtxt]
scope { scope {
@ -2703,12 +2723,18 @@ magicRef[bool isOn, IToken tok, CommonTree ty]:
; ;
magicCreateRefVar[IToken tok, String id, CommonTree type, CommonTree value]: magicCreateRefVar[IToken tok, String id, CommonTree type, CommonTree value]:
-> { type == null }? ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"]) IDENTIFIER[tok, id] ASSIGN[tok, "="]
^(NEW[tok, "new"] ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"]) ^(ARGS[tok, "ARGS"] { dupTree(value) }))
SEMI[tok,";"]
-> ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"]) IDENTIFIER[tok, id] ASSIGN[tok, "="] -> ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"]) IDENTIFIER[tok, id] ASSIGN[tok, "="]
^(NEW[tok, "new"] ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"]) ^(ARGS[tok, "ARGS"] { dupTree(value) })) ^(NEW[tok, "new"] ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"]) ^(ARGS[tok, "ARGS"] { dupTree(value) }))
SEMI[tok,";"] SEMI[tok,";"]
; ;
magicCreateOutVar[IToken tok, String id, CommonTree type]: magicCreateOutVar[IToken tok, String id, CommonTree type]:
-> {type == null}? ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"]) IDENTIFIER[tok, id] ASSIGN[tok, "="]
^(NEW[tok, "new"] ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"]))
SEMI[tok,";"]
-> ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"]) IDENTIFIER[tok, id] ASSIGN[tok, "="] -> ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"]) IDENTIFIER[tok, id] ASSIGN[tok, "="]
^(NEW[tok, "new"] ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"])) ^(NEW[tok, "new"] ^(TYPE[tok, "TYPE"] IDENTIFIER[tok, "RefSupport"] LTHAN[tok, "<"] { dupTree(type) } GT[tok, ">"]))
SEMI[tok,";"] SEMI[tok,";"]