Skip to content

Commit b2e299b

Browse files
committed
internal/lsp: allow the diff alorithm to be specified per view
Change-Id: Ib9d44d2012253189f87bc3b15a88b400f76ae955 Reviewed-on: https://go-review.googlesource.com/c/tools/+/198378 Run-TryBot: Ian Cottrell <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Rebecca Stambler <[email protected]>
1 parent 0a61691 commit b2e299b

File tree

6 files changed

+19
-14
lines changed

6 files changed

+19
-14
lines changed

internal/lsp/diff/diff_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ package diff_test
77
import (
88
"testing"
99

10+
"golang.org/x/tools/internal/lsp/diff"
1011
"golang.org/x/tools/internal/lsp/diff/difftest"
1112
)
1213

1314
func TestDiff(t *testing.T) {
14-
difftest.DiffTest(t)
15+
difftest.DiffTest(t, diff.MyersComputeEdits)
1516
}

internal/lsp/diff/difftest/difftest.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
"golang.org/x/tools/internal/span"
1515
)
1616

17-
func DiffTest(t *testing.T) {
17+
func DiffTest(t *testing.T, compute diff.ComputeEdits) {
1818
t.Helper()
1919
for _, test := range []struct{ name, in, out, unified string }{{
2020
name: "empty",
@@ -41,7 +41,7 @@ func DiffTest(t *testing.T) {
4141
in: "one\nthree\n",
4242
out: "one\ntwo\nthree\n",
4343
}} {
44-
edits := diff.ComputeEdits(span.FileURI("/"+test.name), test.in, test.out)
44+
edits := compute(span.FileURI("/"+test.name), test.in, test.out)
4545
got := diff.ApplyEdits(test.in, edits)
4646
if got != test.out {
4747
t.Logf("test %v had diff:%v\n", test.name, diff.ToUnified(test.name+".orig", test.name, test.in, edits))

internal/lsp/diff/hooks.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,10 @@ type TextEdit struct {
1818
NewText string
1919
}
2020

21+
type ComputeEdits func(uri span.URI, before, after string) []TextEdit
22+
2123
var (
22-
ComputeEdits func(uri span.URI, before, after string) []TextEdit
23-
ToUnified func(from, to string, before string, edits []TextEdit) string
24+
ToUnified func(from, to string, before string, edits []TextEdit) string
2425
)
2526

2627
func SortTextEdits(d []TextEdit) {

internal/lsp/diff/myers.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,10 @@ import (
1313
)
1414

1515
func init() {
16-
ComputeEdits = myersComputeEdits
1716
ToUnified = myersToUnified
1817
}
1918

20-
func myersComputeEdits(uri span.URI, before, after string) []TextEdit {
19+
func MyersComputeEdits(uri span.URI, before, after string) []TextEdit {
2120
u := myers.SplitLines(before)
2221
f := myers.SplitLines(after)
2322
return myersDiffToEdits(uri, myers.Operations(u, f))

internal/lsp/source/format.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ func Format(ctx context.Context, view View, f File) ([]protocol.TextEdit, error)
5555
if err != nil {
5656
return nil, err
5757
}
58-
return computeTextEdits(ctx, ph.File(), m, string(formatted))
58+
return computeTextEdits(ctx, view, ph.File(), m, string(formatted))
5959
}
6060

6161
fset := view.Session().Cache().FileSet()
@@ -68,7 +68,7 @@ func Format(ctx context.Context, view View, f File) ([]protocol.TextEdit, error)
6868
if err := format.Node(buf, fset, file); err != nil {
6969
return nil, err
7070
}
71-
return computeTextEdits(ctx, ph.File(), m, buf.String())
71+
return computeTextEdits(ctx, view, ph.File(), m, buf.String())
7272
}
7373

7474
func formatSource(ctx context.Context, s Snapshot, f File) ([]byte, error) {
@@ -134,7 +134,7 @@ func Imports(ctx context.Context, view View, f File) ([]protocol.TextEdit, error
134134
if err != nil {
135135
return nil, err
136136
}
137-
return computeTextEdits(ctx, ph.File(), m, string(formatted))
137+
return computeTextEdits(ctx, view, ph.File(), m, string(formatted))
138138
}
139139

140140
type ImportFix struct {
@@ -198,7 +198,7 @@ func AllImportsFixes(ctx context.Context, view View, f File) (edits []protocol.T
198198
if err != nil {
199199
return err
200200
}
201-
edits, err = computeTextEdits(ctx, ph.File(), m, string(formatted))
201+
edits, err = computeTextEdits(ctx, view, ph.File(), m, string(formatted))
202202
if err != nil {
203203
return err
204204
}
@@ -209,7 +209,7 @@ func AllImportsFixes(ctx context.Context, view View, f File) (edits []protocol.T
209209
if err != nil {
210210
return err
211211
}
212-
edits, err := computeTextEdits(ctx, ph.File(), m, string(formatted))
212+
edits, err := computeTextEdits(ctx, view, ph.File(), m, string(formatted))
213213
if err != nil {
214214
return err
215215
}
@@ -277,15 +277,15 @@ func hasListErrors(errors []packages.Error) bool {
277277
return false
278278
}
279279

280-
func computeTextEdits(ctx context.Context, fh FileHandle, m *protocol.ColumnMapper, formatted string) ([]protocol.TextEdit, error) {
280+
func computeTextEdits(ctx context.Context, view View, fh FileHandle, m *protocol.ColumnMapper, formatted string) ([]protocol.TextEdit, error) {
281281
ctx, done := trace.StartSpan(ctx, "source.computeTextEdits")
282282
defer done()
283283

284284
data, _, err := fh.Read(ctx)
285285
if err != nil {
286286
return nil, err
287287
}
288-
edits := diff.ComputeEdits(fh.Identity().URI, string(data), formatted)
288+
edits := view.Options().ComputeEdits(fh.Identity().URI, string(data), formatted)
289289
return ToProtocolEdits(m, edits)
290290
}
291291

internal/lsp/source/options.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"os"
1010
"time"
1111

12+
"golang.org/x/tools/internal/lsp/diff"
1213
"golang.org/x/tools/internal/lsp/protocol"
1314
"golang.org/x/tools/internal/telemetry/tag"
1415
errors "golang.org/x/xerrors"
@@ -40,6 +41,7 @@ var (
4041
FuzzyMatching: true,
4142
Budget: 100 * time.Millisecond,
4243
},
44+
ComputeEdits: diff.MyersComputeEdits,
4345
}
4446
)
4547

@@ -71,6 +73,8 @@ type Options struct {
7173
TextDocumentSyncKind protocol.TextDocumentSyncKind
7274

7375
Completion CompletionOptions
76+
77+
ComputeEdits diff.ComputeEdits
7478
}
7579

7680
type CompletionOptions struct {

0 commit comments

Comments
 (0)