diff options
author | Daniel Grunwald <daniel@danielgrunwald.de> | 2015-05-30 21:14:49 +0300 |
---|---|---|
committer | Daniel Grunwald <daniel@danielgrunwald.de> | 2015-05-30 21:14:49 +0300 |
commit | 82127d394d94b9e3883a1277a0fd6095c9fb694d (patch) | |
tree | a0c9398553f06c00a1dc528bbf48227c08f658d5 | |
parent | 3af570c381d98b9560f38058c728e0a97d918b07 (diff) |
InheritanceHelper: skip private base members
-rw-r--r-- | ICSharpCode.NRefactory.Tests/TypeSystem/InheritanceHelperTests.cs | 24 | ||||
-rw-r--r-- | ICSharpCode.NRefactory/TypeSystem/InheritanceHelper.cs | 4 |
2 files changed, 28 insertions, 0 deletions
diff --git a/ICSharpCode.NRefactory.Tests/TypeSystem/InheritanceHelperTests.cs b/ICSharpCode.NRefactory.Tests/TypeSystem/InheritanceHelperTests.cs index 36a2cefc..1b7ae191 100644 --- a/ICSharpCode.NRefactory.Tests/TypeSystem/InheritanceHelperTests.cs +++ b/ICSharpCode.NRefactory.Tests/TypeSystem/InheritanceHelperTests.cs @@ -74,5 +74,29 @@ public class Derived : Base { Assert.That(InheritanceHelper.GetDerivedMember(btype.Methods.Single(m => m.Name == name), dtype), Is.EqualTo(dtype.Methods.Single(m => m.Name == name)), name + " does not match"); } } + + [Test] + public void PrivateMemberDoesNotDisruptSearchForBaseMember() + { + string program = @"using System.Collections.Generic; +public class Base { + public virtual int M(); +} +public class Middle : Base { + private int M(); +} +public class Derived : Middle { + public override void M() {} +}"; + + var unresolvedFile = new CSharpParser().Parse(program, "program.cs").ToTypeSystem(); + var compilation = new CSharpProjectContent().AddAssemblyReferences(CecilLoaderTests.Mscorlib).AddOrUpdateFiles(unresolvedFile).CreateCompilation(); + + var dtype = (ITypeDefinition)ReflectionHelper.ParseReflectionName("Derived").Resolve(compilation); + var btype = (ITypeDefinition)ReflectionHelper.ParseReflectionName("Base").Resolve(compilation); + + Assert.AreEqual(btype.Methods.Single(m => m.Name == "M"), + InheritanceHelper.GetBaseMember(dtype.Methods.Single(m => m.Name == "M"))); + } } }
\ No newline at end of file diff --git a/ICSharpCode.NRefactory/TypeSystem/InheritanceHelper.cs b/ICSharpCode.NRefactory/TypeSystem/InheritanceHelper.cs index 0fab9d5a..b4f272a6 100644 --- a/ICSharpCode.NRefactory/TypeSystem/InheritanceHelper.cs +++ b/ICSharpCode.NRefactory/TypeSystem/InheritanceHelper.cs @@ -83,6 +83,10 @@ namespace ICSharpCode.NRefactory.TypeSystem baseMembers = baseType.GetMembers(m => m.Name == member.Name && !m.IsExplicitInterfaceImplementation, GetMemberOptions.IgnoreInheritedMembers); } foreach (IMember baseMember in baseMembers) { + if (baseMember.IsPrivate) { + // skip private base members; + continue; + } if (SignatureComparer.Ordinal.Equals(member, baseMember)) { yield return baseMember.Specialize(substitution); } |