public Task<HostCompilationStartAnalysisScope> GetCompilationAnalysisScopeAsync( HostSessionStartAnalysisScope sessionScope, AnalyzerExecutor analyzerExecutor) { Func<Compilation, Task<HostCompilationStartAnalysisScope>> getTask = comp => { return Task.Run(() => { var compilationAnalysisScope = new HostCompilationStartAnalysisScope(sessionScope); analyzerExecutor.ExecuteCompilationStartActions(sessionScope.CompilationStartActions, compilationAnalysisScope); return compilationAnalysisScope; }, analyzerExecutor.CancellationToken); }; var callback = new ConditionalWeakTable<Compilation, Task<HostCompilationStartAnalysisScope>>.CreateValueCallback(getTask); var compilationActionsCache = GetOrCreateCompilationActionsCache(analyzerExecutor.AnalyzerOptions); return compilationActionsCache.GetValue(analyzerExecutor.Compilation, callback); }
private Task<HostCompilationStartAnalysisScope> GetCompilationAnalysisScopeCoreAsync( AnalyzerAndOptions analyzerAndOptions, HostSessionStartAnalysisScope sessionScope, AnalyzerExecutor analyzerExecutor) { Func<Compilation, Task<HostCompilationStartAnalysisScope>> getTask = comp => { return Task.Run(() => { var compilationAnalysisScope = new HostCompilationStartAnalysisScope(sessionScope); analyzerExecutor.ExecuteCompilationStartActions(sessionScope.CompilationStartActions, compilationAnalysisScope); return compilationAnalysisScope; }, analyzerExecutor.CancellationToken); }; var callback = new ConditionalWeakTable<Compilation, Task<HostCompilationStartAnalysisScope>>.CreateValueCallback(getTask); var compilationActionsMap = _compilationScopeMap.GetOrAdd(analyzerAndOptions, new ConditionalWeakTable<Compilation, Task<HostCompilationStartAnalysisScope>>()); return compilationActionsMap.GetValue(analyzerExecutor.Compilation, callback); }
/// <summary> /// Initializes the compilation for the analyzer driver. /// It also computes and initializes <see cref="compilationAnalysisScope"/> and <see cref="_symbolActionsByKind"/>. /// Finally, it initializes and starts the <see cref="_primaryTask"/> for the driver. /// </summary> /// <remarks> /// NOTE: This method must only be invoked from <see cref="AnalyzerDriver.Create(Compilation, ImmutableArray{DiagnosticAnalyzer}, AnalyzerOptions, out Compilation, CancellationToken)"/>. /// </remarks> private void Initialize(Compilation comp, CancellationToken cancellationToken) { try { Debug.Assert(_compilation == null); Debug.Assert(comp.EventQueue == this.CompilationEventQueue); _compilation = comp; // Compute the set of effective actions based on suppression, and running the initial analyzers var sessionAnalysisScope = GetSessionAnalysisScope(_analyzers, comp.Options, _addDiagnostic, continueOnAnalyzerException, cancellationToken); this.compilationAnalysisScope = GetCompilationAnalysisScope(sessionAnalysisScope, comp, analyzerOptions, _addDiagnostic, continueOnAnalyzerException, cancellationToken); _symbolActionsByKind = MakeSymbolActionsByKind(); _semanticModelActionsMap = MakeSemanticModelActionsByAnalyzer(); _compilationEndActionsMap = MakeCompilationEndActionsByAnalyzer(); // create the primary driver task. cancellationToken.ThrowIfCancellationRequested(); _primaryTask = Task.Run(async () => { await ProcessCompilationEventsAsync(cancellationToken).ConfigureAwait(false); await ExecuteSyntaxTreeActions(cancellationToken).ConfigureAwait(false); }, cancellationToken) .ContinueWith(c => DiagnosticQueue.TryComplete(), cancellationToken, TaskContinuationOptions.ExecuteSynchronously, TaskScheduler.Default); } finally { if (_primaryTask == null) { // Set primaryTask to be a cancelled task. var tcs = new TaskCompletionSource<int>(); tcs.SetCanceled(); _primaryTask = tcs.Task; // Try to set the DiagnosticQueue to be complete. this.DiagnosticQueue.TryComplete(); } } }
public AnalyzerCompilationStartAnalysisScope(DiagnosticAnalyzer analyzer, HostCompilationStartAnalysisScope scope) { this.analyzer = analyzer; this.scope = scope; }
private static HostCompilationStartAnalysisScope GetCompilationAnalysisScope(HostSessionStartAnalysisScope session, Compilation compilation, AnalyzerOptions analyzerOptions, Action<Diagnostic> addDiagnostic, Func<Exception, DiagnosticAnalyzer, bool> continueOnAnalyzerException, CancellationToken cancellationToken) { HostCompilationStartAnalysisScope compilationScope = new HostCompilationStartAnalysisScope(session); foreach (CompilationStartAnalyzerAction startAction in session.CompilationStartActions) { cancellationToken.ThrowIfCancellationRequested(); AnalyzerDriverHelper.ExecuteAndCatchIfThrows(startAction.Analyzer, addDiagnostic, continueOnAnalyzerException, () => { startAction.Action(new AnalyzerCompilationStartAnalysisContext(startAction.Analyzer, compilationScope, compilation, analyzerOptions, cancellationToken)); }, cancellationToken); } return compilationScope; }