Skip to content
This repository has been archived by the owner on Sep 24, 2020. It is now read-only.

Commit

Permalink
When a simple-name refers to an instance field in the current class, …
Browse files Browse the repository at this point in the history
…set TargetResult=new ThisResolveResult().
  • Loading branch information
dgrunwald committed Feb 12, 2012
1 parent 4d20ce3 commit a3ff017
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
3 changes: 2 additions & 1 deletion ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1395,7 +1395,8 @@ ResolveResult LookInCurrentType(string identifier, IList<IType> typeArguments, S

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);
}
Expand Down
4 changes: 4 additions & 0 deletions ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -571,6 +571,10 @@ ResolveResult CreateResult(ResolveResult targetResolveResult, List<LookupGroup>
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 {
Expand Down
36 changes: 36 additions & 0 deletions ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
{
Expand Down

0 comments on commit a3ff017

Please sign in to comment.