File: src\Workspaces\SharedUtilitiesAndExtensions\Workspace\Core\CodeGeneration\Symbols\CodeGenerationTypeParameterSymbol.cs
Web Access
Project: src\src\CodeStyle\Core\CodeFixes\Microsoft.CodeAnalysis.CodeStyle.Fixes.csproj (Microsoft.CodeAnalysis.CodeStyle.Fixes)
// 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.Collections.Immutable;
 
namespace Microsoft.CodeAnalysis.CodeGeneration;
 
internal class CodeGenerationTypeParameterSymbol(
    INamedTypeSymbol containingType,
    ImmutableArray<AttributeData> attributes,
    VarianceKind varianceKind,
    string name,
    NullableAnnotation nullableAnnotation,
    ImmutableArray<ITypeSymbol> constraintTypes,
    bool hasConstructorConstraint,
    bool hasReferenceConstraint,
    bool hasValueConstraint,
    bool hasUnmanagedConstraint,
    bool hasNotNullConstraint,
    bool allowsRefLikeType,
    int ordinal) : CodeGenerationTypeSymbol(containingType?.ContainingAssembly, containingType, attributes, Accessibility.NotApplicable, default, name, SpecialType.None, nullableAnnotation), ITypeParameterSymbol
{
    public VarianceKind Variance { get; } = varianceKind;
    public ImmutableArray<ITypeSymbol> ConstraintTypes { get; internal set; } = constraintTypes;
    public bool HasConstructorConstraint { get; } = hasConstructorConstraint;
    public bool HasReferenceTypeConstraint { get; } = hasReferenceConstraint;
    public bool HasValueTypeConstraint { get; } = hasValueConstraint;
    public bool AllowsRefLikeType { get; } = allowsRefLikeType;
    public bool HasUnmanagedTypeConstraint { get; } = hasUnmanagedConstraint;
    public bool HasNotNullConstraint { get; } = hasNotNullConstraint;
    public int Ordinal { get; } = ordinal;
 
    protected override CodeGenerationTypeSymbol CloneWithNullableAnnotation(NullableAnnotation nullableAnnotation)
    {
        return new CodeGenerationTypeParameterSymbol(
            this.ContainingType, this.GetAttributes(), this.Variance, this.Name, nullableAnnotation,
            this.ConstraintTypes, this.HasConstructorConstraint, this.HasReferenceTypeConstraint,
            this.HasValueTypeConstraint, this.HasUnmanagedTypeConstraint, this.HasNotNullConstraint,
            this.AllowsRefLikeType, this.Ordinal);
    }
 
    public new ITypeParameterSymbol OriginalDefinition => this;
 
    public ITypeParameterSymbol ReducedFrom => null;
 
    public override SymbolKind Kind => SymbolKind.TypeParameter;
 
    public override void Accept(SymbolVisitor visitor)
        => visitor.VisitTypeParameter(this);
 
    public override TResult Accept<TResult>(SymbolVisitor<TResult> visitor)
        => visitor.VisitTypeParameter(this);
 
    public override TResult Accept<TArgument, TResult>(SymbolVisitor<TArgument, TResult> visitor, TArgument argument)
        => visitor.VisitTypeParameter(this, argument);
 
    public override TypeKind TypeKind => TypeKind.TypeParameter;
 
    public TypeParameterKind TypeParameterKind
    {
        get
        {
            return this.DeclaringMethod != null
                ? TypeParameterKind.Method
                : TypeParameterKind.Type;
        }
    }
 
    public IMethodSymbol DeclaringMethod
    {
        get
        {
            return this.ContainingSymbol as IMethodSymbol;
        }
    }
 
    public INamedTypeSymbol DeclaringType
    {
        get
        {
            return this.ContainingSymbol as INamedTypeSymbol;
        }
    }
 
    public NullableAnnotation ReferenceTypeConstraintNullableAnnotation => throw new System.NotImplementedException();
 
    public ImmutableArray<NullableAnnotation> ConstraintNullableAnnotations => ConstraintTypes.SelectAsArray(t => t.NullableAnnotation);
}