| File: Binder\Binder.NamespaceOrTypeOrAliasSymbolWithAnnotations.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.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Symbols; namespace Microsoft.CodeAnalysis.CSharp { internal partial class Binder { internal readonly struct NamespaceOrTypeOrAliasSymbolWithAnnotations { private readonly TypeWithAnnotations _typeWithAnnotations; private readonly Symbol _symbol; private readonly bool _isNullableEnabled; private NamespaceOrTypeOrAliasSymbolWithAnnotations(TypeWithAnnotations typeWithAnnotations) { Debug.Assert(typeWithAnnotations.HasType); _typeWithAnnotations = typeWithAnnotations; _symbol = null; _isNullableEnabled = false; // Not meaningful for a TypeWithAnnotations, it already baked the fact into its content. } private NamespaceOrTypeOrAliasSymbolWithAnnotations(Symbol symbol, bool isNullableEnabled) { Debug.Assert(!(symbol is TypeSymbol)); _typeWithAnnotations = default; _symbol = symbol; _isNullableEnabled = isNullableEnabled; } internal TypeWithAnnotations TypeWithAnnotations => _typeWithAnnotations; internal Symbol Symbol => _symbol ?? TypeWithAnnotations.Type; internal bool IsType => !_typeWithAnnotations.IsDefault; internal bool IsAlias => _symbol?.Kind == SymbolKind.Alias; internal NamespaceOrTypeSymbol NamespaceOrTypeSymbol => Symbol as NamespaceOrTypeSymbol; internal bool IsDefault => !_typeWithAnnotations.HasType && _symbol is null; internal bool IsNullableEnabled { get { Debug.Assert(_symbol?.Kind == SymbolKind.Alias); // Not meaningful to use this property otherwise return _isNullableEnabled; } } internal static NamespaceOrTypeOrAliasSymbolWithAnnotations CreateUnannotated(bool isNullableEnabled, Symbol symbol) { if (symbol is null) { return default; } var type = symbol as TypeSymbol; return type is null ? new NamespaceOrTypeOrAliasSymbolWithAnnotations(symbol, isNullableEnabled) : new NamespaceOrTypeOrAliasSymbolWithAnnotations(TypeWithAnnotations.Create(isNullableEnabled, type)); } public static implicit operator NamespaceOrTypeOrAliasSymbolWithAnnotations(TypeWithAnnotations typeWithAnnotations) { return new NamespaceOrTypeOrAliasSymbolWithAnnotations(typeWithAnnotations); } } } }