diff --git a/src/LanguageServer/Protocol/Handler/References/FindUsagesLSPContext.cs b/src/LanguageServer/Protocol/Handler/References/FindUsagesLSPContext.cs index 92c7cec421960..a9fa355459e8c 100644 --- a/src/LanguageServer/Protocol/Handler/References/FindUsagesLSPContext.cs +++ b/src/LanguageServer/Protocol/Handler/References/FindUsagesLSPContext.cs @@ -138,7 +138,7 @@ public override async ValueTask OnReferencesFoundAsync(IAsyncEnumerable LspTestCompositions.LanguageServerProtocol .AddParts(typeof(TestDocumentTrackingService)) .AddParts(typeof(TestWorkspaceRegistrationService)); @@ -26,25 +23,143 @@ public FindAllReferencesHandlerFeaturesTests(ITestOutputHelper? testOutputHelper public async Task TestFindAllReferencesAsync_DoesNotUseVSTypes(bool mutatingLspWorkspace) { var markup = -@"class A -{ - public int {|reference:someInt|} = 1; - void M() - { - var i = {|reference:someInt|} + 1; + """ + class A + { + public int {|reference:someInt|} = 1; + void M() + { + var i = {|reference:someInt|} + 1; + } + } + class B + { + int someInt = A.{|reference:someInt|} + 1; + void M2() + { + var j = someInt + A.{|caret:|}{|reference:someInt|}; + } + } + """; + await using var testLspServer = await CreateTestLspServerAsync(markup, mutatingLspWorkspace, new LSP.ClientCapabilities()); + + var results = await FindAllReferencesHandlerTests.RunFindAllReferencesNonVSAsync(testLspServer, testLspServer.GetLocations("caret").First()); + AssertLocationsEqual(testLspServer.GetLocations("reference"), results.Select(result => result)); } -} -class B -{ - int someInt = A.{|reference:someInt|} + 1; - void M2() + + [Theory, CombinatorialData] + public async Task TestFindAllReferencesAsync_LargeNumberOfReferences(bool mutatingLspWorkspace) { - var j = someInt + A.{|caret:|}{|reference:someInt|}; - } -}"; + var markup = + """ + using System.Threading.Tasks + class A + { + private {|caret:Task|} someTask = Task.CompletedTask; + } + """; await using var testLspServer = await CreateTestLspServerAsync(markup, mutatingLspWorkspace, new LSP.ClientCapabilities()); + for (var i = 0; i < 100; i++) + { + var source = $$""" + using System.Threading.Tasks + class SomeClass{{i}} + { + private Task someTask; + } + """; + + var testDocument = new EditorTestHostDocument(text: source, displayName: @$"C:\SomeFile{i}.cs", exportProvider: testLspServer.TestWorkspace.ExportProvider, filePath: @$"C:\SomeFile{i}.cs"); + testLspServer.TestWorkspace.AddTestProject(new EditorTestHostProject(testLspServer.TestWorkspace, documents: new[] { testDocument })); + } + + await WaitForWorkspaceOperationsAsync(testLspServer.TestWorkspace); + var results = await FindAllReferencesHandlerTests.RunFindAllReferencesNonVSAsync(testLspServer, testLspServer.GetLocations("caret").First()); - AssertLocationsEqual(testLspServer.GetLocations("reference"), results.Select(result => result)); + Assert.Equal(103, results.Length); + } + + [Theory, CombinatorialData] + public async Task TestFindAllReferencesAsync_LinkedFile(bool mutatingLspWorkspace, [CombinatorialRange(0, 10)] int iteration) + { + _ = iteration; + var markup = + """ + using System.Threading.Tasks + class A + { + private void SomeMethod() + { + Do({|caret:Task|}.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + Do(Task.CompletedTask); + } + } + """; + + var workspaceXml = + $""" + + + {markup} + + + + + + """; + + await using var testLspServer = await CreateXmlTestLspServerAsync(workspaceXml, mutatingLspWorkspace, initializationOptions: new InitializationOptions + { + ClientCapabilities = new LSP.ClientCapabilities() + }); + + await WaitForWorkspaceOperationsAsync(testLspServer.TestWorkspace); + + var results = await FindAllReferencesHandlerTests.RunFindAllReferencesNonVSAsync(testLspServer, testLspServer.GetLocations("caret").First()); + Assert.Equal(46, results.Length); } }