Files
2026-08-27 10:56:38 -06:00

83 lines
2.8 KiB
C#

using System.Collections.Immutable;
using Microsoft.CodeAnalysis.CSharp.Symbols;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.PooledObjects;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp;
internal sealed class ScriptLocalScopeBinder : LocalScopeBinder
{
internal new sealed class Labels
{
private readonly SynthesizedInteractiveInitializerMethod _scriptInitializer;
private readonly CompilationUnitSyntax _syntax;
private ImmutableArray<LabelSymbol> _lazyLabels;
internal SynthesizedInteractiveInitializerMethod ScriptInitializer => _scriptInitializer;
internal Labels(SynthesizedInteractiveInitializerMethod scriptInitializer, CompilationUnitSyntax syntax)
{
_scriptInitializer = scriptInitializer;
_syntax = syntax;
}
internal ImmutableArray<LabelSymbol> GetLabels()
{
if (_lazyLabels == null)
{
ImmutableInterlocked.InterlockedInitialize(ref _lazyLabels, GetLabels(_scriptInitializer, _syntax));
}
return _lazyLabels;
}
private static ImmutableArray<LabelSymbol> GetLabels(SynthesizedInteractiveInitializerMethod scriptInitializer, CompilationUnitSyntax syntax)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_0014: Unknown result type (might be due to invalid IL or missing references)
ArrayBuilder<LabelSymbol> labels = ArrayBuilder<LabelSymbol>.GetInstance();
Enumerator<MemberDeclarationSyntax> enumerator = syntax.Members.GetEnumerator();
while (enumerator.MoveNext())
{
MemberDeclarationSyntax current = enumerator.Current;
if (current.Kind() == SyntaxKind.GlobalStatement)
{
LocalScopeBinder.BuildLabels(scriptInitializer, ((GlobalStatementSyntax)current).Statement, ref labels);
}
}
return labels.ToImmutableAndFree();
}
}
private readonly Labels _labels;
internal override Symbol ContainingMemberOrLambda => _labels.ScriptInitializer;
internal override bool IsLabelsScopeBinder => true;
internal ScriptLocalScopeBinder(Labels labels, Binder next)
: base(next)
{
_labels = labels;
}
protected override ImmutableArray<LabelSymbol> BuildLabels()
{
return _labels.GetLabels();
}
internal override ImmutableArray<LocalSymbol> GetDeclaredLocalsForScope(SyntaxNode scopeDesignator)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/CSharp/Portable/Binder/ScriptLocalScopeBinder.cs", 44);
}
internal override ImmutableArray<LocalFunctionSymbol> GetDeclaredLocalFunctionsForScope(CSharpSyntaxNode scopeDesignator)
{
throw ExceptionUtilities.Unreachable("/_/src/Compilers/CSharp/Portable/Binder/ScriptLocalScopeBinder.cs", 49);
}
}