| File: FlowAnalysis\AbstractRegionControlFlowPass.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.Immutable; using Microsoft.CodeAnalysis.CSharp.Symbols; namespace Microsoft.CodeAnalysis.CSharp { internal abstract class AbstractRegionControlFlowPass : ControlFlowPass { internal AbstractRegionControlFlowPass( CSharpCompilation compilation, Symbol member, BoundNode node, BoundNode firstInRegion, BoundNode lastInRegion) : base(compilation, member, node, firstInRegion, lastInRegion) { } public override BoundNode Visit(BoundNode node) { VisitAlways(node); return null; } // Control flow analysis does not normally scan the body of a lambda, but region analysis does. public override BoundNode VisitLambda(BoundLambda node) { var oldPending = SavePending(); // We do not support branches *into* a lambda. LocalState finalState = this.State; this.State = TopState(); var oldPending2 = SavePending(); VisitAlways(node.Body); RestorePending(oldPending2); // process any forward branches within the lambda body ImmutableArray<PendingBranch> pendingReturns = RemoveReturns(); RestorePending(oldPending); Join(ref finalState, ref this.State); foreach (PendingBranch returnBranch in pendingReturns) { this.State = returnBranch.State; Join(ref finalState, ref this.State); } this.State = finalState; return null; } } }