src\b310f676f7308b7f\SymbolUsageAnalysis.DataFlowAnalyzer.FlowGraphAnalysisData.cs (12)
31private readonly PooledDictionary<BasicBlock, BasicBlockAnalysisData> _analysisDataByBasicBlockMap;
76PooledDictionary<BasicBlock, BasicBlockAnalysisData> analysisDataByBasicBlockMap,
180private static PooledDictionary<BasicBlock, BasicBlockAnalysisData> CreateAnalysisDataByBasicBlockMap(
183var builder = PooledDictionary<BasicBlock, BasicBlockAnalysisData>.GetInstance();
184foreach (var block in cfg.Blocks)
217public BasicBlockAnalysisData GetBlockAnalysisData(BasicBlock basicBlock)
220public BasicBlockAnalysisData GetOrCreateBlockAnalysisData(BasicBlock basicBlock, CancellationToken cancellationToken)
360private void HandleCatchOrFilterOrFinallyInitialization(BasicBlock basicBlock, CancellationToken cancellationToken)
413var firstBasicBlockInOutermostRegion = ControlFlowGraph.Blocks[containingTryCatchFinallyRegion.FirstBlockOrdinal];
428public void SetCurrentBlockAnalysisDataFrom(BasicBlock basicBlock, CancellationToken cancellationToken)
440public void SetBlockAnalysisData(BasicBlock basicBlock, BasicBlockAnalysisData data)
443public void SetBlockAnalysisDataFrom(BasicBlock basicBlock, BasicBlockAnalysisData data, CancellationToken cancellationToken)
src\roslyn\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\roslyn\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\roslyn\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)
Microsoft.NetCore.Analyzers\Tasks\UseValueTasksCorrectly.cs (11)
221if (TryGetLocalSymbolAssigned(operation.Parent, out var valueTypeSymbol, out var startingBlock))
242var seen = new Dictionary<BasicBlock, FlowState>();
246var stack = new Stack<(BasicBlock, FlowState)>();
253(var block, var blockState) = stack.Pop();
300if (block.ConditionalSuccessor?.Destination is BasicBlock conditional)
324if (block.FallThroughSuccessor?.Destination is BasicBlock fallthrough)
331void HandleSuccessor(BasicBlock successor, bool setKnownCompletion)
385private static bool TryGetLocalSymbolAssigned(IOperation? operation, [NotNullWhen(true)] out ISymbol? symbol, [NotNullWhen(true)] out BasicBlock? startingBlock)
433private static int CountConsumptions(BasicBlock block, ISymbol valueTaskSymbol)
466private static int FindFirstAssertsCompletion(BasicBlock block, ISymbol valueTaskSymbol, INamedTypeSymbol? debugType)
491private static int FindFirstDirectResultAccess(BasicBlock block, ISymbol valueTaskSymbol)
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\Extensions\BasicBlockExtensions.cs (21)
15internal static IEnumerable<(BasicBlock predecessorBlock, BranchWithInfo branchWithInfo)> GetPredecessorsWithBranches(this BasicBlock basicBlock, ControlFlowGraph cfg)
32internal static ITypeSymbol? GetEnclosingRegionExceptionType(this BasicBlock basicBlock)
48public static IEnumerable<IOperation> DescendantOperations(this BasicBlock basicBlock)
70public static bool IsContainedInRegionOfKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
76public static ControlFlowRegion? GetContainingRegionOfKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
95public static bool IsFirstBlockOfFinally(this BasicBlock basicBlock, [NotNullWhen(returnValue: true)] out ControlFlowRegion? finallyRegion)
101public static bool IsLastBlockOfFinally(this BasicBlock basicBlock, [NotNullWhen(returnValue: true)] out ControlFlowRegion? finallyRegion)
107public static bool IsFirstBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, [NotNullWhen(returnValue: true)] out ControlFlowRegion? region)
113public static bool IsLastBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, [NotNullWhen(returnValue: true)] out ControlFlowRegion? region)
116private static bool IsFirstOrLastBlockOfRegionKind(this BasicBlock basicBlock, ControlFlowRegionKind regionKind, bool first, [NotNullWhen(returnValue: true)] out ControlFlowRegion? foundRegion)
144public static bool IsFirstBlockOfCompilerGeneratedFinally(this BasicBlock basicBlock, ControlFlowGraph cfg)
162internal static ControlFlowRegion? GetInnermostRegionStartedByBlock(this BasicBlock basicBlock, ControlFlowRegionKind regionKind)
189internal static int GetMaxSuccessorOrdinal(this BasicBlock basicBlock)
193internal static bool DominatesPredecessors(this BasicBlock? basicBlock, ControlFlowGraph cfg)
205var sourceBlock = predecessor.Source;
222var sourceBlock = cfg.Blocks[ordinal];
232static bool DominatesBlock(BasicBlock sourceBlock, BasicBlock basicBlock, PooledHashSet<int> processedOrdinals, ArrayBuilder<int> unprocessedOrdinals)
236static bool DominatesBranch(ControlFlowBranch? branch, BasicBlock basicBlock, PooledHashSet<int> processedOrdinals, ArrayBuilder<int> unprocessedOrdinals)
238var destinationBlock = branch?.Destination;
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\Extensions\ControlFlowRegionExtensions.cs (1)
18var block = cfg.Blocks[i];
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowAnalysis.cs (22)
62using var uniqueSuccessors = PooledHashSet<BasicBlock>.GetInstance();
98foreach (var block in cfg.Blocks)
103var entry = cfg.GetEntry();
133foreach (var block in cfg.Blocks)
186PooledHashSet<BasicBlock> uniqueSuccessors,
196foreach (var block in cfg.Blocks)
221var block = cfg.Blocks[blockOrdinal];
336var successorBlock = successorWithBranch.Destination;
488static ControlFlowRegion? TryGetReachableCatchRegionStartingHandler(ControlFlowRegion tryAndCatchRegion, BasicBlock sourceBlock)
504ControlFlowRegion? MergeIntoCatchInputData(ControlFlowRegion tryAndCatchRegion, TAnalysisData dataToMerge, BasicBlock sourceBlock)
512var catchBlock = cfg.Blocks[catchRegion.FirstBlockOrdinal];
571var block = cfg.Blocks[blockOrdinal];
581bool HasUnprocessedPredecessorBlock(BasicBlock block)
590static ControlFlowRegion? GetEnclosingTryAndCatchRegionIfStartsHandler(BasicBlock block)
618IEnumerable<(BranchWithInfo successorWithBranch, BranchWithInfo? preadjustSuccessorWithBranch)> GetSuccessorsWithAdjustedBranches(BasicBlock basicBlock)
653var destination = cfg.Blocks[firstFinally.FirstBlockOrdinal];
664void UpdateFinallySuccessorsAndCatchInput(BranchWithInfo branch, TAnalysisData branchData, BasicBlock sourceBlock)
751BasicBlock block,
777protected abstract TBlockAnalysisResult ToBlockResult(BasicBlock basicBlock, TAnalysisData blockAnalysisData);
779private void UpdateInput(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newInput)
785private void CloneAndUpdateOutputIfEntryOrExitBlock(DataFlowAnalysisResultBuilder<TAnalysisData> builder, BasicBlock block, TAnalysisData newOutput)
804var block = cfg.Blocks[i];
src\sdk\src\Microsoft.CodeAnalysis.NetAnalyzers\src\Utilities\FlowAnalysis\FlowAnalysis\Framework\DataFlow\DataFlowOperationVisitor.cs (17)
54private BasicBlock? _currentBasicBlock;
184protected BasicBlock CurrentBasicBlock
226private Dictionary<BasicBlock, ThrownExceptionInfo>? _exceptionPathsThrownExceptionInfoMap;
233_exceptionPathsThrownExceptionInfoMap ??= new Dictionary<BasicBlock, ThrownExceptionInfo>();
416public virtual TAnalysisData Flow(IOperation statement, BasicBlock block, TAnalysisData input)
438public TAnalysisData OnStartBlockAnalysis(BasicBlock block, TAnalysisData input)
470public TAnalysisData OnEndBlockAnalysis(BasicBlock block, TAnalysisData analysisData)
546private void OnStartEntryBlockAnalysis(BasicBlock entryBlock)
579private void OnStartExitBlockAnalysis(BasicBlock exitBlock)
646private void OnEndExitBlockAnalysis(BasicBlock exitBlock)
678BasicBlock fromBlock,
940BasicBlock currentBasicBlock,
1353protected virtual void UpdateReachability(BasicBlock basicBlock, TAnalysisData analysisData, bool isReachable)
1365private bool GetBlockReachability(BasicBlock basicBlock)
2077public TAnalysisData MergeAnalysisData(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock, bool forBackEdge)
2080protected virtual TAnalysisData MergeAnalysisData(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock)
2082protected virtual TAnalysisData MergeAnalysisDataForBackEdge(TAnalysisData value1, TAnalysisData value2, BasicBlock forBlock)