Skip to content

Commit

Permalink
Fix type parameter scoping for local functions
Browse files Browse the repository at this point in the history
  • Loading branch information
Youssef1313 authored and jcouv committed Mar 11, 2022
1 parent a42e218 commit eb2a3c3
Show file tree
Hide file tree
Showing 3 changed files with 539 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ private static Binder GetEnclosingBinderInternalWithinRoot(SyntaxNode node, int
LocalFunctionSymbol function = GetDeclaredLocalFunction(binder, ownerOfTypeParametersInScope.Identifier);
if ((object)function != null)
{
binder = function.SignatureBinder;
binder = function.ParameterBinder;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ namespace Microsoft.CodeAnalysis.CSharp.Symbols
internal sealed class LocalFunctionSymbol : SourceMethodSymbolWithAttributes
{
private readonly Binder _binder;
private readonly Binder? _withTypeParamsBinder; // null when no type parameters
private readonly Symbol _containingSymbol;
private readonly DeclarationModifiers _declarationModifiers;
private readonly ImmutableArray<SourceMethodTypeParameterSymbol> _typeParameters;
Expand Down Expand Up @@ -60,7 +61,7 @@ internal sealed class LocalFunctionSymbol : SourceMethodSymbolWithAttributes

if (syntax.TypeParameterList != null)
{
binder = new WithMethodTypeParametersBinder(this, binder);
_withTypeParamsBinder = new WithMethodTypeParametersBinder(this, binder);
_typeParameters = MakeTypeParameters(_declarationDiagnostics);
}
else
Expand Down Expand Up @@ -105,7 +106,7 @@ internal sealed class LocalFunctionSymbol : SourceMethodSymbolWithAttributes
/// </summary>
internal Binder ScopeBinder { get; }

internal override Binder ParameterBinder => _binder;
internal override Binder ParameterBinder => _withTypeParamsBinder ?? _binder;

internal LocalFunctionStatementSyntax Syntax => (LocalFunctionStatementSyntax)syntaxReferenceOpt.GetSyntax();

Expand Down Expand Up @@ -180,7 +181,7 @@ private void ComputeParameters()
var diagnostics = BindingDiagnosticBag.GetInstance(_declarationDiagnostics);

var parameters = ParameterHelpers.MakeParameters(
_binder,
ParameterBinder,
this,
this.Syntax.ParameterList,
arglistToken: out arglistToken,
Expand Down Expand Up @@ -239,7 +240,7 @@ internal void ComputeReturnType()

var diagnostics = BindingDiagnosticBag.GetInstance(_declarationDiagnostics);
TypeSyntax returnTypeSyntax = Syntax.ReturnType;
TypeWithAnnotations returnType = _binder.BindType(returnTypeSyntax.SkipRef(), diagnostics);
TypeWithAnnotations returnType = ParameterBinder.BindType(returnTypeSyntax.SkipRef(), diagnostics);

var compilation = DeclaringCompilation;

Expand Down Expand Up @@ -476,7 +477,7 @@ public override ImmutableArray<ImmutableArray<TypeWithAnnotations>> GetTypeParam
var syntax = Syntax;
var diagnostics = BindingDiagnosticBag.GetInstance(_declarationDiagnostics);
var constraints = this.MakeTypeParameterConstraintTypes(
_binder,
ParameterBinder,
TypeParameters,
syntax.TypeParameterList,
syntax.ConstraintClauses,
Expand All @@ -501,7 +502,7 @@ public override ImmutableArray<TypeParameterConstraintKind> GetTypeParameterCons
{
var syntax = Syntax;
var constraints = this.MakeTypeParameterConstraintKinds(
_binder,
ParameterBinder,
TypeParameters,
syntax.TypeParameterList,
syntax.ConstraintClauses);
Expand Down
Loading

0 comments on commit eb2a3c3

Please sign in to comment.