コード例 #1
0
        private ImmutableArray <NamedTypeSymbol> MakeAcyclicInterfaces(ConsList <TypeSymbol> basesBeingResolved, DiagnosticBag diagnostics)
        {
            var typeKind = this.TypeKind;

            if (typeKind == TypeKind.Enum)
            {
                Debug.Assert(GetDeclaredInterfaces(basesBeingResolved: null).IsEmpty, "Computation skipped for enums");
                return(ImmutableArray <NamedTypeSymbol> .Empty);
            }

            var  declaredInterfaces = GetDeclaredInterfaces(basesBeingResolved: basesBeingResolved);
            bool isClass            = (typeKind == TypeKind.Class);

            ArrayBuilder <NamedTypeSymbol> result = isClass ? null : ArrayBuilder <NamedTypeSymbol> .GetInstance();

            foreach (var t in declaredInterfaces)
            {
                if (!isClass)
                {
                    if (BaseTypeAnalysis.InterfaceDependsOn(depends: t, on: this))
                    {
                        result.Add(new ExtendedErrorTypeSymbol(t, LookupResultKind.NotReferencable,
                                                               diagnostics.Add(ErrorCode.ERR_CycleInInterfaceInheritance, Locations[0], this, t)));
                        continue;
                    }
                    else
                    {
                        result.Add(t);
                    }
                }

                HashSet <DiagnosticInfo> useSiteDiagnostics = null;

                if (t.DeclaringCompilation != this.DeclaringCompilation)
                {
                    t.AddUseSiteDiagnostics(ref useSiteDiagnostics);

                    foreach (var @interface in t.AllInterfacesNoUseSiteDiagnostics)
                    {
                        if (@interface.DeclaringCompilation != this.DeclaringCompilation)
                        {
                            @interface.AddUseSiteDiagnostics(ref useSiteDiagnostics);
                        }
                    }
                }

                if (!useSiteDiagnostics.IsNullOrEmpty())
                {
                    diagnostics.Add(Locations[0], useSiteDiagnostics);
                }
            }

            return(isClass ? declaredInterfaces : result.ToImmutableAndFree());
        }
コード例 #2
0
        private NamedTypeSymbol MakeAcyclicBaseType(DiagnosticBag diagnostics)
        {
            var             typeKind    = this.TypeKind;
            var             compilation = this.DeclaringCompilation;
            NamedTypeSymbol declaredBase;

            if (typeKind == TypeKind.Enum)
            {
                Debug.Assert((object)GetDeclaredBaseType(basesBeingResolved: null) == null, "Computation skipped for enums");
                declaredBase = compilation.GetSpecialType(SpecialType.System_Enum);
            }
            else
            {
                declaredBase = GetDeclaredBaseType(basesBeingResolved: null);
            }

            if ((object)declaredBase == null)
            {
                switch (typeKind)
                {
                case TypeKind.Class:

                    if (this.SpecialType == SpecialType.System_Object)
                    {
                        return(null);
                    }

                    declaredBase = compilation.GetSpecialType(SpecialType.System_Object);
                    break;

                case TypeKind.Struct:
                case TypeKind.Interface:
                    return(null);

                case TypeKind.Delegate:
                    declaredBase = compilation.GetSpecialType(SpecialType.System_MulticastDelegate);
                    break;

                default:
                    throw ExceptionUtilities.UnexpectedValue(typeKind);
                }
            }

            if (BaseTypeAnalysis.ClassDependsOn(declaredBase, this))
            {
                return(new ExtendedErrorTypeSymbol(declaredBase, LookupResultKind.NotReferencable,
                                                   diagnostics.Add(ErrorCode.ERR_CircularBase, Locations[0], declaredBase, this)));
            }

            this.SetKnownToHaveNoDeclaredBaseCycles();

            HashSet <DiagnosticInfo> useSiteDiagnostics = null;
            NamedTypeSymbol          current            = declaredBase;

            do
            {
                if (current.DeclaringCompilation == this.DeclaringCompilation)
                {
                    break;
                }

                current.AddUseSiteDiagnostics(ref useSiteDiagnostics);
                current = current.BaseTypeNoUseSiteDiagnostics;
            }while ((object)current != null);

            if (!useSiteDiagnostics.IsNullOrEmpty())
            {
                diagnostics.Add(FindBaseRefSyntax(declaredBase) ?? Locations[0], useSiteDiagnostics);
            }

            return(declaredBase);
        }