From 245ca228442e0f1a5087f9095994a328b312e3b4 Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Mon, 17 Jan 2011 12:33:39 +0100 Subject: [PATCH] wrap javawrapper's arguments so that we know how to treat them. make sure literal types ripple up --- .../src/cs2j/CLR/TranslationTemplate.cs | 10 +++++- .../antlr3/src/cs2j/CSharp/JavaPrettyPrint.g | 7 +++- .../antlr3/src/cs2j/CSharp/NetMaker.g | 32 ++++++++++++++----- CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g | 2 ++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs index 95b1a27..27684a3 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs @@ -464,7 +464,15 @@ namespace RusticiSoftware.Translator.CLR else { methStr.Append("${this}."); } - methStr.Append(Name); + // special for ToString -> tostring + if (Name == "ToString" && Params.Count == 0) + { + methStr.Append("toString"); + } + else + { + methStr.Append(Name); + } return methStr.ToString() + mkJavaParams(Params); } diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g index 7fa26e4..5680d68 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g @@ -306,7 +306,7 @@ primary_expression returns [int precedence] $precedence = int.MaxValue; Dictionary templateMap = new Dictionary(); }: - ^(JAVAWRAPPER t=identifier (k=identifier v=expression { templateMap[$k.st.ToString()] = $v.st.ToString(); })*) -> string(payload = { fillTemplate($t.st.ToString(), templateMap) }) + ^(JAVAWRAPPER t=identifier (k=identifier v=wrapped { templateMap[$k.st.ToString()] = $v.st.ToString(); })*) -> string(payload = { fillTemplate($t.st.ToString(), templateMap) }) | ^(INDEX expression expression_list?) { $precedence = precedence[INDEX]; } -> index(func= { $expression.st }, funcparens = { comparePrecedence(precedence[INDEX], $expression.precedence) < 0 }, args = { $expression_list.st } ) | ^(APPLY expression argument_list?) { $precedence = precedence[APPLY]; } -> application(func= { $expression.st }, funcparens = { comparePrecedence(precedence[APPLY], $expression.precedence) < 0 }, args = { $argument_list.st } ) | ^((op=POSTINC|op=POSTDEC) expression) { $precedence = precedence[$op.token.Type]; } @@ -426,6 +426,11 @@ rank_specifier: // dim_separators: // ','+ ; +wrapped: + ^(JAVAWRAPPEREXPRESSION expression) -> { $expression.st } + | ^(JAVAWRAPPERARGUMENT argument_value) -> { $argument_value.st } + ; + delegate_creation_expression: // 'new' type_name '(' type_name ')' ; diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g index 63f4bbd..d2c8503 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g @@ -131,6 +131,22 @@ scope SymTab { return (CommonTree)adaptor.RulePostProcessing(root); } + protected CommonTree wrapExpression(CommonTree e, IToken tok) { + CommonTree root = (CommonTree)adaptor.Nil; + root = (CommonTree)adaptor.BecomeRoot((CommonTree)adaptor.Create(JAVAWRAPPEREXPRESSION, tok, "EXPRESSION"), root); + adaptor.AddChild(root, dupTree(e)); + + return (CommonTree)adaptor.RulePostProcessing(root); + } + + protected CommonTree wrapArgument(CommonTree e, IToken tok) { + CommonTree root = (CommonTree)adaptor.Nil; + root = (CommonTree)adaptor.BecomeRoot((CommonTree)adaptor.Create(JAVAWRAPPERARGUMENT, tok, "ARGUMENT"), root); + adaptor.AddChild(root, dupTree(e)); + + return (CommonTree)adaptor.RulePostProcessing(root); + } + // Resolve Routines // protected ResolveResult ResolveGetter(InterfaceRepTemplate thisType, String name) { // ResolveResult ret = null; @@ -221,10 +237,10 @@ scope { MethodRepTemplate methodRep = methodResult.Result as MethodRepTemplate; Dictionary myMap = new Dictionary(); if (!implicitThis) { - myMap["this"] = $e2.tree; + myMap["this"] = wrapExpression($e2.tree, $i2.tree.Token); } for (int idx = 0; idx < methodRep.Params.Count; idx++) { - myMap[methodRep.Params[idx].Name] = $argument_list.argTrees[idx]; + myMap[methodRep.Params[idx].Name] = wrapArgument($argument_list.argTrees[idx], $i2.tree.Token); } ret = mkJavaWrapper(methodResult.Result.Java, myMap, $i2.tree.Token); Imports.Add(methodResult.Result.Imports); @@ -254,7 +270,7 @@ scope { if (fieldResult != null) { Debug($d1.token.Line + ": Found '" + $i1.thetext + "'"); Dictionary myMap = new Dictionary(); - myMap["this"] = $e1.tree; + myMap["this"] = wrapExpression($e1.tree, $i1.tree.Token); ret = mkJavaWrapper(fieldResult.Result.Java, myMap, $i1.tree.Token); Imports.Add(fieldResult.Result.Imports); $dotNetType = fieldResult.ResultType; @@ -324,7 +340,8 @@ scope { $dotNetType = new UnknownRepTemplate($identifier.thetext); } } - | primary_expression_start + | primary_expression_start { $dotNetType = $primary_expression_start.dotNetType; } + | literal { $dotNetType = $literal.dotNetType; } // ('this' brackets) => 'this' brackets primary_expression_part* // | ('base' brackets) => 'this' brackets primary_expression_part* // | primary_expression_start primary_expression_part* @@ -345,7 +362,6 @@ scope { primary_expression_start returns [TypeRepTemplate dotNetType]: ^('::' identifier identifier) - | literal ; primary_expression_part: @@ -370,7 +386,7 @@ argument_list returns [List argTypes, List argTrees $argTypes = new List(); $argTrees = new List(); }: - ^(ARGS (argument { $argTypes.Add($argument.dotNetType); $argTrees.Add($argument.tree); })+); + ^(ARGS (argument { $argTypes.Add($argument.dotNetType); $argTrees.Add(dupTree($argument.tree)); })+); // 4.0 argument returns [TypeRepTemplate dotNetType]: argument_name argument_value { $dotNetType = $argument_value.dotNetType; } @@ -632,8 +648,8 @@ scope { Debug($i.tree.Token.Line + ": Found '" + $i.thetext + "'"); Dictionary valMap = new Dictionary(); if (!isThis) - valMap["this"] = $se.tree; - valMap["value"] = $rhs.tree; + valMap["this"] = wrapExpression($se.tree, $i.tree.Token); + valMap["value"] = wrapExpression($rhs.tree, $i.tree.Token); ret = mkJavaWrapper(((PropRepTemplate)fieldResult.Result).JavaSet, valMap, $a.token); Imports.Add(fieldResult.Result.Imports); } diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g index e0d9186..ee3149f 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g @@ -127,6 +127,8 @@ tokens { PAYLOAD; // carries arbitrary text for the output file PAYLOAD_LIST; JAVAWRAPPER; + JAVAWRAPPEREXPRESSION; + JAVAWRAPPERARGUMENT; SEP; KGHOLE; }