internal static async Task AddUsingTaskEqualsDirectiveAsync()

in src/Microsoft.VisualStudio.SDK.Analyzers/Utils.cs [239:260]


        internal static async Task<SyntaxNode> AddUsingTaskEqualsDirectiveAsync(SyntaxNode syntaxNode, CancellationToken cancellationToken)
        {
            IEnumerable<UsingDirectiveSyntax> existingUsings = syntaxNode.AncestorsAndSelf().OfType<UsingDirectiveSyntax>().Concat(
                syntaxNode.DescendantNodes(n => n is CompilationUnitSyntax || n is NamespaceDeclarationSyntax).OfType<UsingDirectiveSyntax>());
            if (existingUsings.Any(u => u.Alias?.Name?.Identifier.ValueText == nameof(Task)))
            {
                // The user has already aliased Task.
                return syntaxNode;
            }

            var trackAnnotation = new SyntaxAnnotation();
            syntaxNode = syntaxNode.WithAdditionalAnnotations(trackAnnotation);

            UsingDirectiveSyntax usingTaskDirective = SyntaxFactory.UsingDirective(
                QualifyName(Namespaces.SystemThreadingTasks, SyntaxFactory.IdentifierName(nameof(Task))))
                .WithAlias(SyntaxFactory.NameEquals(nameof(Task)));

            var syntaxRoot = (CompilationUnitSyntax)await syntaxNode.SyntaxTree.GetRootAsync(cancellationToken);
            syntaxRoot = syntaxRoot.AddUsings(usingTaskDirective);

            return syntaxRoot.GetAnnotatedNodes(trackAnnotation).Single();
        }