From 088b8813ce28eb4f299559a08acba78c08639948 Mon Sep 17 00:00:00 2001 From: Todd Grunke Date: Thu, 20 Feb 2025 23:12:44 -0800 Subject: [PATCH 1/2] WIP: Reduce the number of nodes that are walked during import completion commit. --- .../Core/Editing/ImportAdderService.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs index b836a2d0d8f01..4881a2fa2465a 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs @@ -38,7 +38,6 @@ public async Task AddImportsAsync( { var root = await document.GetRequiredSyntaxRootAsync(cancellationToken).ConfigureAwait(false); var addImportsService = document.GetRequiredLanguageService(); - var codeGenerator = document.GetRequiredLanguageService(); var generator = document.GetRequiredLanguageService(); // Create a simple interval tree for simplification spans. @@ -53,13 +52,20 @@ public async Task AddImportsAsync( // // We'll dive under the parent because it overlaps with the span. But we only want to include (and dive // into) B and C not A and D. - var nodes = root.DescendantNodesAndSelf(OverlapsWithSpan).Where(OverlapsWithSpan); - if (strategy == Strategy.AddImportsFromSymbolAnnotations) - return await AddImportDirectivesFromSymbolAnnotationsAsync(document, nodes, addImportsService, generator, options, cancellationToken).ConfigureAwait(false); + { + var nodes = root.DescendantNodesAndSelf(n => OverlapsWithSpan(n) && n.ContainsAnnotations).Where(OverlapsWithSpan); + var annotatedNodes = nodes.Where(x => x.HasAnnotations(SymbolAnnotation.Kind)); + + return await AddImportDirectivesFromSymbolAnnotationsAsync(document, annotatedNodes, addImportsService, generator, options, cancellationToken).ConfigureAwait(false); + } if (strategy == Strategy.AddImportsFromSyntaxes) + { + var nodes = root.DescendantNodesAndSelf(OverlapsWithSpan).Where(OverlapsWithSpan); + return await AddImportDirectivesFromSyntaxesAsync(document, nodes, addImportsService, generator, options, cancellationToken).ConfigureAwait(false); + } throw ExceptionUtilities.UnexpectedValue(strategy); @@ -165,7 +171,7 @@ private async Task AddImportDirectivesFromSyntaxesAsync( private async Task AddImportDirectivesFromSymbolAnnotationsAsync( Document document, - IEnumerable syntaxNodes, + IEnumerable annotatedNodes, IAddImportsService addImportsService, SyntaxGenerator generator, AddImportPlacementOptions options, @@ -182,7 +188,6 @@ private async Task AddImportDirectivesFromSymbolAnnotationsAsync( #endif SyntaxNode? first = null, last = null; - var annotatedNodes = syntaxNodes.Where(x => x.HasAnnotations(SymbolAnnotation.Kind)); foreach (var annotatedNode in annotatedNodes) { From f10423959c8687034f01e6bf23789e9731cd9846 Mon Sep 17 00:00:00 2001 From: Todd Grunke Date: Fri, 21 Feb 2025 20:02:10 -0800 Subject: [PATCH 2/2] usings cleanup --- .../Workspace/Core/Editing/ImportAdderService.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs index 4881a2fa2465a..91ee326561e99 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Workspace/Core/Editing/ImportAdderService.cs @@ -2,14 +2,12 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -using System; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using System.Threading; using System.Threading.Tasks; using Microsoft.CodeAnalysis.AddImport; -using Microsoft.CodeAnalysis.CodeGeneration; using Microsoft.CodeAnalysis.Formatting; using Microsoft.CodeAnalysis.Host; using Microsoft.CodeAnalysis.PooledObjects;