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
public virtual ResolveResult Resolve(String name, DirectoryHT<TypeRepTemplate> AppEnv)
public virtual ResolveResult Resolve(String name, bool forWrite, DirectoryHT<TypeRepTemplate> 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<TypeRepTemplate> AppEnv)
public override ResolveResult Resolve(String name, bool forWrite, DirectoryHT<TypeRepTemplate> 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<TypeRepTemplate> args)
{
@ -2617,14 +2617,14 @@ namespace Twiglet.CS2J.Translator.TypeRep
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)
{
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<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)
@ -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)
@ -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

View File

@ -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<string,CommonTree> myMap = new Dictionary<string,CommonTree>();
@ -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 <op>= rhs
// need to translate to setProp(getProp <op> rhs)
Dictionary<string,CommonTree> rhsMap = new Dictionary<string,CommonTree>();
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 <op>= rhs
// need to translate to setProp(getProp <op> rhs)
Dictionary<string,CommonTree> rhsMap = new Dictionary<string,CommonTree>();
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>();