private static BasicBlockAnalysisData AnalyzeLocalFunctionOrLambdaInvocation( IMethodSymbol localFunctionOrLambda, ControlFlowGraph cfg, AnalysisData parentAnalysisData, CancellationToken cancellationToken) { Debug.Assert(localFunctionOrLambda.IsLocalFunction() || localFunctionOrLambda.IsAnonymousFunction()); cancellationToken.ThrowIfCancellationRequested(); using var analyzer = new DataFlowAnalyzer(cfg, localFunctionOrLambda, (FlowGraphAnalysisData)parentAnalysisData); var resultBlockAnalysisData = CustomDataFlowAnalysis <BasicBlockAnalysisData> .Run(cfg, analyzer, cancellationToken); if (resultBlockAnalysisData == null) { // Unreachable exit block from lambda/local. // So use our current analysis data. return(parentAnalysisData.CurrentBlockAnalysisData); } // We need to return a cloned basic block analysis data as disposing the DataFlowAnalyzer // created above will dispose all basic block analysis data instances allocated by it. var clonedBasicBlockData = parentAnalysisData.CreateBlockAnalysisData(); clonedBasicBlockData.SetAnalysisDataFrom(resultBlockAnalysisData); return(clonedBasicBlockData); }
public static SymbolUsageResult RunAnalysis(ControlFlowGraph cfg, ISymbol owningSymbol, CancellationToken cancellationToken) { cancellationToken.ThrowIfCancellationRequested(); using var analyzer = new DataFlowAnalyzer(cfg, owningSymbol); _ = CustomDataFlowAnalysis <BasicBlockAnalysisData> .Run(cfg, analyzer, cancellationToken); return(analyzer._analysisData.ToResult()); }