// Is the named type "type accessible from within "within", which must be a named type or an // assembly. private static bool IsNamedTypeAccessible(NamedTypeSymbol type, Symbol within, ref HashSet<DiagnosticInfo> useSiteDiagnostics, ConsList<Symbol> basesBeingResolved = null) { Debug.Assert(within is NamedTypeSymbol || within is AssemblySymbol); Debug.Assert((object)type != null); var compilation = within.DeclaringCompilation; bool unused; if (!type.IsDefinition) { // All type argument must be accessible. var typeArgs = type.TypeArgumentsWithDefinitionUseSiteDiagnostics(ref useSiteDiagnostics); for (int i = 0; i < typeArgs.Length; ++i) { // type parameters are always accessible, so don't check those (so common it's // worth optimizing this). if (typeArgs[i].Kind != SymbolKind.TypeParameter && !IsSymbolAccessibleCore(typeArgs[i], within, null, out unused, compilation, ref useSiteDiagnostics)) { return false; } } } var containingType = type.ContainingType; return (object)containingType == null ? IsNonNestedTypeAccessible(type.ContainingAssembly, type.DeclaredAccessibility, within) : IsMemberAccessible(containingType, type.DeclaredAccessibility, within, null, out unused, compilation, ref useSiteDiagnostics, basesBeingResolved); }