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)
63using var uniqueSuccessors = PooledHashSet<BasicBlock>.GetInstance();
99foreach (var block in cfg.Blocks)
104var entry = cfg.GetEntry();
134foreach (var block in cfg.Blocks)
187PooledHashSet<BasicBlock> uniqueSuccessors,
197foreach (var block in cfg.Blocks)
222var block = cfg.Blocks[blockOrdinal];
337var successorBlock = successorWithBranch.Destination;
489static ControlFlowRegion? TryGetReachableCatchRegionStartingHandler(ControlFlowRegion tryAndCatchRegion, BasicBlock sourceBlock)
505ControlFlowRegion? MergeIntoCatchInputData(ControlFlowRegion tryAndCatchRegion, TAnalysisData dataToMerge, BasicBlock sourceBlock)
513var catchBlock = cfg.Blocks[catchRegion.FirstBlockOrdinal];
572var block = cfg.Blocks[blockOrdinal];
582bool HasUnprocessedPredecessorBlock(BasicBlock block)
591static ControlFlowRegion? GetEnclosingTryAndCatchRegionIfStartsHandler(BasicBlock block)
619IEnumerable<(BranchWithInfo successorWithBranch, BranchWithInfo? preadjustSuccessorWithBranch)> GetSuccessorsWithAdjustedBranches(BasicBlock basicBlock)
654var destination = cfg.Blocks[firstFinally.FirstBlockOrdinal];
665void UpdateFinallySuccessorsAndCatchInput(BranchWithInfo branch, TAnalysisData branchData, BasicBlock sourceBlock)
752BasicBlock block,
778protected abstract TBlockAnalysisResult ToBlockResult(BasicBlock basicBlock, TAnalysisData blockAnalysisData);
780private void UpdateInput(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newInput)
786private void CloneAndUpdateOutputIfEntryOrExitBlock(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newOutput)
805var block = cfg.Blocks[i];
src\RoslynAnalyzers\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (17)
55private BasicBlock? _currentBasicBlock;
185protected BasicBlock CurrentBasicBlock
227private Dictionary<BasicBlock, ThrownExceptionInfo>? _exceptionPathsThrownExceptionInfoMap;
234_exceptionPathsThrownExceptionInfoMap ??= new Dictionary<BasicBlock, ThrownExceptionInfo>();
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)