File: Symbols\MissingAssemblySymbol.cs
Web Access
Project: src\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;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Collections.ObjectModel;
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>
    /// A <see cref="MissingAssemblySymbol"/> is a special kind of <see cref="AssemblySymbol"/> that represents
    /// an assembly that couldn't be found.
    /// </summary>
    internal class MissingAssemblySymbol : AssemblySymbol
    {
        protected readonly AssemblyIdentity identity;
        protected readonly MissingModuleSymbol moduleSymbol;
 
        private ImmutableArray<ModuleSymbol> _lazyModules;
 
        public MissingAssemblySymbol(AssemblyIdentity identity)
        {
            Debug.Assert(identity != null);
            this.identity = identity;
            moduleSymbol = new MissingModuleSymbol(this, 0);
        }
 
        internal sealed override bool IsMissing
        {
            get
            {
                return true;
            }
        }
 
        internal override bool IsLinked
        {
            get
            {
                return false;
            }
        }
 
        internal override Symbol GetDeclaredSpecialTypeMember(SpecialMember member)
        {
            return null;
        }
 
        public override AssemblyIdentity Identity
        {
            get
            {
                return identity;
            }
        }
 
        public override Version AssemblyVersionPattern => null;
 
        internal override ImmutableArray<byte> PublicKey
        {
            get { return Identity.PublicKey; }
        }
 
        public override ImmutableArray<ModuleSymbol> Modules
        {
            get
            {
                if (_lazyModules.IsDefault)
                {
                    _lazyModules = ImmutableArray.Create<ModuleSymbol>(moduleSymbol);
                }
 
                return _lazyModules;
            }
        }
 
        internal override bool HasImportedFromTypeLibAttribute => false;
 
        internal override bool HasPrimaryInteropAssemblyAttribute => false;
 
        public override int GetHashCode()
        {
            return identity.GetHashCode();
        }
 
        public override bool Equals(Symbol obj, TypeCompareKind compareKind)
        {
            return Equals(obj as MissingAssemblySymbol);
        }
 
        public bool Equals(MissingAssemblySymbol other)
        {
            if ((object)other == null)
            {
                return false;
            }
 
            if (ReferenceEquals(this, other))
            {
                return true;
            }
 
            return identity.Equals(other.Identity);
        }
 
        public override ImmutableArray<Location> Locations
        {
            get
            {
                return ImmutableArray<Location>.Empty;
            }
        }
 
        internal override void SetLinkedReferencedAssemblies(ImmutableArray<AssemblySymbol> assemblies)
        {
            throw ExceptionUtilities.Unreachable();
        }
 
        internal override ImmutableArray<AssemblySymbol> GetLinkedReferencedAssemblies()
        {
            return ImmutableArray<AssemblySymbol>.Empty;
        }
 
        internal override void SetNoPiaResolutionAssemblies(ImmutableArray<AssemblySymbol> assemblies)
        {
            throw ExceptionUtilities.Unreachable();
        }
 
        internal override ImmutableArray<AssemblySymbol> GetNoPiaResolutionAssemblies()
        {
            return ImmutableArray<AssemblySymbol>.Empty;
        }
 
        public sealed override NamespaceSymbol GlobalNamespace
        {
            get
            {
                return this.moduleSymbol.GlobalNamespace;
            }
        }
 
        public override ICollection<string> TypeNames
        {
            get
            {
                return SpecializedCollections.EmptyCollection<string>();
            }
        }
 
        public override ICollection<string> NamespaceNames
        {
            get
            {
                return SpecializedCollections.EmptyCollection<string>();
            }
        }
 
#nullable enable
 
        internal override NamedTypeSymbol LookupDeclaredOrForwardedTopLevelMetadataType(ref MetadataTypeName emittedName, ConsList<AssemblySymbol>? visitedAssemblies)
        {
            return new MissingMetadataTypeSymbol.TopLevel(this.moduleSymbol, ref emittedName);
        }
 
        internal override NamedTypeSymbol? LookupDeclaredTopLevelMetadataType(ref MetadataTypeName emittedName)
        {
            return null;
        }
 
#nullable disable
 
        internal override NamedTypeSymbol GetDeclaredSpecialType(ExtendedSpecialType type)
        {
            throw ExceptionUtilities.Unreachable();
        }
 
        internal override bool AreInternalsVisibleToThisAssembly(AssemblySymbol other)
        {
            return false;
        }
 
        internal override IEnumerable<ImmutableArray<byte>> GetInternalsVisibleToPublicKeys(string simpleName)
        {
            return SpecializedCollections.EmptyEnumerable<ImmutableArray<byte>>();
        }
 
        internal override IEnumerable<string> GetInternalsVisibleToAssemblyNames()
        {
            return SpecializedCollections.EmptyEnumerable<string>();
        }
 
        public override bool MightContainExtensionMethods
        {
            get
            {
                return false;
            }
        }
 
        internal override TypeConversions TypeConversions => CorLibrary.TypeConversions;
 
        public override AssemblyMetadata GetMetadata() => null;
 
        internal sealed override IEnumerable<NamedTypeSymbol> GetAllTopLevelForwardedTypes()
        {
            return SpecializedCollections.EmptyEnumerable<NamedTypeSymbol>();
        }
 
#nullable enable
        internal sealed override ObsoleteAttributeData? ObsoleteAttributeData => null;
 
        internal override bool GetGuidString(out string? guidString)
        {
            guidString = null;
            return false;
        }
    }
}