|
// 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;
}
}
}
|