mirror of
https://github.com/golang/go
synced 2024-11-18 19:24:39 -07:00
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 <iancottrell@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
This commit is contained in:
parent
246a69f4f1
commit
6e0078a899
@ -7,9 +7,10 @@ package diff_test
|
|||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/lsp/diff"
|
||||||
"golang.org/x/tools/internal/lsp/diff/difftest"
|
"golang.org/x/tools/internal/lsp/diff/difftest"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestDiff(t *testing.T) {
|
func TestDiff(t *testing.T) {
|
||||||
difftest.DiffTest(t)
|
difftest.DiffTest(t, diff.MyersComputeEdits)
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@ import (
|
|||||||
"golang.org/x/tools/internal/span"
|
"golang.org/x/tools/internal/span"
|
||||||
)
|
)
|
||||||
|
|
||||||
func DiffTest(t *testing.T) {
|
func DiffTest(t *testing.T, compute diff.ComputeEdits) {
|
||||||
t.Helper()
|
t.Helper()
|
||||||
for _, test := range []struct{ name, in, out, unified string }{{
|
for _, test := range []struct{ name, in, out, unified string }{{
|
||||||
name: "empty",
|
name: "empty",
|
||||||
@ -41,7 +41,7 @@ func DiffTest(t *testing.T) {
|
|||||||
in: "one\nthree\n",
|
in: "one\nthree\n",
|
||||||
out: "one\ntwo\nthree\n",
|
out: "one\ntwo\nthree\n",
|
||||||
}} {
|
}} {
|
||||||
edits := diff.ComputeEdits(span.FileURI("/"+test.name), test.in, test.out)
|
edits := compute(span.FileURI("/"+test.name), test.in, test.out)
|
||||||
got := diff.ApplyEdits(test.in, edits)
|
got := diff.ApplyEdits(test.in, edits)
|
||||||
if got != test.out {
|
if got != test.out {
|
||||||
t.Logf("test %v had diff:%v\n", test.name, diff.ToUnified(test.name+".orig", test.name, test.in, edits))
|
t.Logf("test %v had diff:%v\n", test.name, diff.ToUnified(test.name+".orig", test.name, test.in, edits))
|
||||||
|
@ -18,8 +18,9 @@ type TextEdit struct {
|
|||||||
NewText string
|
NewText string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ComputeEdits func(uri span.URI, before, after string) []TextEdit
|
||||||
|
|
||||||
var (
|
var (
|
||||||
ComputeEdits func(uri span.URI, before, after string) []TextEdit
|
|
||||||
ToUnified func(from, to string, before string, edits []TextEdit) string
|
ToUnified func(from, to string, before string, edits []TextEdit) string
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -13,11 +13,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
ComputeEdits = myersComputeEdits
|
|
||||||
ToUnified = myersToUnified
|
ToUnified = myersToUnified
|
||||||
}
|
}
|
||||||
|
|
||||||
func myersComputeEdits(uri span.URI, before, after string) []TextEdit {
|
func MyersComputeEdits(uri span.URI, before, after string) []TextEdit {
|
||||||
u := myers.SplitLines(before)
|
u := myers.SplitLines(before)
|
||||||
f := myers.SplitLines(after)
|
f := myers.SplitLines(after)
|
||||||
return myersDiffToEdits(uri, myers.Operations(u, f))
|
return myersDiffToEdits(uri, myers.Operations(u, f))
|
||||||
|
@ -55,7 +55,7 @@ func Format(ctx context.Context, view View, f File) ([]protocol.TextEdit, error)
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return computeTextEdits(ctx, ph.File(), m, string(formatted))
|
return computeTextEdits(ctx, view, ph.File(), m, string(formatted))
|
||||||
}
|
}
|
||||||
|
|
||||||
fset := view.Session().Cache().FileSet()
|
fset := view.Session().Cache().FileSet()
|
||||||
@ -68,7 +68,7 @@ func Format(ctx context.Context, view View, f File) ([]protocol.TextEdit, error)
|
|||||||
if err := format.Node(buf, fset, file); err != nil {
|
if err := format.Node(buf, fset, file); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return computeTextEdits(ctx, ph.File(), m, buf.String())
|
return computeTextEdits(ctx, view, ph.File(), m, buf.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
func formatSource(ctx context.Context, s Snapshot, f File) ([]byte, error) {
|
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
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return computeTextEdits(ctx, ph.File(), m, string(formatted))
|
return computeTextEdits(ctx, view, ph.File(), m, string(formatted))
|
||||||
}
|
}
|
||||||
|
|
||||||
type ImportFix struct {
|
type ImportFix struct {
|
||||||
@ -198,7 +198,7 @@ func AllImportsFixes(ctx context.Context, view View, f File) (edits []protocol.T
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
edits, err = computeTextEdits(ctx, ph.File(), m, string(formatted))
|
edits, err = computeTextEdits(ctx, view, ph.File(), m, string(formatted))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -209,7 +209,7 @@ func AllImportsFixes(ctx context.Context, view View, f File) (edits []protocol.T
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
edits, err := computeTextEdits(ctx, ph.File(), m, string(formatted))
|
edits, err := computeTextEdits(ctx, view, ph.File(), m, string(formatted))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -277,7 +277,7 @@ func hasListErrors(errors []packages.Error) bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func computeTextEdits(ctx context.Context, fh FileHandle, m *protocol.ColumnMapper, formatted string) ([]protocol.TextEdit, error) {
|
func computeTextEdits(ctx context.Context, view View, fh FileHandle, m *protocol.ColumnMapper, formatted string) ([]protocol.TextEdit, error) {
|
||||||
ctx, done := trace.StartSpan(ctx, "source.computeTextEdits")
|
ctx, done := trace.StartSpan(ctx, "source.computeTextEdits")
|
||||||
defer done()
|
defer done()
|
||||||
|
|
||||||
@ -285,7 +285,7 @@ func computeTextEdits(ctx context.Context, fh FileHandle, m *protocol.ColumnMapp
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
edits := diff.ComputeEdits(fh.Identity().URI, string(data), formatted)
|
edits := view.Options().ComputeEdits(fh.Identity().URI, string(data), formatted)
|
||||||
return ToProtocolEdits(m, edits)
|
return ToProtocolEdits(m, edits)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/lsp/diff"
|
||||||
"golang.org/x/tools/internal/lsp/protocol"
|
"golang.org/x/tools/internal/lsp/protocol"
|
||||||
"golang.org/x/tools/internal/telemetry/tag"
|
"golang.org/x/tools/internal/telemetry/tag"
|
||||||
errors "golang.org/x/xerrors"
|
errors "golang.org/x/xerrors"
|
||||||
@ -40,6 +41,7 @@ var (
|
|||||||
FuzzyMatching: true,
|
FuzzyMatching: true,
|
||||||
Budget: 100 * time.Millisecond,
|
Budget: 100 * time.Millisecond,
|
||||||
},
|
},
|
||||||
|
ComputeEdits: diff.MyersComputeEdits,
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -71,6 +73,8 @@ type Options struct {
|
|||||||
TextDocumentSyncKind protocol.TextDocumentSyncKind
|
TextDocumentSyncKind protocol.TextDocumentSyncKind
|
||||||
|
|
||||||
Completion CompletionOptions
|
Completion CompletionOptions
|
||||||
|
|
||||||
|
ComputeEdits diff.ComputeEdits
|
||||||
}
|
}
|
||||||
|
|
||||||
type CompletionOptions struct {
|
type CompletionOptions struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user