public void TestIndirectOverriding() { var text = @" class Base { public virtual int P { get; set; } } class Derived1 : Base { public override int P { get { return 1; } } } class Derived2 : Derived1 { public override int P { set { } } } "; var compilation = CreateCompilation(text); var global = compilation.GlobalNamespace; var baseClass = global.GetMember <NamedTypeSymbol>("Base"); var baseProperty = baseClass.GetMember <PropertySymbol>("P"); var baseGetter = baseProperty.GetMethod; var baseSetter = baseProperty.SetMethod; var derived1Class = global.GetMember <NamedTypeSymbol>("Derived1"); var derived1Property = derived1Class.GetMember <PropertySymbol>("P"); var derived1Getter = derived1Property.GetMethod; Assert.Null(derived1Property.SetMethod); var derived2Class = global.GetMember <NamedTypeSymbol>("Derived2"); var derived2Property = derived2Class.GetMember <PropertySymbol>("P"); Assert.Null(derived2Property.GetMethod); var derived2Setter = derived2Property.SetMethod; OverriddenOrHiddenMembersResult derived1PropertyOverriddenOrHidden = derived1Property.OverriddenOrHiddenMembers; Assert.Equal(0, derived1PropertyOverriddenOrHidden.HiddenMembers.Length); Assert.Same(baseProperty, derived1PropertyOverriddenOrHidden.OverriddenMembers.Single()); OverriddenOrHiddenMembersResult derived1GetterOverriddenOrHidden = derived1Getter.OverriddenOrHiddenMembers; Assert.Equal(0, derived1GetterOverriddenOrHidden.HiddenMembers.Length); Assert.Same(baseGetter, derived1GetterOverriddenOrHidden.OverriddenMembers.Single()); OverriddenOrHiddenMembersResult derived2PropertyOverriddenOrHidden = derived2Property.OverriddenOrHiddenMembers; Assert.Equal(0, derived2PropertyOverriddenOrHidden.HiddenMembers.Length); Assert.Same(derived1Property, derived2PropertyOverriddenOrHidden.OverriddenMembers.Single()); OverriddenOrHiddenMembersResult derived2SetterOverriddenOrHidden = derived2Setter.OverriddenOrHiddenMembers; Assert.Equal(0, derived2SetterOverriddenOrHidden.HiddenMembers.Length); Assert.Same(baseSetter, derived2SetterOverriddenOrHidden.OverriddenMembers.Single()); }
public void TestBasicOverriding() { var text = @" class Base { public virtual int P { get; set; } } class Derived : Base { public override int P { get; set; } } "; var compilation = CreateCompilationWithMscorlib(text); var global = compilation.GlobalNamespace; var baseClass = global.GetMember <NamedTypeSymbol>("Base"); var baseProperty = baseClass.GetMember <PropertySymbol>("P"); var baseGetter = baseProperty.GetMethod; var baseSetter = baseProperty.SetMethod; var derivedClass = global.GetMember <NamedTypeSymbol>("Derived"); var derivedProperty = derivedClass.GetMember <PropertySymbol>("P"); var derivedGetter = derivedProperty.GetMethod; var derivedSetter = derivedProperty.SetMethod; Assert.Same(OverriddenOrHiddenMembersResult.Empty, baseProperty.OverriddenOrHiddenMembers); Assert.Null(baseProperty.OverriddenProperty); Assert.Same(OverriddenOrHiddenMembersResult.Empty, baseGetter.OverriddenOrHiddenMembers); Assert.Null(baseGetter.OverriddenMethod); Assert.Same(OverriddenOrHiddenMembersResult.Empty, baseSetter.OverriddenOrHiddenMembers); Assert.Null(baseSetter.OverriddenMethod); OverriddenOrHiddenMembersResult derivedPropertyOverriddenOrHidden = derivedProperty.OverriddenOrHiddenMembers; Assert.Equal(0, derivedPropertyOverriddenOrHidden.HiddenMembers.Length); Assert.Same(baseProperty, derivedPropertyOverriddenOrHidden.OverriddenMembers.Single()); Assert.Same(baseProperty, derivedPropertyOverriddenOrHidden.RuntimeOverriddenMembers.Single()); Assert.Same(baseProperty, derivedProperty.OverriddenProperty); OverriddenOrHiddenMembersResult derivedGetterOverriddenOrHidden = derivedGetter.OverriddenOrHiddenMembers; Assert.Equal(0, derivedGetterOverriddenOrHidden.HiddenMembers.Length); Assert.Same(baseGetter, derivedGetterOverriddenOrHidden.OverriddenMembers.Single()); Assert.Same(baseGetter, derivedGetterOverriddenOrHidden.RuntimeOverriddenMembers.Single()); Assert.Same(baseGetter, derivedGetter.OverriddenMethod); OverriddenOrHiddenMembersResult derivedSetterOverriddenOrHidden = derivedSetter.OverriddenOrHiddenMembers; Assert.Equal(0, derivedSetterOverriddenOrHidden.HiddenMembers.Length); Assert.Same(baseSetter, derivedSetterOverriddenOrHidden.OverriddenMembers.Single()); Assert.Same(baseSetter, derivedSetterOverriddenOrHidden.RuntimeOverriddenMembers.Single()); Assert.Same(baseSetter, derivedSetter.OverriddenMethod); }
public void TestIndirectHiding() { var text1 = @"public class Base { public virtual int P { get; set; } } "; var text2 = @"public class Derived1 : Base { public new virtual int P { get { return 1; } } } "; var text3 = @"class Derived2 : Derived1 { public override int P { set { } } } "; var comp1 = CreateCompilation(text1); var comp1ref = new CSharpCompilationReference(comp1); var refs = new System.Collections.Generic.List <MetadataReference>() { comp1ref }; var comp2 = CreateCompilation(text2, references: refs, assemblyName: "Test2"); var comp2ref = new CSharpCompilationReference(comp2); refs.Add(comp2ref); var compilation = CreateCompilation(text3, refs, assemblyName: "Test3"); var global = compilation.GlobalNamespace; var baseClass = global.GetMember <NamedTypeSymbol>("Base"); var baseProperty = baseClass.GetMember <PropertySymbol>("P"); var baseGetter = baseProperty.GetMethod; var derived1Class = global.GetMember <NamedTypeSymbol>("Derived1"); var derived1Property = derived1Class.GetMember <PropertySymbol>("P"); var derived1Getter = derived1Property.GetMethod; Assert.Null(derived1Property.SetMethod); var derived2Class = global.GetMember <NamedTypeSymbol>("Derived2"); var derived2Property = derived2Class.GetMember <PropertySymbol>("P"); Assert.Null(derived2Property.GetMethod); var derived2Setter = derived2Property.SetMethod; OverriddenOrHiddenMembersResult derived1PropertyOverriddenOrHidden = derived1Property.OverriddenOrHiddenMembers; Assert.Equal(0, derived1PropertyOverriddenOrHidden.OverriddenMembers.Length); Assert.Same(baseProperty, derived1PropertyOverriddenOrHidden.HiddenMembers.Single()); OverriddenOrHiddenMembersResult derived1GetterOverriddenOrHidden = derived1Getter.OverriddenOrHiddenMembers; Assert.Equal(0, derived1GetterOverriddenOrHidden.OverriddenMembers.Length); Assert.Same(baseGetter, derived1GetterOverriddenOrHidden.HiddenMembers.Single()); OverriddenOrHiddenMembersResult derived2PropertyOverriddenOrHidden = derived2Property.OverriddenOrHiddenMembers; Assert.Equal(0, derived2PropertyOverriddenOrHidden.HiddenMembers.Length); Assert.Same(derived1Property, derived2PropertyOverriddenOrHidden.OverriddenMembers.Single()); OverriddenOrHiddenMembersResult derived2SetterOverriddenOrHidden = derived2Setter.OverriddenOrHiddenMembers; Assert.Equal(0, derived2SetterOverriddenOrHidden.HiddenMembers.Length); Assert.Equal(0, derived2SetterOverriddenOrHidden.OverriddenMembers.Length); }