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();
}