/// <summary> /// Initializes the <see cref="analyzerActions"/> and related actions maps for the analyzer driver. /// It kicks off the <see cref="WhenInitializedTask"/> task for initialization. /// Note: This method must be invoked exactly once on the driver. /// </summary> private void Initialize(AnalyzerExecutor analyzerExecutor, DiagnosticQueue diagnosticQueue, CancellationToken cancellationToken) { try { Debug.Assert(_initializeTask == null); this.analyzerExecutor = analyzerExecutor; this.DiagnosticQueue = diagnosticQueue; // Compute the set of effective actions based on suppression, and running the initial analyzers var analyzerActionsTask = GetAnalyzerActionsAsync(analyzers, analyzerManager, analyzerExecutor); _initializeTask = analyzerActionsTask.ContinueWith(t => { this.analyzerActions = t.Result; _symbolActionsByKind = MakeSymbolActionsByKind(); _semanticModelActionsMap = MakeSemanticModelActionsByAnalyzer(); _syntaxTreeActionsMap = MakeSyntaxTreeActionsByAnalyzer(); _compilationActionsMap = MakeCompilationActionsByAnalyzer(this.analyzerActions.CompilationActions); _compilationEndActionsMap = MakeCompilationActionsByAnalyzer(this.analyzerActions.CompilationEndActions); }, cancellationToken, TaskContinuationOptions.None, TaskScheduler.Default); // create the primary driver task. cancellationToken.ThrowIfCancellationRequested(); _initializeSucceeded = true; } finally { if (_initializeTask == null) { // Set initializeTask to be a cancelled task. var tcs = new TaskCompletionSource<int>(); tcs.SetCanceled(); _initializeTask = tcs.Task; // Set primaryTask to be a cancelled task. tcs = new TaskCompletionSource<int>(); tcs.SetCanceled(); _primaryTask = tcs.Task; // Try to set the DiagnosticQueue to be complete. this.DiagnosticQueue.TryComplete(); } } }
/// <summary> /// Initializes the <see cref="analyzerActions"/> and related actions maps for the analyzer driver. /// It kicks off the <see cref="WhenInitializedTask"/> task for initialization. /// Note: This method must be invoked exactly once on the driver. /// </summary> private void Initialize(AnalyzerExecutor analyzerExecutor, DiagnosticQueue diagnosticQueue, CompilationData compilationData, CancellationToken cancellationToken) { try { Debug.Assert(_initializeTask == null); this.analyzerExecutor = analyzerExecutor; this.compilationData = compilationData; this.DiagnosticQueue = diagnosticQueue; // Compute the set of effective actions based on suppression, and running the initial analyzers _initializeTask = Task.Run(async () => { var unsuppressedAnalyzers = GetUnsuppressedAnalyzers(analyzers, analyzerManager, analyzerExecutor); this.analyzerActions = await GetAnalyzerActionsAsync(unsuppressedAnalyzers, analyzerManager, analyzerExecutor).ConfigureAwait(false); _analyzerGateMap = await GetAnalyzerGateMapAsync(unsuppressedAnalyzers, analyzerManager, analyzerExecutor).ConfigureAwait(false); _generatedCodeAnalysisFlagsMap = await GetGeneratedCodeAnalysisFlagsAsync(unsuppressedAnalyzers, analyzerManager, analyzerExecutor).ConfigureAwait(false); _doNotAnalyzeGeneratedCode = ShouldSkipAnalysisOnGeneratedCode(unsuppressedAnalyzers); _treatAllCodeAsNonGeneratedCode = ShouldTreatAllCodeAsNonGeneratedCode(unsuppressedAnalyzers, _generatedCodeAnalysisFlagsMap); _lazyGeneratedCodeFilesMap = _treatAllCodeAsNonGeneratedCode ? null : new Dictionary<SyntaxTree, bool>(); _lazyGeneratedCodeSymbolsMap = _treatAllCodeAsNonGeneratedCode ? null : new Dictionary<SyntaxTree, ImmutableHashSet<ISymbol>>(); _generatedCodeAttribute = analyzerExecutor.Compilation?.GetTypeByMetadataName("System.CodeDom.Compiler.GeneratedCodeAttribute"); _symbolActionsByKind = MakeSymbolActionsByKind(); _semanticModelActionsMap = MakeSemanticModelActionsByAnalyzer(); _syntaxTreeActionsMap = MakeSyntaxTreeActionsByAnalyzer(); _compilationActionsMap = MakeCompilationActionsByAnalyzer(this.analyzerActions.CompilationActions); _compilationEndActionsMap = MakeCompilationActionsByAnalyzer(this.analyzerActions.CompilationEndActions); }, cancellationToken); // create the primary driver task. cancellationToken.ThrowIfCancellationRequested(); _initializeSucceeded = true; } finally { if (_initializeTask == null) { // Set initializeTask to be a cancelled task. var tcs = new TaskCompletionSource<int>(); tcs.SetCanceled(); _initializeTask = tcs.Task; // Set primaryTask to be a cancelled task. tcs = new TaskCompletionSource<int>(); tcs.SetCanceled(); _primaryTask = tcs.Task; // Try to set the DiagnosticQueue to be complete. this.DiagnosticQueue.TryComplete(); } } }