From d4d24341acb216f47b8af20f6d56b5aa1ddbbe91 Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Thu, 13 Jan 2011 10:38:33 +0100 Subject: [PATCH] resolve simple property reads --- .../src/cs2j/CLR/TranslationTemplate.cs | 49 +++++++++++++++++ .../antlr3/src/cs2j/CSharp/CommonWalker.cs | 1 + .../antlr3/src/cs2j/CSharp/JavaMaker.g | 1 + .../antlr3/src/cs2j/CSharp/JavaPrettyPrint.g | 28 +++++++++- .../antlr3/src/cs2j/CSharp/NetMaker.g | 53 +++++++++++++++++-- CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g | 1 + 6 files changed, 128 insertions(+), 5 deletions(-) diff --git a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs index 20a8af8..2c07539 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CLR/TranslationTemplate.cs @@ -1334,6 +1334,30 @@ namespace RusticiSoftware.Translator.CLR return new InterfaceRep (); } + public virtual TranslationBase Resolve(String name, DirectoryHT AppEnv) + { + + if (Properties != null) + { + foreach (PropRepTemplate p in Properties) + { + if (p.Name == name) + return p; + } + } + if (Inherits != null) + { + foreach (String b in Inherits) + { + TranslationBase ret = ((InterfaceRepTemplate)AppEnv.Search(Uses, b)).Resolve(name,AppEnv); + if (ret != null) + return ret; + } + } + return null; + } + + #region Equality public bool Equals (InterfaceRepTemplate other) { @@ -1526,6 +1550,21 @@ namespace RusticiSoftware.Translator.CLR return new ClassRep (); } + public override TranslationBase Resolve(String name, DirectoryHT AppEnv) + { + + if (Fields != null) + { + foreach (FieldRepTemplate f in Fields) + { + if (f.Name == name) + return f; + } + } + return base.Resolve(name, AppEnv); + } + + #region Equality public bool Equals (ClassRepTemplate other) { @@ -1658,6 +1697,11 @@ namespace RusticiSoftware.Translator.CLR return new StructRep (); } + public override TranslationBase Resolve(String name, DirectoryHT AppEnv) + { + return base.Resolve(name, AppEnv); + } + #region Equality public bool Equals (StructRepTemplate other) { @@ -1748,4 +1792,9 @@ namespace RusticiSoftware.Translator.CLR } + + + + + } diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs b/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs index 03ab98b..af81f46 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/CommonWalker.cs @@ -95,6 +95,7 @@ namespace RusticiSoftware.Translator.CSharp buf.Append(">"); return buf.ToString(); } + } // Wraps a compilation unit with its imports search path diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g index 7eddd4a..6e8b86e 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaMaker.g @@ -239,6 +239,7 @@ scope TypeContext { protected CommonTree dupTree(CommonTree t) { return (CommonTree)adaptor.DupTree(t); } + } /******************************************************************************************** diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g index 5a0f8a0..7fa26e4 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/JavaPrettyPrint.g @@ -214,6 +214,30 @@ options { public int comparePrecedence(int parentPrec, int childPrec) { return Math.Sign(childPrec-parentPrec); } + // cleverly remove any remaining ${..} tokens + public string cleanTemplate(string template) { + // Are there any markers in the template? Mostly, the answer will be no and we can return tout-de-suite + String ret = template; + if (Regex.IsMatch(ret, "\\$\\{.*\\}")) { + // ${this}.fred -> fred + ret = Regex.Replace(ret, "\\$\\{.*\\}\\.", String.Empty); + // (a,${var},b) -> (a,b) + ret = Regex.Replace(ret, "\\$\\{.*\\},", String.Empty); + // (a,${var}) -> (a) + ret = Regex.Replace(ret, ",\\$\\{.*\\}", String.Empty); + // (${var}) -> () + ret = Regex.Replace(ret, "\\$\\{.*\\}", String.Empty); + } + return ret; + } + public string fillTemplate(string template, Dictionary templateMap) { + String ret = template; + foreach (string v in templateMap.Keys) { + ret = ret.Replace("${" + v + "}", templateMap[v]); + } + ret = cleanTemplate(ret); + return ret; + } } compilation_unit @@ -280,8 +304,10 @@ exception: primary_expression returns [int precedence] @init { $precedence = int.MaxValue; + Dictionary templateMap = new Dictionary(); }: - ^(INDEX expression expression_list?) { $precedence = precedence[INDEX]; } -> index(func= { $expression.st }, funcparens = { comparePrecedence(precedence[INDEX], $expression.precedence) < 0 }, args = { $expression_list.st } ) + ^(JAVAWRAPPER t=identifier (k=identifier v=expression { 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]; } -> op(pre={$expression.st}, op={ $op.token.Text }, preparens= { comparePrecedence($op.token, $expression.precedence) <= 0 }) diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g index 05ced78..cf9f8f4 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/NetMaker.g @@ -113,6 +113,38 @@ scope SymTab { } return def; } + + protected CommonTree mkJavaWrapper(string template, Dictionary varMap, IToken tok) { + CommonTree root = (CommonTree)adaptor.Nil; + root = (CommonTree)adaptor.BecomeRoot((CommonTree)adaptor.Create(JAVAWRAPPER, tok, "JAVAWRAPPER"), root); + adaptor.AddChild(root, (CommonTree)adaptor.Create(IDENTIFIER, tok, template)); + + if (varMap != null) { + foreach (String var in varMap.Keys) { + if (varMap[var] != null) { + adaptor.AddChild(root, (CommonTree)adaptor.Create(IDENTIFIER, tok, var)); + adaptor.AddChild(root, dupTree(varMap[var])); + } + } + } + + return (CommonTree)adaptor.RulePostProcessing(root); + } + + // Resolve Routines + protected String ResolveGetter(InterfaceRepTemplate thisType, CommonTree thisExp, String name) { + String ret = null; + PropRepTemplate entity = thisType.Resolve(name, AppEnv) as PropRepTemplate; + if (entity != null) { + ret = entity.JavaGet; + } + return ret; + } + + protected CommonTree dupTree(CommonTree t) { + return (CommonTree)adaptor.DupTree(t); + } + } compilation_unit @@ -170,6 +202,11 @@ scope { } @init { $primary_expression::parentIsApply = false; + CommonTree ret = null; +} +@after { + if (ret != null) + $primary_expression.tree = ret; }: ^(INDEX expression expression_list?) // | ^(APPLY identifier argument_list?) @@ -181,18 +218,26 @@ scope { | predefined_type { $dotNetType = $predefined_type.dotNetType; } | 'this' { $dotNetType = SymTabLookup("this"); } | SUPER { $dotNetType = SymTabLookup("super"); } - | identifier + | i=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) && + // Is it a property? Ensure we are not being applied to arguments or about to be assigned + InterfaceRepTemplate thisType = SymTabLookup("this") as InterfaceRepTemplate; + if (thisType != null && + ($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"); + String template = ResolveGetter(thisType, null, $identifier.thetext); + if (template != null) { + Debug($identifier.tree.Token.Line + ": Found '" + $identifier.thetext + "'"); + // Dictionary myMap = new Dictionary(); + // myMap["this"] = null; + ret = mkJavaWrapper(template, null, $i.tree.Token); + } } - } $dotNetType = idType; } diff --git a/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g b/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g index 8ccb86f..e0d9186 100644 --- a/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g +++ b/CSharpTranslator/antlr3/src/cs2j/CSharp/cs.g @@ -126,6 +126,7 @@ tokens { PAYLOAD; // carries arbitrary text for the output file PAYLOAD_LIST; + JAVAWRAPPER; SEP; KGHOLE; }