| File: Symbols\MissingCorLibrarySymbol.cs | Web Access |
| Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #nullable disable using System.Diagnostics; using System.Threading; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Text; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Symbols { /// <summary> /// AssemblySymbol to represent missing, for whatever reason, CorLibrary. /// The symbol is created by ReferenceManager on as needed basis and is shared by all compilations /// with missing CorLibraries. /// </summary> internal sealed class MissingCorLibrarySymbol : MissingAssemblySymbol { internal static readonly MissingCorLibrarySymbol Instance = new MissingCorLibrarySymbol(); /// <summary> /// An array of cached Cor types defined in this assembly. /// Lazily filled by GetDeclaredSpecialType method. /// </summary> /// <remarks></remarks> private NamedTypeSymbol[] _lazySpecialTypes; private TypeConversions _lazyTypeConversions; private MissingCorLibrarySymbol() : base(new AssemblyIdentity("<Missing Core Assembly>")) { this.SetCorLibrary(this); } internal override TypeConversions TypeConversions { get { Debug.Assert(this == CorLibrary); if (_lazyTypeConversions is null) { Interlocked.CompareExchange(ref _lazyTypeConversions, new TypeConversions(this), null); } return _lazyTypeConversions; } } /// <summary> /// Lookup declaration for predefined CorLib type in this Assembly. Only should be /// called if it is know that this is the Cor Library (mscorlib). /// </summary> /// <param name="type"></param> internal override NamedTypeSymbol GetDeclaredSpecialType(ExtendedSpecialType type) { #if DEBUG foreach (var module in this.Modules) { Debug.Assert(module.GetReferencedAssemblies().Length == 0); } #endif if (_lazySpecialTypes == null) { Interlocked.CompareExchange(ref _lazySpecialTypes, new NamedTypeSymbol[(int)InternalSpecialType.NextAvailable], null); } if ((object)_lazySpecialTypes[(int)type] == null) { MetadataTypeName emittedFullName = MetadataTypeName.FromFullName(SpecialTypes.GetMetadataName(type), useCLSCompliantNameArityEncoding: true); NamedTypeSymbol corType = new MissingMetadataTypeSymbol.TopLevel(this.moduleSymbol, ref emittedFullName, type); Interlocked.CompareExchange(ref _lazySpecialTypes[(int)type], corType, null); } return _lazySpecialTypes[(int)type]; } } }