// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team // // Permission is hereby granted, free of charge, to any person obtaining a copy of this // software and associated documentation files (the "Software"), to deal in the Software // without restriction, including without limitation the rights to use, copy, modify, merge, // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons // to whom the Software is furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all copies or // substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, // INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE // FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER // DEALINGS IN THE SOFTWARE. #nullable enable using System; using System.Collections.Generic; using ICSharpCode.Decompiler.Util; namespace ICSharpCode.Decompiler.TypeSystem { /// /// Type parameter of a generic class/method. /// public interface ITypeParameter : IType, ISymbol { /// /// Get the type of this type parameter's owner. /// /// SymbolKind.TypeDefinition or SymbolKind.Method SymbolKind OwnerType { get; } /// /// Gets the owning method/class. /// This property may return null (for example for the dummy type parameters used by ). /// /// /// For "class Outer<T> { class Inner {} }", /// inner.TypeParameters[0].Owner will be the outer class, because the same /// ITypeParameter instance is used both on Outer`1 and Outer`1+Inner. /// IEntity? Owner { get; } /// /// Gets the index of the type parameter in the type parameter list of the owning method/class. /// int Index { get; } /// /// Gets the name of the type parameter. /// new string Name { get; } /// /// Gets the attributes declared on this type parameter. /// IEnumerable GetAttributes(); /// /// Gets the variance of this type parameter. /// VarianceModifier Variance { get; } /// /// Gets the effective base class of this type parameter. /// IType EffectiveBaseClass { get; } /// /// Gets the effective interface set of this type parameter. /// IReadOnlyCollection EffectiveInterfaceSet { get; } /// /// Gets if the type parameter has the 'new()' constraint. /// bool HasDefaultConstructorConstraint { get; } /// /// Gets if the type parameter has the 'class' constraint. /// bool HasReferenceTypeConstraint { get; } /// /// Gets if the type parameter has the 'struct' or 'unmanaged' constraint. /// bool HasValueTypeConstraint { get; } /// /// Gets if the type parameter has the 'unmanaged' constraint. /// bool HasUnmanagedConstraint { get; } /// /// Nullability of the reference type constraint. (e.g. "where T : class?"). /// /// Note that the nullability of a use of the type parameter may differ from this. /// E.g. "T? GetNull<T>() where T : class => null;" /// Nullability NullabilityConstraint { get; } IReadOnlyList TypeConstraints { get; } } public readonly struct TypeConstraint { public SymbolKind SymbolKind => SymbolKind.Constraint; public IType Type { get; } public IReadOnlyList Attributes { get; } public TypeConstraint(IType type, IReadOnlyList? attributes = null) { this.Type = type ?? throw new ArgumentNullException(nameof(type)); this.Attributes = attributes ?? EmptyList.Instance; } } /// /// Represents the variance of a type parameter. /// public enum VarianceModifier : byte { /// /// The type parameter is not variant. /// Invariant, /// /// The type parameter is covariant (used in output position). /// Covariant, /// /// The type parameter is contravariant (used in input position). /// Contravariant }; }