Browse Source

Fixed accessing protected members through type parameters.

newNRvisualizers
Daniel Grunwald 14 years ago
parent
commit
f3541d4747
  1. 2
      ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs
  2. 30
      ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs

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

@ -65,6 +65,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
/// </summary> /// </summary>
public bool IsProtectedAccessAllowed(IType targetType) public bool IsProtectedAccessAllowed(IType targetType)
{ {
if (targetType.Kind == TypeKind.TypeParameter)
targetType = ((ITypeParameter)targetType).EffectiveBaseClass;
ITypeDefinition typeDef = targetType.GetDefinition(); ITypeDefinition typeDef = targetType.GetDefinition();
if (typeDef == null) if (typeDef == null)
return false; return false;

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

@ -313,5 +313,35 @@ class Derived : Base {
Assert.IsFalse(rr.IsError); Assert.IsFalse(rr.IsError);
Assert.AreEqual("Base.X", rr.Member.FullName); Assert.AreEqual("Base.X", rr.Member.FullName);
} }
[Test]
public void ProtectedMemberViaTypeParameter()
{
string program = @"using System;
class Base
{
protected void Test() {}
public void Test(int a = 0) {}
}
class Derived<T> : Base where T : Derived<T>
{
void M(Derived<T> a, Base b, T c) {
a.Test(); // calls Test()
b.Test(); // calls Test(int)
c.Test(); // calls Test()
}
}";
var rr = Resolve<CSharpInvocationResolveResult>(program.Replace("a.Test()", "$a.Test()$"));
Assert.IsFalse(rr.IsError);
Assert.AreEqual(0, rr.Member.Parameters.Count);
rr = Resolve<CSharpInvocationResolveResult>(program.Replace("b.Test()", "$b.Test()$"));
Assert.IsFalse(rr.IsError);
Assert.AreEqual(1, rr.Member.Parameters.Count);
rr = Resolve<CSharpInvocationResolveResult>(program.Replace("c.Test()", "$c.Test()$"));
Assert.IsFalse(rr.IsError);
Assert.AreEqual(0, rr.Member.Parameters.Count);
}
} }
} }

Loading…
Cancel
Save