From a3ff017e9e22dc9f9835bde9f2bd9b41342012c3 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Sun, 12 Feb 2012 16:09:08 +0100 Subject: [PATCH] When a simple-name refers to an instance field in the current class, set TargetResult=new ThisResolveResult(). --- .../Resolver/CSharpResolver.cs | 3 +- .../Resolver/MemberLookup.cs | 4 +++ .../CSharp/Resolver/MemberLookupTests.cs | 36 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs b/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs index 2074b86f4..a31c68bd5 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/CSharpResolver.cs @@ -1395,7 +1395,8 @@ ResolveResult LookInCurrentType(string identifier, IList 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); } diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs b/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs index 3f17a32e3..5907a09e0 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs @@ -571,6 +571,10 @@ ResolveResult CreateResult(ResolveResult targetResolveResult, List 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 { diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs index ac5f5c8b5..9d8cea617 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs @@ -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(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(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(program); + Assert.AreEqual("Test.Field", rr.Member.FullName); + Assert.IsTrue(rr.TargetResult is TypeResolveResult); + } + [Test] public void TestOuterTemplateParameter() {