From f3541d4747fa4a20b315b7dc4937e643504d5a48 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Tue, 14 Feb 2012 13:46:21 +0100 Subject: [PATCH] Fixed accessing protected members through type parameters. --- .../Resolver/MemberLookup.cs | 2 ++ .../CSharp/Resolver/MemberLookupTests.cs | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs b/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs index 5907a09e06..8332963716 100644 --- a/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs +++ b/ICSharpCode.NRefactory.CSharp/Resolver/MemberLookup.cs @@ -65,6 +65,8 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver /// public bool IsProtectedAccessAllowed(IType targetType) { + if (targetType.Kind == TypeKind.TypeParameter) + targetType = ((ITypeParameter)targetType).EffectiveBaseClass; ITypeDefinition typeDef = targetType.GetDefinition(); if (typeDef == null) return false; diff --git a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs index 9d8cea6172..2bc9f0fbf3 100644 --- a/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs +++ b/ICSharpCode.NRefactory.Tests/CSharp/Resolver/MemberLookupTests.cs @@ -313,5 +313,35 @@ class Derived : Base { Assert.IsFalse(rr.IsError); 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 : Base where T : Derived +{ + void M(Derived a, Base b, T c) { + a.Test(); // calls Test() + b.Test(); // calls Test(int) + c.Test(); // calls Test() + } +}"; + var rr = Resolve(program.Replace("a.Test()", "$a.Test()$")); + Assert.IsFalse(rr.IsError); + Assert.AreEqual(0, rr.Member.Parameters.Count); + + rr = Resolve(program.Replace("b.Test()", "$b.Test()$")); + Assert.IsFalse(rr.IsError); + Assert.AreEqual(1, rr.Member.Parameters.Count); + + rr = Resolve(program.Replace("c.Test()", "$c.Test()$")); + Assert.IsFalse(rr.IsError); + Assert.AreEqual(0, rr.Member.Parameters.Count); + } } }