public void Add()

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);
                        }
                    }
                }
            }
        }