| File: Binder\WithClassTypeParametersBinder.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.Collections.Generic; using System.Diagnostics; using System.Threading; using Microsoft.CodeAnalysis.CSharp.Symbols; using Roslyn.Utilities; namespace Microsoft.CodeAnalysis.CSharp { /// <summary> /// A binder that places class/interface/struct/delegate type parameters in scope /// </summary> internal sealed class WithClassTypeParametersBinder : WithTypeParametersBinder { private readonly NamedTypeSymbol _namedType; private MultiDictionary<string, TypeParameterSymbol> _lazyTypeParameterMap; internal WithClassTypeParametersBinder(NamedTypeSymbol container, Binder next) : base(next) { Debug.Assert((object)container != null); _namedType = container; } internal override bool IsAccessibleHelper(Symbol symbol, TypeSymbol accessThroughType, out bool failedThroughTypeCheck, ref CompoundUseSiteInfo<AssemblySymbol> useSiteInfo, ConsList<TypeSymbol> basesBeingResolved) { return this.IsSymbolAccessibleConditional(symbol, _namedType, accessThroughType, out failedThroughTypeCheck, ref useSiteInfo, basesBeingResolved); } protected override MultiDictionary<string, TypeParameterSymbol> TypeParameterMap { get { if (_lazyTypeParameterMap == null) { var result = new MultiDictionary<string, TypeParameterSymbol>(); foreach (TypeParameterSymbol tps in _namedType.TypeParameters) { result.Add(tps.Name, tps); } Interlocked.CompareExchange(ref _lazyTypeParameterMap, result, null); } return _lazyTypeParameterMap; } } internal override void AddLookupSymbolsInfoInSingleBinder(LookupSymbolsInfo result, LookupOptions options, Binder originalBinder) { if (CanConsiderTypeParameters(options)) { foreach (var parameter in _namedType.TypeParameters) { if (originalBinder.CanAddLookupSymbolInfo(parameter, options, result, null)) { result.AddSymbol(parameter, parameter.Name, 0); } } } } protected override LookupOptions LookupMask { get { if (_namedType.IsExtension) { // Extension type parameters should get the same treatment as method type parameters return WithMethodTypeParametersBinder.MethodTypeParameterLookupMask; } return base.LookupMask; } } } }