| File: Binder\TypeofBinder.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 Microsoft.CodeAnalysis.CSharp.Syntax; using System.Collections.Immutable; using Microsoft.CodeAnalysis.CSharp.Symbols; namespace Microsoft.CodeAnalysis.CSharp { /// <summary> /// This binder is for binding the argument to typeof. It traverses /// the syntax marking each open type ("unbound generic type" in the /// C# spec) as either allowed or not allowed, so that BindType can /// appropriately return either the corresponding type symbol or an /// error type. It also indicates whether the argument as a whole /// should be considered open so that the flag can be set /// appropriately in BoundTypeOfOperator. /// </summary> internal sealed class TypeofBinder : Binder { private readonly Dictionary<GenericNameSyntax, bool> _allowedMap; internal TypeofBinder(ExpressionSyntax typeExpression, Binder next) // Unsafe types are not unsafe in typeof, so it is effectively an unsafe region. : base(next, next.Flags | BinderFlags.UnsafeRegion) { OpenTypeVisitor.Visit(typeExpression, out _allowedMap); } protected override bool IsUnboundTypeAllowed(GenericNameSyntax syntax) { bool allowed; return _allowedMap != null && _allowedMap.TryGetValue(syntax, out allowed) && allowed; } } }