private static void TypeDependsClosure(NamedTypeSymbol type, CSharpCompilation currentCompilation, HashSet <Symbol> partialClosure) { if ((object)type == null) { return; } type = type.OriginalDefinition; if (partialClosure.Add(type)) { if (type.IsInterface) { foreach (var bt in type.GetDeclaredInterfaces(null)) { TypeDependsClosure(bt, currentCompilation, partialClosure); } } else { TypeDependsClosure(type.GetDeclaredBaseType(null), currentCompilation, partialClosure); } // containment is interesting only for the current compilation if (currentCompilation != null && type.IsFromCompilation(currentCompilation)) { TypeDependsClosure(type.ContainingType, currentCompilation, partialClosure); } } }
internal sealed override NamedTypeSymbol GetDeclaredBaseType( ConsList <TypeSymbol> basesBeingResolved ) { return(_unbound ? null : Map.SubstituteNamedType(OriginalDefinition.GetDeclaredBaseType(basesBeingResolved))); }
private static TypeSymbol GetNextDeclaredBase(NamedTypeSymbol type, ConsList <Symbol> basesBeingResolved, CSharpCompilation compilation, ref PooledHashSet <NamedTypeSymbol> visited) { // We shouldn't have visited this type earlier. Debug.Assert(visited == null || !visited.Contains(type.OriginalDefinition)); if (basesBeingResolved != null && basesBeingResolved.ContainsReference(type.OriginalDefinition)) { return(null); } if (type.SpecialType == SpecialType.System_Object) { type.SetKnownToHaveNoDeclaredBaseCycles(); return(null); } var nextType = type.GetDeclaredBaseType(basesBeingResolved); // types with no declared bases inherit object's members if ((object)nextType == null) { SetKnownToHaveNoDeclaredBaseCycles(ref visited); return(GetDefaultBaseOrNull(type, compilation)); } var origType = type.OriginalDefinition; if (nextType.KnownToHaveNoDeclaredBaseCycles) { origType.SetKnownToHaveNoDeclaredBaseCycles(); SetKnownToHaveNoDeclaredBaseCycles(ref visited); } else { // start cycle tracking visited = visited ?? PooledHashSet <NamedTypeSymbol> .GetInstance(); visited.Add(origType); if (visited.Contains(nextType.OriginalDefinition)) { return(GetDefaultBaseOrNull(type, compilation)); } } return(nextType); }
private static void ClassDependsClosure(NamedTypeSymbol type, CSharpCompilation currentCompilation, HashSet<Symbol> partialClosure) { if ((object)type == null) { return; } type = type.OriginalDefinition; if (partialClosure.Add(type)) { ClassDependsClosure(type.GetDeclaredBaseType(null), currentCompilation, partialClosure); // containment is interesting only for the current compilation if (currentCompilation != null && type.IsFromCompilation(currentCompilation)) { ClassDependsClosure(type.ContainingType, currentCompilation, partialClosure); } } }
private static TypeSymbol GetNextDeclaredBase(NamedTypeSymbol type, ConsList<Symbol> basesBeingResolved, CSharpCompilation compilation, ref PooledHashSet<NamedTypeSymbol> visited) { // We shouldn't have visited this type earlier. Debug.Assert(visited == null || !visited.Contains(type.OriginalDefinition)); if (basesBeingResolved != null && basesBeingResolved.ContainsReference(type.OriginalDefinition)) { return null; } if (type.SpecialType == SpecialType.System_Object) { type.SetKnownToHaveNoDeclaredBaseCycles(); return null; } var nextType = type.GetDeclaredBaseType(basesBeingResolved); // types with no declared bases inherit object's members if ((object)nextType == null) { SetKnownToHaveNoDeclaredBaseCycles(ref visited); return GetDefaultBaseOrNull(type, compilation); } var origType = type.OriginalDefinition; if (nextType.KnownToHaveNoDeclaredBaseCycles) { origType.SetKnownToHaveNoDeclaredBaseCycles(); SetKnownToHaveNoDeclaredBaseCycles(ref visited); } else { // start cycle tracking visited = visited ?? PooledHashSet<NamedTypeSymbol>.GetInstance(); visited.Add(origType); if (visited.Contains(nextType.OriginalDefinition)) { return GetDefaultBaseOrNull(type, compilation); } } return nextType; }