Skip to content

Commit 812c9bc

Browse files
committed
Fix the order of the results and deduplication
1 parent 64a2d44 commit 812c9bc

File tree

5 files changed

+38
-65
lines changed

5 files changed

+38
-65
lines changed

internal/lsp/server.go

Lines changed: 32 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"io"
8-
"maps"
8+
"iter"
99
"runtime/debug"
1010
"slices"
1111
"sync"
@@ -596,7 +596,7 @@ func registerMultiProjectReferenceRequestHandler[Req lsproto.HasTextDocumentPosi
596596
handlers handlerMap,
597597
info lsproto.RequestInfo[Req, Resp],
598598
fn func(*Server, context.Context, *ls.LanguageService, Req, *ast.Node, []*ls.SymbolAndEntries) (Resp, error),
599-
combineResults func(*project.Project, map[tspath.Path]Resp) Resp,
599+
combineResults func(iter.Seq[Resp]) Resp,
600600
) {
601601
handlers[info.Method] = func(s *Server, ctx context.Context, req *lsproto.RequestMessage) error {
602602
var params Req
@@ -612,7 +612,7 @@ func registerMultiProjectReferenceRequestHandler[Req lsproto.HasTextDocumentPosi
612612
defer s.recover(req)
613613

614614
var queue []projectAndTextDocumentPosition
615-
results := make(map[tspath.Path]Resp)
615+
var results collections.OrderedMap[tspath.Path, Resp]
616616
var defaultDefinition *ls.NonLocalDefinition
617617

618618
searchPosition := func(project *project.Project, ls *ls.LanguageService, uri lsproto.DocumentUri, position lsproto.Position) (Resp, error) {
@@ -632,7 +632,7 @@ func registerMultiProjectReferenceRequestHandler[Req lsproto.HasTextDocumentPosi
632632
}
633633
for _, defProject := range defProjects {
634634
// Optimization: don't enqueue if will be discarded
635-
if _, alreadyDone := results[defProject.Id()]; !alreadyDone {
635+
if !results.Has(defProject.Id()) {
636636
queue = append(queue, projectAndTextDocumentPosition{
637637
project: defProject,
638638
Uri: uri,
@@ -675,7 +675,7 @@ func registerMultiProjectReferenceRequestHandler[Req lsproto.HasTextDocumentPosi
675675
item := queue[0]
676676
queue = queue[1:]
677677

678-
if _, ok := results[item.project.Id()]; ok {
678+
if results.Has(item.project.Id()) {
679679
continue
680680
}
681681

@@ -689,7 +689,7 @@ func registerMultiProjectReferenceRequestHandler[Req lsproto.HasTextDocumentPosi
689689
}
690690
}
691691
if result, err := searchPosition(item.project, ls, item.Uri, item.Position); err == nil {
692-
results[item.project.Id()] = result
692+
results.Set(item.project.Id(), result)
693693
} else {
694694
return err
695695
}
@@ -698,12 +698,11 @@ func registerMultiProjectReferenceRequestHandler[Req lsproto.HasTextDocumentPosi
698698
if defaultDefinition != nil {
699699
if err := s.session.ForEachProjectLocationLoadingProjectTree(
700700
ctx,
701-
maps.Keys(results),
701+
results.Keys(),
702702
defaultDefinition,
703703
// Can loop forever without this (enqueue here, dequeue above, repeat)
704704
func(projectFromSnapshot *project.Project) bool {
705-
_, ok := results[projectFromSnapshot.Id()]
706-
return !ok
705+
return !results.Has(projectFromSnapshot.Id())
707706
},
708707
func(project *project.Project, uri lsproto.DocumentUri, position lsproto.Position) {
709708
// Enqueue the project and location for further processing
@@ -720,10 +719,10 @@ func registerMultiProjectReferenceRequestHandler[Req lsproto.HasTextDocumentPosi
720719
}
721720

722721
var resp Resp
723-
if len(results) > 1 {
724-
resp = combineResults(defaultProject, results)
722+
if results.Size() > 1 {
723+
resp = combineResults(results.Values())
725724
} else {
726-
for _, value := range results {
725+
for value := range results.Values() {
727726
resp = value
728727
break
729728
}
@@ -1009,25 +1008,15 @@ func (s *Server) handleReferences(ctx context.Context, ls *ls.LanguageService, p
10091008
return ls.ProvideReferencesFromSymbolAndEntries(ctx, params, originalNode, symbolAndEntries)
10101009
}
10111010

1012-
func combineReferences(defaultProject *project.Project, results map[tspath.Path]lsproto.ReferencesResponse) lsproto.ReferencesResponse {
1011+
func combineReferences(results iter.Seq[lsproto.ReferencesResponse]) lsproto.ReferencesResponse {
10131012
var combined []lsproto.Location
10141013
var seenLocations collections.Set[lsproto.Location]
1015-
if resp, ok := results[defaultProject.Id()]; ok {
1014+
for resp := range results {
10161015
if resp.Locations != nil {
10171016
for _, loc := range *resp.Locations {
1018-
seenLocations.Add(loc)
1019-
combined = append(combined, loc)
1020-
}
1021-
}
1022-
}
1023-
for projectID, resp := range results {
1024-
if projectID != defaultProject.Id() {
1025-
if resp.Locations != nil {
1026-
for _, loc := range *resp.Locations {
1027-
if !seenLocations.Has(loc) {
1028-
seenLocations.Add(loc)
1029-
combined = append(combined, loc)
1030-
}
1017+
if !seenLocations.Has(loc) {
1018+
seenLocations.Add(loc)
1019+
combined = append(combined, loc)
10311020
}
10321021
}
10331022
}
@@ -1112,48 +1101,32 @@ func (s *Server) handleRename(ctx context.Context, ls *ls.LanguageService, param
11121101
return ls.ProvideRenameFromSymbolAndEntries(ctx, params, originalNode, symbolAndEntries)
11131102
}
11141103

1115-
func combineRenameResponse(defaultProject *project.Project, results map[tspath.Path]lsproto.RenameResponse) lsproto.RenameResponse {
1104+
func combineRenameResponse(results iter.Seq[lsproto.RenameResponse]) lsproto.RenameResponse {
11161105
combined := make(map[lsproto.DocumentUri][]*lsproto.TextEdit)
1117-
seenChanges := make(map[lsproto.DocumentUri]*collections.Set[lsproto.TextEdit])
1106+
seenChanges := make(map[lsproto.DocumentUri]*collections.Set[lsproto.Range])
11181107
// !!! this is not used any more so we will skip this part of deduplication and combining
11191108
// DocumentChanges *[]TextDocumentEditOrCreateFileOrRenameFileOrDeleteFile `json:"documentChanges,omitzero"`
11201109
// ChangeAnnotations *map[string]*ChangeAnnotation `json:"changeAnnotations,omitzero"`
11211110

1122-
if resp, ok := results[defaultProject.Id()]; ok {
1111+
for resp := range results {
11231112
if resp.WorkspaceEdit != nil && resp.WorkspaceEdit.Changes != nil {
11241113
for doc, changes := range *resp.WorkspaceEdit.Changes {
1125-
seenSet := collections.Set[lsproto.TextEdit]{}
1126-
seenChanges[doc] = &seenSet
1127-
var changesForDoc []*lsproto.TextEdit
1128-
for _, change := range changes {
1129-
seenSet.Add(*change)
1130-
changesForDoc = append(changesForDoc, change)
1114+
seenSet, ok := seenChanges[doc]
1115+
if !ok {
1116+
seenSet = &collections.Set[lsproto.Range]{}
1117+
seenChanges[doc] = seenSet
11311118
}
1132-
combined[doc] = changesForDoc
1133-
}
1134-
}
1135-
}
1136-
for projectID, resp := range results {
1137-
if projectID != defaultProject.Id() {
1138-
if resp.WorkspaceEdit != nil && resp.WorkspaceEdit.Changes != nil {
1139-
for doc, changes := range *resp.WorkspaceEdit.Changes {
1140-
seenSet, ok := seenChanges[doc]
1141-
if !ok {
1142-
seenSet = &collections.Set[lsproto.TextEdit]{}
1143-
seenChanges[doc] = seenSet
1144-
}
1145-
changesForDoc, exists := combined[doc]
1146-
if !exists {
1147-
changesForDoc = []*lsproto.TextEdit{}
1148-
}
1149-
for _, change := range changes {
1150-
if !seenSet.Has(*change) {
1151-
seenSet.Add(*change)
1152-
changesForDoc = append(changesForDoc, change)
1153-
}
1119+
changesForDoc, exists := combined[doc]
1120+
if !exists {
1121+
changesForDoc = []*lsproto.TextEdit{}
1122+
}
1123+
for _, change := range changes {
1124+
if !seenSet.Has(change.Range) {
1125+
seenSet.Add(change.Range)
1126+
changesForDoc = append(changesForDoc, change)
11541127
}
1155-
combined[doc] = changesForDoc
11561128
}
1129+
combined[doc] = changesForDoc
11571130
}
11581131
}
11591132
}

testdata/baselines/reference/lspservertests/declarationMaps/rename-on-edit-at-end-with-disableSourceOfProjectReferenceRedirect.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ Config::
316316
// import {
317317
// fn1,
318318
// fn2,
319-
// [|[|fn3RENAME|]RENAME|],
319+
// [|fn3RENAME|],
320320
// fn4,
321321
// fn5
322322
// } from "../decls/FnS";
@@ -384,7 +384,7 @@ Projects::
384384
// import {
385385
// fn1,
386386
// fn2,
387-
// /*START PREFIX*/fn3 as [|/*START PREFIX*/fn3 as [|fn3RENAME|]RENAME|],
387+
// [|fn3RENAME|],
388388
// fn4,
389389
// fn5
390390
// } from "../decls/FnS";

testdata/baselines/reference/lspservertests/declarationMaps/rename-on-edit-at-end-with-project-references.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ Config::
320320
// import {
321321
// fn1,
322322
// fn2,
323-
// /*START PREFIX*/fn3 as [|/*START PREFIX*/fn3 as [|fn3RENAME|]RENAME|],
323+
// [|fn3RENAME|],
324324
// fn4,
325325
// fn5
326326
// } from "../decls/FnS";

testdata/baselines/reference/lspservertests/declarationMaps/rename-on-edit-with-disableSourceOfProjectReferenceRedirect.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ Config::
316316
// import {
317317
// fn1,
318318
// fn2,
319-
// /*START PREFIX*/fn3 as [|/*START PREFIX*/fn3 as [|fn3RENAME|]RENAME|],
319+
// [|fn3RENAME|],
320320
// fn4,
321321
// fn5
322322
// } from "../decls/FnS";
@@ -385,7 +385,7 @@ Projects::
385385
// import {
386386
// fn1,
387387
// fn2,
388-
// /*START PREFIX*/fn3 as [|/*START PREFIX*/fn3 as [|fn3RENAME|]RENAME|],
388+
// [|fn3RENAME|],
389389
// fn4,
390390
// fn5
391391
// } from "../decls/FnS";

testdata/baselines/reference/lspservertests/declarationMaps/rename-on-edit-with-project-references.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -320,7 +320,7 @@ Config::
320320
// import {
321321
// fn1,
322322
// fn2,
323-
// /*START PREFIX*/fn3 as [|/*START PREFIX*/fn3 as [|fn3RENAME|]RENAME|],
323+
// [|fn3RENAME|],
324324
// fn4,
325325
// fn5
326326
// } from "../decls/FnS";

0 commit comments

Comments
 (0)