src\RoslynAnalyzers\Utilities\FlowAnalysis\Extensions\BasicBlockExtensions.cs (21)
16internal static IEnumerable<(BasicBlock predecessorBlock, BranchWithInfo branchWithInfo)> GetPredecessorsWithBranches(this BasicBlock basicBlock, ControlFlowGraph cfg)
33internal static ITypeSymbol? GetEnclosingRegionExceptionType(this BasicBlock basicBlock)
49public static IEnumerable<IOperation> DescendantOperations(this BasicBlock basicBlock)
71public static bool IsContainedInRegionOfKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
77public static ControlFlowRegion? GetContainingRegionOfKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
96public static bool IsFirstBlockOfFinally(this BasicBlock basicBlock, [NotNullWhen(returnValue: true)] out ControlFlowRegion? finallyRegion)
102public static bool IsLastBlockOfFinally(this BasicBlock basicBlock, [NotNullWhen(returnValue: true)] out ControlFlowRegion? finallyRegion)
108public static bool IsFirstBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, [NotNullWhen(returnValue: true)] out ControlFlowRegion? region)
114public static bool IsLastBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, [NotNullWhen(returnValue: true)] out ControlFlowRegion? region)
117private static bool IsFirstOrLastBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, bool first, [NotNullWhen(returnValue: true)] out ControlFlowRegion? foundRegion)
145public static bool IsFirstBlockOfCompilerGeneratedFinally(this BasicBlock basicBlock, ControlFlowGraph cfg)
163internal static ControlFlowRegion? GetInnermostRegionStartedByBlock(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
190internal static int GetMaxSuccessorOrdinal(this BasicBlock basicBlock)
194internal static bool DominatesPredecessors(this BasicBlock? basicBlock, ControlFlowGraph cfg)
206var sourceBlock = predecessor.Source;
223var sourceBlock = cfg.Blocks[ordinal];
233static bool DominatesBlock(BasicBlock sourceBlock, BasicBlock basicBlock, PooledHashSet<int> processedOrdinals, ArrayBuilder<int> unprocessedOrdinals)
237static bool DominatesBranch(ControlFlowBranch? branch, BasicBlock basicBlock, PooledHashSet<int> processedOrdinals, ArrayBuilder<int> unprocessedOrdinals)
239var destinationBlock = branch?.Destination;
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowAnalysis.cs (22)
64using var _1 = PooledHashSet<BasicBlock>.GetInstance(out var uniqueSuccessors);
100foreach (var block in cfg.Blocks)
105var entry = cfg.GetEntry();
135foreach (var block in cfg.Blocks)
188PooledHashSet<BasicBlock> uniqueSuccessors,
198foreach (var block in cfg.Blocks)
223var block = cfg.Blocks[blockOrdinal];
338var successorBlock = successorWithBranch.Destination;
490static ControlFlowRegion? TryGetReachableCatchRegionStartingHandler(ControlFlowRegion tryAndCatchRegion, BasicBlock sourceBlock)
506ControlFlowRegion? MergeIntoCatchInputData(ControlFlowRegion tryAndCatchRegion, TAnalysisData dataToMerge, BasicBlock sourceBlock)
514var catchBlock = cfg.Blocks[catchRegion.FirstBlockOrdinal];
573var block = cfg.Blocks[blockOrdinal];
583bool HasUnprocessedPredecessorBlock(BasicBlock block)
592static ControlFlowRegion? GetEnclosingTryAndCatchRegionIfStartsHandler(BasicBlock block)
620IEnumerable<(BranchWithInfo successorWithBranch, BranchWithInfo? preadjustSuccessorWithBranch)> GetSuccessorsWithAdjustedBranches(BasicBlock basicBlock)
655var destination = cfg.Blocks[firstFinally.FirstBlockOrdinal];
666void UpdateFinallySuccessorsAndCatchInput(BranchWithInfo branch, TAnalysisData branchData, BasicBlock sourceBlock)
753BasicBlock block,
779protected abstract TBlockAnalysisResult ToBlockResult(BasicBlock basicBlock, TAnalysisData blockAnalysisData);
781private void UpdateInput(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newInput)
787private void CloneAndUpdateOutputIfEntryOrExitBlock(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newOutput)
806var block = cfg.Blocks[i];
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (16)
55private BasicBlock? _currentBasicBlock;
185protected BasicBlock CurrentBasicBlock
227private Dictionary<BasicBlock, ThrownExceptionInfo>? _exceptionPathsThrownExceptionInfoMap;
417public virtual TAnalysisData Flow(IOperation statement, BasicBlock block, TAnalysisData input)
439public TAnalysisData OnStartBlockAnalysis(BasicBlock block, TAnalysisData input)
471public TAnalysisData OnEndBlockAnalysis(BasicBlock block, TAnalysisData analysisData)
547private void OnStartEntryBlockAnalysis(BasicBlock entryBlock)
580private void OnStartExitBlockAnalysis(BasicBlock exitBlock)
647private void OnEndExitBlockAnalysis(BasicBlock exitBlock)
679BasicBlock fromBlock,
941BasicBlock currentBasicBlock,
1354protected virtual void UpdateReachability(BasicBlock basicBlock, TAnalysisData analysisData, bool isReachable)
1366private bool GetBlockReachability(BasicBlock basicBlock)
2078public TAnalysisData MergeAnalysisData(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock, bool forBackEdge)
2081protected virtual TAnalysisData MergeAnalysisData(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock)
2083protected virtual TAnalysisData MergeAnalysisDataForBackEdge(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock)