83 lines
2.8 KiB
C#
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);
|
|
}
|
|
}
|