private Task ExecuteSyntaxTreeActions(CancellationToken cancellationToken) { // Execute syntax tree analyzers in parallel. var tasks = ArrayBuilder <Task> .GetInstance(); foreach (var tree in _compilation.SyntaxTrees) { var actionsByAnalyzers = this.analyzerActions.SyntaxTreeActions.GroupBy(action => action.Analyzer); foreach (var analyzerAndActions in actionsByAnalyzers) { var task = Task.Run(() => { // Execute actions for a given analyzer sequentially. analyzerExecutor.ExecuteSyntaxTreeActions(analyzerAndActions.ToImmutableArray(), tree); }, cancellationToken); tasks.Add(task); } } return(Task.WhenAll(tasks.ToArrayAndFree())); }