| File: Symbols\ConstructedNamedTypeSymbol.cs | Web Access |
| Project: src\roslyn\src\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj (Microsoft.CodeAnalysis.CSharp) |
// 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.Diagnostics; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp.Symbols { /// <summary> /// A named type symbol that results from substituting a new owner for a type declaration. /// </summary> internal sealed class SubstitutedNestedTypeSymbol : SubstitutedNamedTypeSymbol { internal SubstitutedNestedTypeSymbol(SubstitutedNamedTypeSymbol newContainer, NamedTypeSymbol originalDefinition) : base( newContainer: newContainer, map: newContainer.TypeSubstitution, originalDefinition: originalDefinition, // An Arity-0 member of an unbound type, e.g. A<>.B, is unbound. unbound: newContainer.IsUnboundGenericType && originalDefinition.Arity == 0) { } internal override bool GetUnificationUseSiteDiagnosticRecursive(ref DiagnosticInfo result, Symbol owner, ref HashSet<TypeSymbol> checkedTypes) => OriginalDefinition.GetUnificationUseSiteDiagnosticRecursive(ref result, owner, ref checkedTypes); internal override ImmutableArray<TypeWithAnnotations> TypeArgumentsWithAnnotationsNoUseSiteDiagnostics { get { return GetTypeParametersAsTypeArguments(); } } public override NamedTypeSymbol ConstructedFrom { get { return this; } } public sealed override bool AreLocalsZeroed { get { throw ExceptionUtilities.Unreachable(); } } protected override NamedTypeSymbol WithTupleDataCore(TupleExtraData newData) { throw ExceptionUtilities.Unreachable(); } } /// <summary> /// A generic named type symbol that has been constructed with type arguments distinct from its own type parameters. /// </summary> internal sealed class ConstructedNamedTypeSymbol : SubstitutedNamedTypeSymbol { private readonly ImmutableArray<TypeWithAnnotations> _typeArgumentsWithAnnotations; private readonly NamedTypeSymbol _constructedFrom; internal ConstructedNamedTypeSymbol(NamedTypeSymbol constructedFrom, ImmutableArray<TypeWithAnnotations> typeArgumentsWithAnnotations, bool unbound = false, TupleExtraData tupleData = null) : base(newContainer: constructedFrom.ContainingSymbol, map: new TypeMap(constructedFrom.ContainingType, constructedFrom.OriginalDefinition.TypeParameters, typeArgumentsWithAnnotations), originalDefinition: constructedFrom.OriginalDefinition, constructedFrom: constructedFrom, unbound: unbound, tupleData: tupleData) { _typeArgumentsWithAnnotations = typeArgumentsWithAnnotations; _constructedFrom = constructedFrom; Debug.Assert(constructedFrom.Arity == typeArgumentsWithAnnotations.Length); Debug.Assert(constructedFrom.Arity != 0); } protected override NamedTypeSymbol WithTupleDataCore(TupleExtraData newData) { return new ConstructedNamedTypeSymbol(_constructedFrom, _typeArgumentsWithAnnotations, IsUnboundGenericType, tupleData: newData); } public override NamedTypeSymbol ConstructedFrom { get { return _constructedFrom; } } internal override ImmutableArray<TypeWithAnnotations> TypeArgumentsWithAnnotationsNoUseSiteDiagnostics { get { return _typeArgumentsWithAnnotations; } } internal static bool TypeParametersMatchTypeArguments(ImmutableArray<TypeParameterSymbol> typeParameters, ImmutableArray<TypeWithAnnotations> typeArguments) { int n = typeParameters.Length; Debug.Assert(typeArguments.Length == n); Debug.Assert(typeArguments.Length > 0); for (int i = 0; i < n; i++) { if (!typeArguments[i].Is(typeParameters[i])) { return false; } } return true; } internal sealed override bool GetUnificationUseSiteDiagnosticRecursive(ref DiagnosticInfo result, Symbol owner, ref HashSet<TypeSymbol> checkedTypes) { if (ConstructedFrom.GetUnificationUseSiteDiagnosticRecursive(ref result, owner, ref checkedTypes) || GetUnificationUseSiteDiagnosticRecursive(ref result, _typeArgumentsWithAnnotations, owner, ref checkedTypes)) { return true; } var typeArguments = this.TypeArgumentsWithAnnotationsNoUseSiteDiagnostics; foreach (var typeArg in typeArguments) { if (GetUnificationUseSiteDiagnosticRecursive(ref result, typeArg.CustomModifiers, owner, ref checkedTypes)) { return true; } } return false; } public sealed override bool AreLocalsZeroed { get { throw ExceptionUtilities.Unreachable(); } } } }