File: Microsoft\CSharp\RuntimeBinder\Semantics\Types\TypeParameterType.cs
Web Access
Project: src\runtime\src\libraries\Microsoft.CSharp\src\Microsoft.CSharp.csproj (Microsoft.CSharp)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using Microsoft.CSharp.RuntimeBinder.Syntax;

namespace Microsoft.CSharp.RuntimeBinder.Semantics
{
    /////////////////////////////////////////////////////////////////////////////////

    internal sealed class TypeParameterType : CType
    {
        public TypeParameterType(TypeParameterSymbol symbol)
            : base(TypeKind.TK_TypeParameterType)
        {
            Debug.Assert(symbol.GetTypeParameterType() == null);
            Symbol = symbol;
            symbol.SetTypeParameterType(this);
        }

        public TypeParameterSymbol Symbol { get; }

        // Forward calls into the symbol.

        public ParentSymbol OwningSymbol => Symbol.parent;

        public Name Name => Symbol.name;

        public bool Covariant => Symbol.Covariant;

        public bool Invariant => Symbol.Invariant;

        public bool Contravariant => Symbol.Contravariant;

        public override bool IsValueType => Symbol.IsValueType();

        public override bool IsReferenceType => Symbol.IsReferenceType();

        public override bool IsNonNullableValueType => Symbol.IsNonNullableValueType();

        public bool HasNewConstraint => Symbol.HasNewConstraint();

        public bool HasRefConstraint => Symbol.HasRefConstraint();

        public bool HasValConstraint => Symbol.HasValConstraint();

        public bool IsMethodTypeParameter => Symbol.IsMethodTypeParameter();

        public int IndexInOwnParameters => Symbol.GetIndexInOwnParameters();

        public int IndexInTotalParameters => Symbol.GetIndexInTotalParameters();

        public TypeArray Bounds => Symbol.GetBounds();

        public override Type AssociatedSystemType
        {
            [RequiresUnreferencedCode(Binder.TrimmerWarning)]
            get =>
                (IsMethodTypeParameter
                    ? ((MethodInfo)((MethodSymbol)OwningSymbol).AssociatedMemberInfo).GetGenericArguments()
                    : ((AggregateSymbol)OwningSymbol).AssociatedSystemType.GetGenericArguments()
                )[IndexInOwnParameters];
        }

        public override FUNDTYPE FundamentalType => FUNDTYPE.FT_VAR;
    }
}