private async Task<HostCompilationStartAnalysisScope> GetCompilationAnalysisScopeAsync( DiagnosticAnalyzer analyzer, HostSessionStartAnalysisScope sessionScope, AnalyzerExecutor analyzerExecutor) { var analyzerAndOptions = new AnalyzerAndOptions(analyzer, analyzerExecutor.AnalyzerOptions); try { return await GetCompilationAnalysisScopeCoreAsync(analyzerAndOptions, sessionScope, analyzerExecutor).ConfigureAwait(false); } catch (OperationCanceledException) { // Task to compute the scope was cancelled. // Clear the entry in scope map for analyzer, so we can attempt a retry. ConditionalWeakTable<Compilation, Task<HostCompilationStartAnalysisScope>> compilationActionsMap; if (_compilationScopeMap.TryGetValue(analyzerAndOptions, out compilationActionsMap)) { compilationActionsMap.Remove(analyzerExecutor.Compilation); } analyzerExecutor.CancellationToken.ThrowIfCancellationRequested(); return await GetCompilationAnalysisScopeAsync(analyzer, sessionScope, analyzerExecutor).ConfigureAwait(false); } }
private async Task<HostCompilationStartAnalysisScope> GetCompilationAnalysisScopeAsync( DiagnosticAnalyzer analyzer, HostSessionStartAnalysisScope sessionScope, AnalyzerExecutor analyzerExecutor) { var analyzerExecutionContext = _analyzerExecutionContextMap.GetOrCreateValue(analyzer); return await GetCompilationAnalysisScopeCoreAsync(sessionScope, analyzerExecutor, analyzerExecutionContext).ConfigureAwait(false); }
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); }
private async Task<HostCompilationStartAnalysisScope> GetCompilationAnalysisScopeCoreAsync( HostSessionStartAnalysisScope sessionScope, AnalyzerExecutor analyzerExecutor, AnalyzerExecutionContext analyzerExecutionContext) { try { return await analyzerExecutionContext.GetCompilationAnalysisScopeAsync(sessionScope, analyzerExecutor).ConfigureAwait(false); } catch (OperationCanceledException) { // Task to compute the scope was cancelled. // Clear the entry in scope map for analyzer, so we can attempt a retry. analyzerExecutionContext.ClearCompilationScopeMap(analyzerExecutor.AnalyzerOptions, analyzerExecutor.Compilation); analyzerExecutor.CancellationToken.ThrowIfCancellationRequested(); return await GetCompilationAnalysisScopeCoreAsync(sessionScope, analyzerExecutor, analyzerExecutionContext).ConfigureAwait(false); } }
public Task<HostSessionStartAnalysisScope> GetSessionAnalysisScopeTask(DiagnosticAnalyzer analyzer, AnalyzerExecutor analyzerExecutor) { lock (_gate) { Task<HostSessionStartAnalysisScope> task; if (_lazySessionScopeTask != null) { return _lazySessionScopeTask; } task = Task.Run(() => { var sessionScope = new HostSessionStartAnalysisScope(); analyzerExecutor.ExecuteInitializeMethod(analyzer, sessionScope); return sessionScope; }, analyzerExecutor.CancellationToken); _lazySessionScopeTask = task; return task; } }
private Task<HostSessionStartAnalysisScope> GetSessionAnalysisScopeCoreAsync( DiagnosticAnalyzer analyzer, AnalyzerExecutor analyzerExecutor) { Func<DiagnosticAnalyzer, Task<HostSessionStartAnalysisScope>> getTask = a => { return Task.Run(() => { var sessionScope = new HostSessionStartAnalysisScope(); analyzerExecutor.ExecuteInitializeMethod(a, sessionScope); return sessionScope; }, analyzerExecutor.CancellationToken); }; return _sessionScopeMap.GetOrAdd(analyzer, getTask); }
private Task<HostSessionStartAnalysisScope> GetSessionAnalysisScopeTask_NoLock( DiagnosticAnalyzer analyzer, AnalyzerExecutor analyzerExecutor) { Task<HostSessionStartAnalysisScope> task; if (_sessionScopeMap.TryGetValue(analyzer, out task)) { return task; } task = Task.Run(() => { var sessionScope = new HostSessionStartAnalysisScope(); analyzerExecutor.ExecuteInitializeMethod(analyzer, sessionScope); return sessionScope; }, analyzerExecutor.CancellationToken); _sessionScopeMap.Add(analyzer, task); return task; }
public AnalyzerSessionStartAnalysisScope(DiagnosticAnalyzer analyzer, HostSessionStartAnalysisScope scope) { this.analyzer = analyzer; this.scope = scope; }
public HostCompilationStartAnalysisScope(HostSessionStartAnalysisScope sessionScope) { this.sessionScope = sessionScope; }
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; }
private static HostSessionStartAnalysisScope GetSessionAnalysisScope( IEnumerable<DiagnosticAnalyzer> analyzers, CompilationOptions compilationOptions, Func<DiagnosticAnalyzer, CompilationOptions, Action<Diagnostic>, Func<Exception, DiagnosticAnalyzer, bool>, CancellationToken, bool> isAnalyzerSuppressed, Action<Diagnostic> addDiagnostic, Func<Exception, DiagnosticAnalyzer, bool> continueOnAnalyzerException, CancellationToken cancellationToken) { HostSessionStartAnalysisScope sessionScope = new HostSessionStartAnalysisScope(); foreach (DiagnosticAnalyzer analyzer in analyzers) { cancellationToken.ThrowIfCancellationRequested(); if (!isAnalyzerSuppressed(analyzer, compilationOptions, addDiagnostic, continueOnAnalyzerException, cancellationToken)) { AnalyzerDriverHelper.ExecuteAndCatchIfThrows(analyzer, addDiagnostic, continueOnAnalyzerException, () => { // The Initialize method should be run asynchronously in case it is not well behaved, e.g. does not terminate. analyzer.Initialize(new AnalyzerAnalysisContext(analyzer, sessionScope)); }, cancellationToken); } } return sessionScope; }