Example #1
0
        /// <summary>
        /// Accumulate diagnostics related to the variance safety of an interface.
        /// </summary>
        internal static void CheckInterfaceVarianceSafety(this NamedTypeSymbol interfaceType, DiagnosticBag diagnostics)
        {
            Debug.Assert((object)interfaceType != null && interfaceType.IsInterface);

            foreach (NamedTypeSymbol baseInterface in interfaceType.InterfacesNoUseSiteDiagnostics())
            {
                IsVarianceUnsafe(
                    baseInterface,
                    requireOutputSafety: true,
                    requireInputSafety: false,
                    context: baseInterface,
                    locationProvider: i => null,
                    locationArg: baseInterface,
                    diagnostics: diagnostics);
            }

            foreach (Symbol member in interfaceType.GetMembersUnordered())
            {
                switch (member.Kind)
                {
                case SymbolKind.Method:
                    if (!member.IsAccessor())
                    {
                        CheckMethodVarianceSafety((MethodSymbol)member, diagnostics);
                    }
                    break;

                case SymbolKind.Property:
                    CheckPropertyVarianceSafety((PropertySymbol)member, diagnostics);
                    break;

                case SymbolKind.Event:
                    CheckEventVarianceSafety((EventSymbol)member, diagnostics);
                    break;
                }
            }
        }
Example #2
0
 internal sealed override ImmutableArray <NamedTypeSymbol> InterfacesNoUseSiteDiagnostics(ConsList <TypeSymbol> basesBeingResolved)
 {
     return(_unbound ? ImmutableArray <NamedTypeSymbol> .Empty : Map.SubstituteNamedTypes(OriginalDefinition.InterfacesNoUseSiteDiagnostics(basesBeingResolved)));
 }