in DataExtraction/SourceGraphExtractionUtils/TypeHierarchy.cs [22:86]
public void Add(ITypeSymbol type)
{
lock (_lock)
{
if (type.IsReferenceType)
{
// This is definitely an object
AddAsObject(type);
}
if (type is IArrayTypeSymbol)
{
var arrayTypeSymbol = type as IArrayTypeSymbol;
Add(arrayTypeSymbol.ElementType);
}
if (type is ITypeParameterSymbol)
{
var typeParam = type as ITypeParameterSymbol;
if (typeParam.Variance == VarianceKind.In)
{
// this generic will accept all supertypes, not sure how to use.
}
else if (typeParam.Variance == VarianceKind.Out)
{
// Probably nothing should happen here.
}
if (typeParam.HasReferenceTypeConstraint)
{
AddAsObject(type);
}
else
{
// Add as a special "TypeParam" top type
AddAsTypeParam(type);
}
}
if (type.BaseType != null)
{
var addBaseType = Add(type, type.BaseType);
if (addBaseType) Add(type.BaseType);
}
foreach (var implementedIface in type.Interfaces)
{
var addIface = Add(type, implementedIface);
if (addIface) Add(implementedIface);
}
if (type is INamedTypeSymbol)
{
var namedType = type as INamedTypeSymbol;
if (namedType.IsGenericType)
{
if (namedType.ConstructedFrom != type)
{
var addErasure = Add(type, namedType.ConstructedFrom);
if (addErasure) Add(namedType.ConstructedFrom);
}
}
}
}
}