File: MetadataAsSource\AbstractMetadataAsSourceService.WrappedNamedTypeSymbol.cs
Web Access
Project: src\src\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj (Microsoft.CodeAnalysis.Features)
// 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.Linq;
using Microsoft.CodeAnalysis.DocumentationComments;
using Roslyn.Utilities;
 
namespace Microsoft.CodeAnalysis.MetadataAsSource;
 
internal abstract partial class AbstractMetadataAsSourceService
{
    private sealed class WrappedNamedTypeSymbol : AbstractWrappedNamespaceOrTypeSymbol, INamedTypeSymbol
    {
        private readonly INamedTypeSymbol _symbol;
        private readonly ImmutableArray<ISymbol> _members;
 
        public WrappedNamedTypeSymbol(INamedTypeSymbol symbol, bool canImplementImplicitly, IDocumentationCommentFormattingService docCommentFormattingService)
            : base(symbol, canImplementImplicitly, docCommentFormattingService)
        {
            _symbol = symbol;
 
            var allMembers = _symbol.GetMembers();
            var filteredMembers = from m in allMembers
                                  where !m.HasUnsupportedMetadata
                                  where m.DeclaredAccessibility is Accessibility.Public or
                                        Accessibility.Protected or
                                        Accessibility.ProtectedOrInternal
                                  where m.Kind is SymbolKind.Event or
                                        SymbolKind.Field or
                                        SymbolKind.Method or
                                        SymbolKind.NamedType or
                                        SymbolKind.Property
                                  select WrapMember(m, canImplementImplicitly, docCommentFormattingService);
 
            _members = ImmutableArray.CreateRange(filteredMembers);
        }
 
        private static ISymbol WrapMember(ISymbol m, bool canImplementImplicitly, IDocumentationCommentFormattingService docCommentFormattingService)
            => m.Kind switch
            {
                SymbolKind.Field => new WrappedFieldSymbol((IFieldSymbol)m, docCommentFormattingService),
                SymbolKind.Event => new WrappedEventSymbol((IEventSymbol)m, canImplementImplicitly, docCommentFormattingService),
                SymbolKind.Method => new WrappedMethodSymbol((IMethodSymbol)m, canImplementImplicitly, docCommentFormattingService),
                SymbolKind.NamedType => new WrappedNamedTypeSymbol((INamedTypeSymbol)m, canImplementImplicitly, docCommentFormattingService),
                SymbolKind.Property => new WrappedPropertySymbol((IPropertySymbol)m, canImplementImplicitly, docCommentFormattingService),
                _ => throw ExceptionUtilities.UnexpectedValue(m.Kind),
            };
 
        public bool IsAnonymousType => _symbol.IsAnonymousType;
        public bool IsComImport => _symbol.IsComImport;
        public bool IsGenericType => _symbol.IsGenericType;
        public bool IsImplicitClass => _symbol.IsImplicitClass;
        public bool IsReferenceType => _symbol.IsReferenceType;
        public bool IsScriptClass => _symbol.IsScriptClass;
        public bool IsTupleType => _symbol.IsTupleType;
        public bool IsUnboundGenericType => _symbol.IsUnboundGenericType;
        public bool IsValueType => _symbol.IsValueType;
        public bool MightContainExtensionMethods => _symbol.MightContainExtensionMethods;
 
        public int Arity => _symbol.Arity;
 
        public TypeKind TypeKind => _symbol.TypeKind;
        public SpecialType SpecialType => _symbol.SpecialType;
        public ISymbol AssociatedSymbol => _symbol.AssociatedSymbol;
        public IMethodSymbol DelegateInvokeMethod => _symbol.DelegateInvokeMethod;
 
        public INamedTypeSymbol EnumUnderlyingType => _symbol.EnumUnderlyingType;
        public INamedTypeSymbol ConstructedFrom => _symbol.ConstructedFrom;
        public INamedTypeSymbol BaseType => _symbol.BaseType;
        public INamedTypeSymbol TupleUnderlyingType => _symbol.TupleUnderlyingType;
 
        public ImmutableArray<ITypeParameterSymbol> TypeParameters => _symbol.TypeParameters;
        public ImmutableArray<ITypeSymbol> TypeArguments => _symbol.TypeArguments;
        public ImmutableArray<NullableAnnotation> TypeArgumentNullableAnnotations => _symbol.TypeArgumentNullableAnnotations;
        public ImmutableArray<IMethodSymbol> InstanceConstructors => _symbol.InstanceConstructors;
        public ImmutableArray<IMethodSymbol> StaticConstructors => _symbol.StaticConstructors;
        public ImmutableArray<IMethodSymbol> Constructors => _symbol.Constructors;
        public ImmutableArray<INamedTypeSymbol> Interfaces => _symbol.Interfaces;
        public ImmutableArray<INamedTypeSymbol> AllInterfaces => _symbol.AllInterfaces;
        public ImmutableArray<IFieldSymbol> TupleElements => _symbol.TupleElements;
 
        public ImmutableArray<CustomModifier> GetTypeArgumentCustomModifiers(int ordinal)
            => _symbol.GetTypeArgumentCustomModifiers(ordinal);
 
        public INamedTypeSymbol Construct(params ITypeSymbol[] typeArguments)
            => _symbol.Construct(typeArguments);
 
        public INamedTypeSymbol Construct(ImmutableArray<ITypeSymbol> typeArguments, ImmutableArray<NullableAnnotation> typeArgumentNullableAnnotations)
            => _symbol.Construct(typeArguments, typeArgumentNullableAnnotations);
 
        public INamedTypeSymbol ConstructUnboundGenericType()
            => _symbol.ConstructUnboundGenericType();
 
        public ISymbol FindImplementationForInterfaceMember(ISymbol interfaceMember)
            => _symbol.FindImplementationForInterfaceMember(interfaceMember);
 
        public override ImmutableArray<ISymbol> GetMembers()
            => _members;
 
        public IEnumerable<string> MemberNames => throw new NotImplementedException();
 
        public override ImmutableArray<ISymbol> GetMembers(string name)
            => throw new NotImplementedException();
 
        public override ImmutableArray<INamedTypeSymbol> GetTypeMembers()
            => throw new NotImplementedException();
 
        public override ImmutableArray<INamedTypeSymbol> GetTypeMembers(string name)
            => throw new NotImplementedException();
 
        public override ImmutableArray<INamedTypeSymbol> GetTypeMembers(string name, int arity)
            => throw new NotImplementedException();
 
        public string ToDisplayString(NullableFlowState topLevelNullability, SymbolDisplayFormat format = null)
            => throw new NotImplementedException();
 
        public ImmutableArray<SymbolDisplayPart> ToDisplayParts(NullableFlowState topLevelNullability, SymbolDisplayFormat format = null)
            => throw new NotImplementedException();
 
        public string ToMinimalDisplayString(SemanticModel semanticModel, NullableFlowState topLevelNullability, int position, SymbolDisplayFormat format = null)
            => throw new NotImplementedException();
 
        public ImmutableArray<SymbolDisplayPart> ToMinimalDisplayParts(SemanticModel semanticModel, NullableFlowState topLevelNullability, int position, SymbolDisplayFormat format = null)
            => throw new NotImplementedException();
 
        ITypeSymbol ITypeSymbol.OriginalDefinition => _symbol.OriginalDefinition;
        public new INamedTypeSymbol OriginalDefinition => this;
 
        public bool IsSerializable => throw new NotImplementedException();
 
        public bool IsRefLikeType => _symbol.IsRefLikeType;
 
        public bool IsUnmanagedType => throw new NotImplementedException();
 
        public bool IsReadOnly => _symbol.IsReadOnly;
 
        public bool IsRecord => _symbol.IsRecord;
 
        public bool IsNativeIntegerType => _symbol.IsNativeIntegerType;
 
        public bool IsFileLocal => _symbol.IsFileLocal;
 
        public INamedTypeSymbol NativeIntegerUnderlyingType => _symbol.NativeIntegerUnderlyingType;
 
        NullableAnnotation ITypeSymbol.NullableAnnotation => throw new NotImplementedException();
 
        ITypeSymbol ITypeSymbol.WithNullableAnnotation(NullableAnnotation nullableAnnotation)
            => throw new NotImplementedException();
    }
}