public void GetBaseTypesAndOverridingRelationships()
{
var tree = SyntaxTree.ParseText(@"
using System;
abstract class C1
{
public virtual int F1(short s) { return 0; }
public abstract int P1 { get; set; }
}
abstract class C2 : C1
{
public new virtual int F1(short s) { return 1; }
}
class C3 : C2
{
public override sealed int F1(short s) { return 2; }
public override int P1 { get; set; }
}");
var mscorlib = MetadataReference.CreateAssemblyReference("mscorlib");
var compilation = Compilation.Create("MyCompilation",
options: new CompilationOptions(OutputKind.DynamicallyLinkedLibrary),
syntaxTrees: new[] { tree }, references: new[] { mscorlib });
// Get TypeSymbols for types C1, C2 and C3 above.
TypeSymbol typeC1 = compilation.GetTypeByMetadataName("C1");
TypeSymbol typeC2 = compilation.GetTypeByMetadataName("C2");
TypeSymbol typeC3 = compilation.GetTypeByMetadataName("C3");
TypeSymbol typeObject = compilation.GetSpecialType(SpecialType.System_Object);
Assert.IsTrue(typeC1.IsAbstract);
Assert.IsTrue(typeC2.IsAbstract);
Assert.IsFalse(typeC3.IsAbstract);
// Get TypeSymbols for base types of C1, C2 and C3 above.
Assert.IsTrue(typeC1.BaseType.Equals(typeObject));
Assert.IsTrue(typeC2.BaseType.Equals(typeC1));
Assert.IsTrue(typeC3.BaseType.Equals(typeC2));
// Get MethodSymbols for methods named F1 in types C1, C2 and C3 above.
var methodC1F1 = (MethodSymbol)typeC1.GetMembers("F1").Single();
var methodC2F1 = (MethodSymbol)typeC2.GetMembers("F1").Single();
var methodC3F1 = (MethodSymbol)typeC3.GetMembers("F1").Single();
// Get overriding relationships between above MethodSymbols.
Assert.IsTrue(methodC1F1.IsVirtual);
Assert.IsTrue(methodC2F1.IsVirtual);
Assert.IsFalse(methodC2F1.IsOverride);
Assert.IsTrue(methodC3F1.IsOverride);
Assert.IsTrue(methodC3F1.IsSealed);
Assert.IsTrue(methodC3F1.OverriddenMethod.Equals(methodC2F1));
Assert.IsFalse(methodC3F1.OverriddenMethod.Equals(methodC1F1));
// Get PropertySymbols for properties named P1 in types C1 and C3 above.
var propertyC1P1 = (PropertySymbol)typeC1.GetMembers("P1").Single();
var propertyC3P1 = (PropertySymbol)typeC3.GetMembers("P1").Single();
// Get overriding relationships between above PropertySymbols.
Assert.IsTrue(propertyC1P1.IsAbstract);
Assert.IsFalse(propertyC1P1.IsVirtual);
Assert.IsTrue(propertyC3P1.IsOverride);
Assert.IsTrue(propertyC3P1.OverriddenProperty.Equals(propertyC1P1));
}