internal NamedTypeSymbol GetTopLevelTypeByMetadataName( ref MetadataTypeName metadataName, AssemblyIdentity assemblyOpt, bool includeReferences, bool isWellKnownType, out (AssemblySymbol, AssemblySymbol) conflicts, DiagnosticBag warnings = null, bool ignoreCorLibraryDuplicatedTypes = false) { conflicts = default; NamedTypeSymbol result; // First try this assembly result = GetTopLevelTypeByMetadataName(this, ref metadataName, assemblyOpt); if (isWellKnownType && !IsValidWellKnownType(result)) { result = null; } // ignore any types of the same name that might be in referenced assemblies (prefer the current assembly): if ((object)result != null || !includeReferences) { return(result); } Debug.Assert(this is SourceAssemblySymbol, "Never include references for a non-source assembly, because they don't know about aliases."); var assemblies = ArrayBuilder <AssemblySymbol> .GetInstance(); // ignore reference aliases if searching for a type from a specific assembly: if (assemblyOpt != null) { assemblies.AddRange(DeclaringCompilation.GetBoundReferenceManager().ReferencedAssemblies); } else { DeclaringCompilation.GetUnaliasedReferencedAssemblies(assemblies); } // Lookup in references foreach (var assembly in assemblies) { Debug.Assert(!(this is SourceAssemblySymbol && assembly.IsMissing)); // Non-source assemblies can have missing references NamedTypeSymbol candidate = GetTopLevelTypeByMetadataName(assembly, ref metadataName, assemblyOpt); if (isWellKnownType && !IsValidWellKnownType(candidate)) { candidate = null; } if ((object)candidate == null) { continue; } if (candidate.IsHiddenByCodeAnalysisEmbeddedAttribute()) { continue; } Debug.Assert(candidate != result); if ((object)result != null) { // duplicate if (ignoreCorLibraryDuplicatedTypes) { if (IsInCorLib(candidate)) { // ignore candidate continue; } if (IsInCorLib(result)) { // drop previous result result = candidate; continue; } } if (warnings == null) { conflicts = (result.ContainingAssembly, candidate.ContainingAssembly); result = null; } else { // The predefined type '{0}' is defined in multiple assemblies in the global alias; using definition from '{1}' warnings.Add(ErrorCode.WRN_MultiplePredefTypes, NoLocation.Singleton, result, result.ContainingAssembly); } break; } result = candidate; } assemblies.Free(); return(result); }