// 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 Microsoft.CodeAnalysis.Editing; namespace Microsoft.CodeAnalysis.CodeGeneration; internal abstract class CodeGenerationAbstractNamedTypeSymbol : CodeGenerationTypeSymbol, INamedTypeSymbol { public new INamedTypeSymbol OriginalDefinition { get; protected set; } public ImmutableArray<IFieldSymbol> TupleElements { get; protected set; } internal readonly ImmutableArray<CodeGenerationAbstractNamedTypeSymbol> TypeMembers; protected CodeGenerationAbstractNamedTypeSymbol( IAssemblySymbol containingAssembly, INamedTypeSymbol containingType, ImmutableArray<AttributeData> attributes, Accessibility declaredAccessibility, DeclarationModifiers modifiers, string name, SpecialType specialType, NullableAnnotation nullableAnnotation, ImmutableArray<CodeGenerationAbstractNamedTypeSymbol> typeMembers) : base(containingAssembly, containingType, attributes, declaredAccessibility, modifiers, name, specialType, nullableAnnotation) { this.TypeMembers = typeMembers; foreach (var member in typeMembers) { member.ContainingType = this; } } public override SymbolKind Kind => SymbolKind.NamedType; public override void Accept(SymbolVisitor visitor) => visitor.VisitNamedType(this); public override TResult Accept<TResult>(SymbolVisitor<TResult> visitor) => visitor.VisitNamedType(this); public override TResult Accept<TArgument, TResult>(SymbolVisitor<TArgument, TResult> visitor, TArgument argument) => visitor.VisitNamedType(this, argument); public INamedTypeSymbol Construct(params ITypeSymbol[] typeArguments) { if (typeArguments.Length == 0) { return this; } return new CodeGenerationConstructedNamedTypeSymbol( ConstructedFrom, [.. typeArguments], this.TypeMembers); } public INamedTypeSymbol Construct(ImmutableArray<ITypeSymbol> typeArguments, ImmutableArray<NullableAnnotation> typeArgumentNullableAnnotations) { return new CodeGenerationConstructedNamedTypeSymbol( ConstructedFrom, typeArguments, this.TypeMembers); } public abstract int Arity { get; } public abstract bool IsGenericType { get; } public abstract bool IsUnboundGenericType { get; } public abstract bool IsScriptClass { get; } public abstract bool IsImplicitClass { get; } public abstract IEnumerable<string> MemberNames { get; } public abstract IMethodSymbol DelegateInvokeMethod { get; } public abstract INamedTypeSymbol EnumUnderlyingType { get; } protected abstract CodeGenerationNamedTypeSymbol ConstructedFrom { get; } INamedTypeSymbol INamedTypeSymbol.ConstructedFrom => this.ConstructedFrom; public abstract INamedTypeSymbol ConstructUnboundGenericType(); public abstract ImmutableArray<IMethodSymbol> InstanceConstructors { get; } public abstract ImmutableArray<IMethodSymbol> StaticConstructors { get; } public abstract ImmutableArray<IMethodSymbol> Constructors { get; } public abstract ImmutableArray<ITypeSymbol> TypeArguments { get; } public abstract ImmutableArray<NullableAnnotation> TypeArgumentNullableAnnotations { get; } public ImmutableArray<CustomModifier> GetTypeArgumentCustomModifiers(int ordinal) { if (ordinal < 0 || ordinal >= Arity) { throw new IndexOutOfRangeException(); } return []; } public abstract ImmutableArray<ITypeParameterSymbol> TypeParameters { get; } public override string MetadataName { get { return this.Arity > 0 ? this.Name + "`" + Arity : base.MetadataName; } } public ISymbol AssociatedSymbol { get; internal set; } public bool MightContainExtensionMethods => false; public bool IsComImport => false; public bool IsUnmanagedType => throw new NotImplementedException(); public bool IsRefLikeType => Modifiers.IsRef; public INamedTypeSymbol NativeIntegerUnderlyingType => null; public INamedTypeSymbol TupleUnderlyingType => null; public bool IsSerializable => false; public bool IsFileLocal => Modifiers.IsFile; #if !OLDER_ROSLYN public bool IsExtension => false; public string ExtensionGroupingName => null; public string ExtensionMarkerName => null; public IParameterSymbol ExtensionParameter => null; public override bool IsClosed => Modifiers.IsClosed; #endif }