Example #1
0
            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);
            }
Example #2
0
            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());
            }
 /// <summary>
 /// Runs dataflow analysis on the given control flow graph to compute symbol usage results
 /// for symbol read/writes.
 /// </summary>
 public static SymbolUsageResult Run(ControlFlowGraph cfg, ISymbol owningSymbol, CancellationToken cancellationToken)
 => DataFlowAnalyzer.RunAnalysis(cfg, owningSymbol, cancellationToken);