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

When looking for properties we need to specify read or write because they may appear in different parent classes

This commit is contained in:
Kevin Glynn 2011-03-01 11:00:23 +01:00
parent 895b538ba0
commit b4f8818196
2 changed files with 32 additions and 25 deletions

View File

@ -1767,7 +1767,7 @@ namespace Twiglet.CS2J.Translator.TypeRep
} }
// Resolve a field or property access // Resolve a field or property access
public virtual ResolveResult Resolve(String name, DirectoryHT<TypeRepTemplate> AppEnv) public virtual ResolveResult Resolve(String name, bool forWrite, DirectoryHT<TypeRepTemplate> AppEnv)
{ {
if (Inherits != null) if (Inherits != null)
{ {
@ -1776,7 +1776,7 @@ namespace Twiglet.CS2J.Translator.TypeRep
TypeRepTemplate baseType = BuildType(b, AppEnv); TypeRepTemplate baseType = BuildType(b, AppEnv);
if (baseType != null) if (baseType != null)
{ {
ResolveResult ret = baseType.Resolve(name,AppEnv); ResolveResult ret = baseType.Resolve(name, forWrite, AppEnv);
if (ret != null) if (ret != null)
return ret; return ret;
} }
@ -2265,7 +2265,7 @@ namespace Twiglet.CS2J.Translator.TypeRep
_members = ms; _members = ms;
} }
public override ResolveResult Resolve(String name, DirectoryHT<TypeRepTemplate> AppEnv) public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT<TypeRepTemplate> AppEnv)
{ {
if (Members != null) 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<TypeRepTemplate> args) public override TypeRepTemplate Instantiate(ICollection<TypeRepTemplate> args)
{ {
@ -2617,14 +2617,14 @@ namespace Twiglet.CS2J.Translator.TypeRep
return base.IsA(other,AppEnv); return base.IsA(other,AppEnv);
} }
public override ResolveResult Resolve(String name, DirectoryHT<TypeRepTemplate> AppEnv) public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT<TypeRepTemplate> AppEnv)
{ {
if (Properties != null) if (Properties != null)
{ {
foreach (PropRepTemplate p in Properties) foreach (PropRepTemplate p in Properties)
{ {
if (p.Name == name) if (p.Name == name && ((forWrite && p.CanWrite) || (!forWrite && p.CanRead)))
{ {
ResolveResult res = new ResolveResult(); ResolveResult res = new ResolveResult();
res.Result = p; 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<TypeRepTemplate> args, DirectoryHT<TypeRepTemplate> AppEnv) public override ResolveResult Resolve(String name, List<TypeRepTemplate> args, DirectoryHT<TypeRepTemplate> AppEnv)
@ -2986,7 +2986,7 @@ namespace Twiglet.CS2J.Translator.TypeRep
} }
public override ResolveResult Resolve(String name, DirectoryHT<TypeRepTemplate> AppEnv) public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT<TypeRepTemplate> AppEnv)
{ {
if (Fields != null) 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<TypeRepTemplate> args, DirectoryHT<TypeRepTemplate> AppEnv) public ResolveResult Resolve(List<TypeRepTemplate> args, DirectoryHT<TypeRepTemplate> AppEnv)
@ -3172,9 +3172,9 @@ namespace Twiglet.CS2J.Translator.TypeRep
{ {
} }
public override ResolveResult Resolve(String name, DirectoryHT<TypeRepTemplate> AppEnv) public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT<TypeRepTemplate> AppEnv)
{ {
return base.Resolve(name, AppEnv); return base.Resolve(name, forWrite, AppEnv);
} }
#region Equality #region Equality

View File

@ -606,7 +606,7 @@ scope {
$dotNetType = new UnknownRepTemplate(expType.TypeName+".DOTACCESS."+ $i1.thetext); $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) { if (fieldResult != null) {
Debug($d1.token.Line + ": Found '" + $i1.thetext + "'"); Debug($d1.token.Line + ": Found '" + $i1.thetext + "'");
Dictionary<string,CommonTree> myMap = new Dictionary<string,CommonTree>(); Dictionary<string,CommonTree> myMap = new Dictionary<string,CommonTree>();
@ -661,7 +661,7 @@ scope {
($primary_expression.Count == 1 || !((primary_expression_scope)($primary_expression.ToArray()[1])).parentIsApply)) { ($primary_expression.Count == 1 || !((primary_expression_scope)($primary_expression.ToArray()[1])).parentIsApply)) {
Debug($identifier.tree.Token.Line + ": '" + $identifier.thetext + "' might be a property"); 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) { if (fieldResult != null) {
Debug($identifier.tree.Token.Line + ": Found '" + $identifier.thetext + "'"); Debug($identifier.tree.Token.Line + ": Found '" + $identifier.thetext + "'");
ret = mkJavaWrapper(fieldResult.Result.Java, null, $i.tree.Token); ret = mkJavaWrapper(fieldResult.Result.Java, null, $i.tree.Token);
@ -1100,7 +1100,7 @@ assignment
if (seType.IsUnknownType) { if (seType.IsUnknownType) {
WarningFailedResolve($i.tree.Token.Line, "Could not find type of expression for field /property access"); 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 != null) {
if (fieldResult.Result is PropRepTemplate) { if (fieldResult.Result is PropRepTemplate) {
PropRepTemplate propRep = fieldResult.Result as 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 // if assignment operator is a short cut operator then only translate if we also have JavaGet
bool goodTx = true; bool goodTx = true;
if ($a.tree.Token.Type != ASSIGN) { if ($a.tree.Token.Type != ASSIGN) {
if (!String.IsNullOrEmpty(propRep.JavaGet)) { // We have to resolve property reads and writes separately, because they may come from
// we have prop <op>= rhs // different parent classes
// need to translate to setProp(getProp <op> rhs) ResolveResult readFieldResult = seType.Resolve($i.thetext, false, AppEnv);
Dictionary<string,CommonTree> rhsMap = new Dictionary<string,CommonTree>(); if (readFieldResult.Result is PropRepTemplate) {
if (!isThis) PropRepTemplate readPropRep = readFieldResult.Result as PropRepTemplate;
rhsMap["this"] = wrapExpression($se.tree, $i.tree.Token);
CommonTree rhsPropTree = mkJavaWrapper(propRep.JavaGet, rhsMap, $a.tree.Token); if (!String.IsNullOrEmpty(readPropRep.JavaGet)) {
newRhsExp = mkOpExp(mkOpExp($a.tree), rhsPropTree, $rhs.tree); // we have prop <op>= rhs
} // need to translate to setProp(getProp <op> rhs)
else { Dictionary<string,CommonTree> rhsMap = new Dictionary<string,CommonTree>();
goodTx = false; 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<string,CommonTree> valMap = new Dictionary<string,CommonTree>(); Dictionary<string,CommonTree> valMap = new Dictionary<string,CommonTree>();