Browse Source

When a simple-name refers to an instance field in the current class, set TargetResult=new ThisResolveResult().

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
a3ff017e9e
  1. 3
      ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs
  2. 4
      ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs
  3. 36
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

3
ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs

@ -1395,7 +1395,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -1395,7 +1395,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
ResolveResult r;
if (lookupMode == SimpleNameLookupMode.Expression || lookupMode == SimpleNameLookupMode.InvocationTarget) {
r = lookup.Lookup(new TypeResolveResult(t), identifier, typeArguments, lookupMode == SimpleNameLookupMode.InvocationTarget);
var targetResolveResult = (t == this.CurrentTypeDefinition ? ResolveThisReference() : new TypeResolveResult(t));
r = lookup.Lookup(targetResolveResult, identifier, typeArguments, lookupMode == SimpleNameLookupMode.InvocationTarget);
} else {
r = lookup.LookupType(t, identifier, typeArguments, parameterizeResultType);
}

4
ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs

@ -571,6 +571,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver @@ -571,6 +571,10 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
return new TypeResolveResult(resultGroup.NestedTypes[0]);
}
if (resultGroup.NonMethod.IsStatic && targetResolveResult is ThisResolveResult) {
targetResolveResult = new TypeResolveResult(targetResolveResult.Type);
}
if (lookupGroups.Count > 1) {
return new AmbiguousMemberResolveResult(targetResolveResult, resultGroup.NonMethod);
} else {

36
ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

@ -127,6 +127,42 @@ class Derived : Base { @@ -127,6 +127,42 @@ class Derived : Base {
Assert.AreEqual("``0", baseGroup[0].Parameters[0].Type.ReflectionName);
}
[Test]
public void InstanceFieldImplicitThis()
{
string program = @"class Test {
public int Field;
int M() { return $Field$; }
}";
var rr = Resolve<MemberResolveResult>(program);
Assert.AreEqual("Test.Field", rr.Member.FullName);
Assert.IsTrue(rr.TargetResult is ThisResolveResult);
}
[Test]
public void InstanceFieldExplicitThis()
{
string program = @"class Test {
public int Field;
int M() { return $this.Field$; }
}";
var rr = Resolve<MemberResolveResult>(program);
Assert.AreEqual("Test.Field", rr.Member.FullName);
Assert.IsTrue(rr.TargetResult is ThisResolveResult);
}
[Test]
public void StaticField()
{
string program = @"class Test {
public static int Field;
int M() { return $Field$; }
}";
var rr = Resolve<MemberResolveResult>(program);
Assert.AreEqual("Test.Field", rr.Member.FullName);
Assert.IsTrue(rr.TargetResult is TypeResolveResult);
}
[Test]
public void TestOuterTemplateParameter()
{

Loading…
Cancel
Save