Skip to content

Commit

Permalink
Merge pull request #74566 from dibarbet/far_test
Browse files Browse the repository at this point in the history
  • Loading branch information
CyrusNajmabadi authored Jul 26, 2024
2 parents 9a792ff + 88c618c commit e8c1ac0
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -138,15 +138,15 @@ public override async ValueTask OnReferencesFoundAsync(IAsyncEnumerable<SourceRe
// Each reference should be associated with a definition. If this somehow isn't the
// case, we bail out early.
if (!_definitionToId.TryGetValue(reference.Definition, out var definitionId))
return;
continue;

var documentSpan = reference.SourceSpan;
var document = documentSpan.Document;

// If this is reference to the same physical location we've already reported, just
// filter this out. it will clutter the UI to show the same places.
if (!_referenceLocations.Add((document.FilePath, reference.SourceSpan.SourceSpan)))
return;
continue;

// If the definition hasn't been reported yet, add it to our list of references to report.
if (_definitionsWithoutReference.TryGetValue(definitionId, out var definition))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,9 @@
using LSP = Roslyn.LanguageServer.Protocol;

namespace Microsoft.CodeAnalysis.LanguageServer.UnitTests.References;
public class FindAllReferencesHandlerFeaturesTests : AbstractLanguageServerProtocolTests
public sealed class FindAllReferencesHandlerFeaturesTests(ITestOutputHelper? testOutputHelper)
: AbstractLanguageServerProtocolTests(testOutputHelper)
{
public FindAllReferencesHandlerFeaturesTests(ITestOutputHelper? testOutputHelper) : base(testOutputHelper)
{
}

protected override TestComposition Composition => LspTestCompositions.LanguageServerProtocol
.AddParts(typeof(TestDocumentTrackingService))
.AddParts(typeof(TestWorkspaceRegistrationService));
Expand All @@ -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 =
$"""
<Workspace>
<Project Language="C#" CommonReferences="true" AssemblyName="CSProj1">
<Document FilePath="C:\C.cs">{markup}</Document>
</Project>
<Project Language="C#" CommonReferences="true" AssemblyName="CSProj2">
<Document IsLinkFile="true" LinkFilePath="C:\C.cs" LinkAssemblyName="CSProj1"></Document>
</Project>
</Workspace>
""";

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

0 comments on commit e8c1ac0

Please sign in to comment.