src\RoslynAnalyzers\Utilities\FlowAnalysis\Extensions\BasicBlockExtensions.cs (20)
16internal static IEnumerable<(BasicBlock predecessorBlock, BranchWithInfo branchWithInfo)> GetPredecessorsWithBranches(this BasicBlock basicBlock, ControlFlowGraph cfg)
33internal static ITypeSymbol? GetEnclosingRegionExceptionType(this BasicBlock basicBlock)
52public static bool IsContainedInRegionOfKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
58public static ControlFlowRegion? GetContainingRegionOfKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
77public static bool IsFirstBlockOfFinally(this BasicBlock basicBlock, [NotNullWhen(returnValue: true)] out ControlFlowRegion? finallyRegion)
83public static bool IsLastBlockOfFinally(this BasicBlock basicBlock, [NotNullWhen(returnValue: true)] out ControlFlowRegion? finallyRegion)
89public static bool IsFirstBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, [NotNullWhen(returnValue: true)] out ControlFlowRegion? region)
95public static bool IsLastBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, [NotNullWhen(returnValue: true)] out ControlFlowRegion? region)
98private static bool IsFirstOrLastBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, bool first, [NotNullWhen(returnValue: true)] out ControlFlowRegion? foundRegion)
126public static bool IsFirstBlockOfCompilerGeneratedFinally(this BasicBlock basicBlock, ControlFlowGraph cfg)
144internal static ControlFlowRegion? GetInnermostRegionStartedByBlock(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
171internal static int GetMaxSuccessorOrdinal(this BasicBlock basicBlock)
175internal static bool DominatesPredecessors(this BasicBlock? basicBlock, ControlFlowGraph cfg)
187var sourceBlock = predecessor.Source;
204var sourceBlock = cfg.Blocks[ordinal];
214static bool DominatesBlock(BasicBlock sourceBlock, BasicBlock basicBlock, PooledHashSet<int> processedOrdinals, ArrayBuilder<int> unprocessedOrdinals)
218static bool DominatesBranch(ControlFlowBranch? branch, BasicBlock basicBlock, PooledHashSet<int> processedOrdinals, ArrayBuilder<int> unprocessedOrdinals)
220var destinationBlock = branch?.Destination;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowAnalysis.cs (22)
65using var _1 = PooledHashSet<BasicBlock>.GetInstance(out var uniqueSuccessors);
101foreach (var block in cfg.Blocks)
106var entry = cfg.GetEntry();
136foreach (var block in cfg.Blocks)
189PooledHashSet<BasicBlock> uniqueSuccessors,
199foreach (var block in cfg.Blocks)
224var block = cfg.Blocks[blockOrdinal];
339var successorBlock = successorWithBranch.Destination;
491static ControlFlowRegion? TryGetReachableCatchRegionStartingHandler(ControlFlowRegion tryAndCatchRegion, BasicBlock sourceBlock)
507ControlFlowRegion? MergeIntoCatchInputData(ControlFlowRegion tryAndCatchRegion, TAnalysisData dataToMerge, BasicBlock sourceBlock)
515var catchBlock = cfg.Blocks[catchRegion.FirstBlockOrdinal];
574var block = cfg.Blocks[blockOrdinal];
584bool HasUnprocessedPredecessorBlock(BasicBlock block)
593static ControlFlowRegion? GetEnclosingTryAndCatchRegionIfStartsHandler(BasicBlock block)
621IEnumerable<(BranchWithInfo successorWithBranch, BranchWithInfo? preadjustSuccessorWithBranch)> GetSuccessorsWithAdjustedBranches(BasicBlock basicBlock)
656var destination = cfg.Blocks[firstFinally.FirstBlockOrdinal];
667void UpdateFinallySuccessorsAndCatchInput(BranchWithInfo branch, TAnalysisData branchData, BasicBlock sourceBlock)
754BasicBlock block,
780protected abstract TBlockAnalysisResult ToBlockResult(BasicBlock basicBlock, TAnalysisData blockAnalysisData);
782private void UpdateInput(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newInput)
788private void CloneAndUpdateOutputIfEntryOrExitBlock(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newOutput)
807var block = cfg.Blocks[i];
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (16)
57private BasicBlock? _currentBasicBlock;
187protected BasicBlock CurrentBasicBlock
229private Dictionary<BasicBlock, ThrownExceptionInfo>? _exceptionPathsThrownExceptionInfoMap;
419public virtual TAnalysisData Flow(IOperation statement, BasicBlock block, TAnalysisData input)
441public TAnalysisData OnStartBlockAnalysis(BasicBlock block, TAnalysisData input)
473public TAnalysisData OnEndBlockAnalysis(BasicBlock block, TAnalysisData analysisData)
549private void OnStartEntryBlockAnalysis(BasicBlock entryBlock)
582private void OnStartExitBlockAnalysis(BasicBlock exitBlock)
649private void OnEndExitBlockAnalysis(BasicBlock exitBlock)
681BasicBlock fromBlock,
943BasicBlock currentBasicBlock,
1356protected virtual void UpdateReachability(BasicBlock basicBlock, TAnalysisData analysisData, bool isReachable)
1368private bool GetBlockReachability(BasicBlock basicBlock)
2080public TAnalysisData MergeAnalysisData(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock, bool forBackEdge)
2083protected virtual TAnalysisData MergeAnalysisData(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock)
2085protected virtual TAnalysisData MergeAnalysisDataForBackEdge(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (12)
31private readonly PooledDictionary<BasicBlock, BasicBlockAnalysisData> _analysisDataByBasicBlockMap;
76PooledDictionary<BasicBlock, BasicBlockAnalysisData> analysisDataByBasicBlockMap,
164private static PooledDictionary<BasicBlock, BasicBlockAnalysisData> CreateAnalysisDataByBasicBlockMap(
167var builder = PooledDictionary<BasicBlock, BasicBlockAnalysisData>.GetInstance();
168foreach (var block in cfg.Blocks)
201public BasicBlockAnalysisData GetBlockAnalysisData(BasicBlock basicBlock)
204public BasicBlockAnalysisData GetOrCreateBlockAnalysisData(BasicBlock basicBlock, CancellationToken cancellationToken)
344private void HandleCatchOrFilterOrFinallyInitialization(BasicBlock basicBlock, CancellationToken cancellationToken)
397var firstBasicBlockInOutermostRegion = ControlFlowGraph.Blocks[containingTryCatchFinallyRegion.FirstBlockOrdinal];
412public void SetCurrentBlockAnalysisDataFrom(BasicBlock basicBlock, CancellationToken cancellationToken)
424public void SetBlockAnalysisData(BasicBlock basicBlock, BasicBlockAnalysisData data)
427public void SetBlockAnalysisDataFrom(BasicBlock basicBlock, BasicBlockAnalysisData data, CancellationToken cancellationToken)
src\Workspaces\SharedUtilitiesAndExtensions\Compiler\Core\FlowAnalysis\SymbolUsageAnalysis\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (12)
31private readonly PooledDictionary<BasicBlock, BasicBlockAnalysisData> _analysisDataByBasicBlockMap;
76PooledDictionary<BasicBlock, BasicBlockAnalysisData> analysisDataByBasicBlockMap,
164private static PooledDictionary<BasicBlock, BasicBlockAnalysisData> CreateAnalysisDataByBasicBlockMap(
167var builder = PooledDictionary<BasicBlock, BasicBlockAnalysisData>.GetInstance();
168foreach (var block in cfg.Blocks)
201public BasicBlockAnalysisData GetBlockAnalysisData(BasicBlock basicBlock)
204public BasicBlockAnalysisData GetOrCreateBlockAnalysisData(BasicBlock basicBlock, CancellationToken cancellationToken)
344private void HandleCatchOrFilterOrFinallyInitialization(BasicBlock basicBlock, CancellationToken cancellationToken)
397var firstBasicBlockInOutermostRegion = ControlFlowGraph.Blocks[containingTryCatchFinallyRegion.FirstBlockOrdinal];
412public void SetCurrentBlockAnalysisDataFrom(BasicBlock basicBlock, CancellationToken cancellationToken)
424public void SetBlockAnalysisData(BasicBlock basicBlock, BasicBlockAnalysisData data)
427public void SetBlockAnalysisDataFrom(BasicBlock basicBlock, BasicBlockAnalysisData data, CancellationToken cancellationToken)