using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Threading; using Microsoft.CodeAnalysis.CSharp.Symbols; using Microsoft.CodeAnalysis.CSharp.Syntax; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp; internal abstract class WithExternAndUsingAliasesBinder : WithExternAliasesBinder { private sealed class FromSyntax : WithExternAndUsingAliasesBinder { private readonly SourceNamespaceSymbol _declaringSymbol; private readonly CSharpSyntaxNode _declarationSyntax; private ImmutableArray _lazyExternAliases; private ImmutableArray _lazyUsingAliases; private ImmutableDictionary? _lazyUsingAliasesMap; private QuickAttributeChecker? _lazyQuickAttributeChecker; internal sealed override ImmutableArray ExternAliases { get { if (_lazyExternAliases.IsDefault) { ImmutableInterlocked.InterlockedInitialize(ref _lazyExternAliases, _declaringSymbol.GetExternAliases(_declarationSyntax)); } return _lazyExternAliases; } } internal override ImmutableArray UsingAliases { get { if (_lazyUsingAliases.IsDefault) { ImmutableInterlocked.InterlockedInitialize(ref _lazyUsingAliases, _declaringSymbol.GetUsingAliases(_declarationSyntax, null)); } return _lazyUsingAliases; } } internal override QuickAttributeChecker QuickAttributeChecker { get { //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) if (_lazyQuickAttributeChecker == null) { QuickAttributeChecker quickAttributeChecker = base.Next.QuickAttributeChecker; CSharpSyntaxNode declarationSyntax = _declarationSyntax; SyntaxList usings; if (!(declarationSyntax is CompilationUnitSyntax compilationUnitSyntax)) { if (!(declarationSyntax is BaseNamespaceDeclarationSyntax baseNamespaceDeclarationSyntax)) { throw ExceptionUtilities.UnexpectedValue((object)_declarationSyntax); } usings = baseNamespaceDeclarationSyntax.Usings; } else { ImmutableArray.Enumerator enumerator = ((SourceNamespaceSymbol)base.Compilation.SourceModule.GlobalNamespace).MergedDeclaration.Declarations.GetEnumerator(); while (enumerator.MoveNext()) { SingleNamespaceDeclaration current = enumerator.Current; if (current.HasGlobalUsings && compilationUnitSyntax.SyntaxTree != current.SyntaxReference.SyntaxTree) { quickAttributeChecker = quickAttributeChecker.AddAliasesIfAny(((CompilationUnitSyntax)(object)current.SyntaxReference.GetSyntax(default(CancellationToken))).Usings, onlyGlobalAliases: true); } } usings = compilationUnitSyntax.Usings; } quickAttributeChecker = quickAttributeChecker.AddAliasesIfAny(usings); _lazyQuickAttributeChecker = quickAttributeChecker; } return _lazyQuickAttributeChecker; } } internal FromSyntax(SourceNamespaceSymbol declaringSymbol, CSharpSyntaxNode declarationSyntax, WithUsingNamespacesAndTypesBinder next) : base(next) { _declaringSymbol = declaringSymbol; _declarationSyntax = declarationSyntax; } protected override ImmutableDictionary GetUsingAliasesMap(ConsList? basesBeingResolved) { if (_lazyUsingAliasesMap == null) { Interlocked.CompareExchange(ref _lazyUsingAliasesMap, _declaringSymbol.GetUsingAliasesMap(_declarationSyntax, basesBeingResolved), null); } return _lazyUsingAliasesMap; } protected override ImportChain BuildImportChain() { ImportChain parentOpt = base.Next.ImportChain; if (_declarationSyntax is BaseNamespaceDeclarationSyntax baseNamespaceDeclarationSyntax) { for (NameSyntax nameSyntax = baseNamespaceDeclarationSyntax.Name; nameSyntax is QualifiedNameSyntax qualifiedNameSyntax; nameSyntax = qualifiedNameSyntax.Left) { parentOpt = new ImportChain(Imports.Empty, parentOpt); } } return new ImportChain(_declaringSymbol.GetImports(_declarationSyntax, null), parentOpt); } } private sealed class FromSymbols : WithExternAndUsingAliasesBinder { private readonly ImmutableArray _externAliases; private readonly ImmutableDictionary _usingAliases; internal override ImmutableArray ExternAliases => _externAliases; internal override ImmutableArray UsingAliases => EnumerableExtensions.SelectAsArray, AliasAndUsingDirective>((IReadOnlyCollection>)_usingAliases, (Func, AliasAndUsingDirective>)((KeyValuePair pair) => pair.Value)); internal FromSymbols(ImmutableArray externAliases, ImmutableDictionary usingAliases, WithUsingNamespacesAndTypesBinder next) : base(next) { _externAliases = externAliases; _usingAliases = usingAliases; } protected override ImmutableDictionary GetUsingAliasesMap(ConsList? basesBeingResolved) { return _usingAliases; } protected override ImportChain BuildImportChain() { return new ImportChain(Imports.Create(_usingAliases, ((WithUsingNamespacesAndTypesBinder)base.Next).GetUsings(null), _externAliases), base.Next.ImportChain); } } private ImportChain? _lazyImportChain; internal abstract override ImmutableArray UsingAliases { get; } internal override ImportChain ImportChain { get { if (_lazyImportChain == null) { Interlocked.CompareExchange(ref _lazyImportChain, BuildImportChain(), null); } return _lazyImportChain; } } protected WithExternAndUsingAliasesBinder(WithUsingNamespacesAndTypesBinder next) : base(next) { } protected abstract ImmutableDictionary GetUsingAliasesMap(ConsList? basesBeingResolved); internal override void LookupSymbolsInSingleBinder(LookupResult result, string name, int arity, ConsList basesBeingResolved, LookupOptions options, Binder originalBinder, bool diagnose, ref CompoundUseSiteInfo useSiteInfo) { LookupSymbolInAliases(GetUsingAliasesMap(basesBeingResolved), ExternAliases, originalBinder, result, name, arity, basesBeingResolved, options, diagnose, ref useSiteInfo); } internal override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo result, LookupOptions options, Binder originalBinder) { if ((options & LookupOptions.LabelsOnly) == 0) { AddLookupSymbolsInfoInAliases(GetUsingAliasesMap(null), ExternAliases, result, options, originalBinder); } } protected abstract ImportChain BuildImportChain(); internal bool IsUsingAlias(string name, bool callerIsSemanticModel, ConsList? basesBeingResolved) { return IsUsingAlias(GetUsingAliasesMap(basesBeingResolved), name, callerIsSemanticModel); } [Obsolete("Use other overloads", true)] internal new static WithExternAndUsingAliasesBinder Create(SourceNamespaceSymbol declaringSymbol, CSharpSyntaxNode declarationSyntax, Binder next) { throw ExceptionUtilities.Unreachable("/_/src/Compilers/CSharp/Portable/Binder/WithExternAndUsingAliasesBinder.cs", 95); } internal static WithExternAndUsingAliasesBinder Create(SourceNamespaceSymbol declaringSymbol, CSharpSyntaxNode declarationSyntax, WithUsingNamespacesAndTypesBinder next) { return new FromSyntax(declaringSymbol, declarationSyntax, next); } internal static WithExternAndUsingAliasesBinder Create(ImmutableArray externAliases, ImmutableDictionary usingAliases, WithUsingNamespacesAndTypesBinder next) { return new FromSymbols(externAliases, usingAliases, next); } }