From b4f88181961f13b194e20be0380a1e67bc28332d Mon Sep 17 00:00:00 2001 From: Kevin Glynn Date: Tue, 1 Mar 2011 11:00:23 +0100 Subject: [PATCH] When looking for properties we need to specify read or write because they may appear in different parent classes --- .../CS2JTemplate/TranslationTemplate.cs | 22 ++++++------ .../CS2JTranslator/CS2JTransform/NetMaker.g | 35 +++++++++++-------- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTemplate/TranslationTemplate.cs b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTemplate/TranslationTemplate.cs index d87343a..34e573b 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTemplate/TranslationTemplate.cs +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTemplate/TranslationTemplate.cs @@ -1767,7 +1767,7 @@ namespace Twiglet.CS2J.Translator.TypeRep } // Resolve a field or property access - public virtual ResolveResult Resolve(String name, DirectoryHT AppEnv) + public virtual ResolveResult Resolve(String name, bool forWrite, DirectoryHT AppEnv) { if (Inherits != null) { @@ -1776,7 +1776,7 @@ namespace Twiglet.CS2J.Translator.TypeRep TypeRepTemplate baseType = BuildType(b, AppEnv); if (baseType != null) { - ResolveResult ret = baseType.Resolve(name,AppEnv); + ResolveResult ret = baseType.Resolve(name, forWrite, AppEnv); if (ret != null) return ret; } @@ -2265,7 +2265,7 @@ namespace Twiglet.CS2J.Translator.TypeRep _members = ms; } - public override ResolveResult Resolve(String name, DirectoryHT AppEnv) + public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT AppEnv) { if (Members != null) { @@ -2280,7 +2280,7 @@ namespace Twiglet.CS2J.Translator.TypeRep } } } - return base.Resolve(name, AppEnv); + return base.Resolve(name, forWrite, AppEnv); } public override TypeRepTemplate Instantiate(ICollection args) { @@ -2617,14 +2617,14 @@ namespace Twiglet.CS2J.Translator.TypeRep return base.IsA(other,AppEnv); } - public override ResolveResult Resolve(String name, DirectoryHT AppEnv) + public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT AppEnv) { if (Properties != null) { foreach (PropRepTemplate p in Properties) { - if (p.Name == name) + if (p.Name == name && ((forWrite && p.CanWrite) || (!forWrite && p.CanRead))) { ResolveResult res = new ResolveResult(); res.Result = p; @@ -2633,7 +2633,7 @@ namespace Twiglet.CS2J.Translator.TypeRep } } } - return base.Resolve(name,AppEnv); + return base.Resolve(name, forWrite, AppEnv); } public override ResolveResult Resolve(String name, List args, DirectoryHT AppEnv) @@ -2986,7 +2986,7 @@ namespace Twiglet.CS2J.Translator.TypeRep } - public override ResolveResult Resolve(String name, DirectoryHT AppEnv) + public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT AppEnv) { if (Fields != null) @@ -3002,7 +3002,7 @@ namespace Twiglet.CS2J.Translator.TypeRep } } } - return base.Resolve(name, AppEnv); + return base.Resolve(name, forWrite, AppEnv); } public ResolveResult Resolve(List args, DirectoryHT AppEnv) @@ -3172,9 +3172,9 @@ namespace Twiglet.CS2J.Translator.TypeRep { } - public override ResolveResult Resolve(String name, DirectoryHT AppEnv) + public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT AppEnv) { - return base.Resolve(name, AppEnv); + return base.Resolve(name, forWrite, AppEnv); } #region Equality diff --git a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g index af2ca1a..038b42b 100644 --- a/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g +++ b/CSharpTranslator/antlr3/src/CS2JTranslator/CS2JTransform/NetMaker.g @@ -606,7 +606,7 @@ scope { $dotNetType = new UnknownRepTemplate(expType.TypeName+".DOTACCESS."+ $i1.thetext); - ResolveResult fieldResult = expType.Resolve($i1.thetext, AppEnv); + ResolveResult fieldResult = expType.Resolve($i1.thetext, false, AppEnv); if (fieldResult != null) { Debug($d1.token.Line + ": Found '" + $i1.thetext + "'"); Dictionary myMap = new Dictionary(); @@ -661,7 +661,7 @@ scope { ($primary_expression.Count == 1 || !((primary_expression_scope)($primary_expression.ToArray()[1])).parentIsApply)) { Debug($identifier.tree.Token.Line + ": '" + $identifier.thetext + "' might be a property"); - ResolveResult fieldResult = thisType.Resolve($identifier.thetext, AppEnv); + ResolveResult fieldResult = thisType.Resolve($identifier.thetext, false, AppEnv); if (fieldResult != null) { Debug($identifier.tree.Token.Line + ": Found '" + $identifier.thetext + "'"); ret = mkJavaWrapper(fieldResult.Result.Java, null, $i.tree.Token); @@ -1100,7 +1100,7 @@ assignment if (seType.IsUnknownType) { WarningFailedResolve($i.tree.Token.Line, "Could not find type of expression for field /property access"); } - ResolveResult fieldResult = seType.Resolve($i.thetext, AppEnv); + ResolveResult fieldResult = seType.Resolve($i.thetext, true, AppEnv); if (fieldResult != null) { if (fieldResult.Result is PropRepTemplate) { PropRepTemplate propRep = fieldResult.Result as PropRepTemplate; @@ -1109,17 +1109,24 @@ assignment // if assignment operator is a short cut operator then only translate if we also have JavaGet bool goodTx = true; if ($a.tree.Token.Type != ASSIGN) { - if (!String.IsNullOrEmpty(propRep.JavaGet)) { - // we have prop = rhs - // need to translate to setProp(getProp rhs) - Dictionary rhsMap = new Dictionary(); - if (!isThis) - rhsMap["this"] = wrapExpression($se.tree, $i.tree.Token); - CommonTree rhsPropTree = mkJavaWrapper(propRep.JavaGet, rhsMap, $a.tree.Token); - newRhsExp = mkOpExp(mkOpExp($a.tree), rhsPropTree, $rhs.tree); - } - else { - goodTx = false; + // We have to resolve property reads and writes separately, because they may come from + // different parent classes + ResolveResult readFieldResult = seType.Resolve($i.thetext, false, AppEnv); + if (readFieldResult.Result is PropRepTemplate) { + PropRepTemplate readPropRep = readFieldResult.Result as PropRepTemplate; + + if (!String.IsNullOrEmpty(readPropRep.JavaGet)) { + // we have prop = rhs + // need to translate to setProp(getProp rhs) + Dictionary rhsMap = new Dictionary(); + if (!isThis) + rhsMap["this"] = wrapExpression($se.tree, $i.tree.Token); + CommonTree rhsPropTree = mkJavaWrapper(readPropRep.JavaGet, rhsMap, $a.tree.Token); + newRhsExp = mkOpExp(mkOpExp($a.tree), rhsPropTree, $rhs.tree); + } + else { + goodTx = false; + } } } Dictionary valMap = new Dictionary();