From abbb706b23e2d9bc06fbe27b205907d92f66f868 Mon Sep 17 00:00:00 2001 From: Rebecca Stambler Date: Sat, 27 Apr 2019 22:45:06 -0400 Subject: [PATCH] internal/lsp: enable enhanced hover by default This change removes the explicit configuration for improved documentation on hover. We use a comment's synopsis rather than the full comment. However, we also add a "noDocsOnHover" setting that is used by the cmd tests. Ultimately, no one should use this setting and we should remove it. We leave it temporarily because the cmd tests still need work. Change-Id: I5488eca96a729ed7edad8f59b95af163903740d6 Reviewed-on: https://go-review.googlesource.com/c/tools/+/174378 Run-TryBot: Rebecca Stambler TryBot-Result: Gobot Gobot Reviewed-by: Ian Cottrell --- internal/lsp/cmd/cmd.go | 5 +- internal/lsp/cmd/definition_test.go | 64 +------------- internal/lsp/general.go | 6 +- internal/lsp/hover.go | 2 +- internal/lsp/server.go | 2 +- internal/lsp/source/hover.go | 34 ++++---- internal/lsp/source/source_test.go | 2 +- internal/lsp/testdata/godef/a/a.go.golden | 13 --- internal/lsp/testdata/godef/a/d.go.golden | 33 ++----- .../lsp/testdata/godef/a/random.go.golden | 14 +-- internal/lsp/testdata/godef/b/b.go.golden | 87 +++++++------------ internal/lsp/testdata/godef/b/c.go.golden | 25 +++--- internal/lsp/testdata/godef/b/e.go.golden | 25 ++---- .../godef/broken/unclosedIf.go.golden | 2 - internal/lsp/tests/tests.go | 6 +- 15 files changed, 92 insertions(+), 228 deletions(-) diff --git a/internal/lsp/cmd/cmd.go b/internal/lsp/cmd/cmd.go index 45ce925a..8be04fde 100644 --- a/internal/lsp/cmd/cmd.go +++ b/internal/lsp/cmd/cmd.go @@ -273,7 +273,10 @@ func (c *cmdClient) Configuration(ctx context.Context, p *protocol.Configuration } env[l[0]] = l[1] } - results[i] = map[string]interface{}{"env": env} + results[i] = map[string]interface{}{ + "env": env, + "noDocsOnHover": true, + } } return results, nil } diff --git a/internal/lsp/cmd/definition_test.go b/internal/lsp/cmd/definition_test.go index e7ba04a6..0f298c4f 100644 --- a/internal/lsp/cmd/definition_test.go +++ b/internal/lsp/cmd/definition_test.go @@ -8,7 +8,6 @@ import ( "context" "fmt" "os" - "os/exec" "path/filepath" "regexp" "runtime" @@ -31,14 +30,11 @@ type godefMode int const ( plainGodef = godefMode(1 << iota) jsonGoDef - guruGoDef ) var godefModes = []godefMode{ plainGodef, jsonGoDef, - guruGoDef, - jsonGoDef | guruGoDef, } func TestDefinitionHelpExample(t *testing.T) { @@ -52,7 +48,7 @@ func TestDefinitionHelpExample(t *testing.T) { } thisFile := filepath.Join(dir, "definition.go") baseArgs := []string{"query", "definition"} - expect := regexp.MustCompile(`^[\w/\\:_-]+flag[/\\]flag.go:\d+:\d+-\d+: defined here as type flag.FlagSet struct{.*}$`) + expect := regexp.MustCompile(`(?s)^[\w/\\:_-]+flag[/\\]flag.go:\d+:\d+-\d+: defined here as FlagSet struct {.*}$`) for _, query := range []string{ fmt.Sprintf("%v:%v:%v", thisFile, cmd.ExampleLine, cmd.ExampleColumn), fmt.Sprintf("%v:#%v", thisFile, cmd.ExampleOffset)} { @@ -66,20 +62,6 @@ func TestDefinitionHelpExample(t *testing.T) { } } -var brokenDefinitionTests = map[string]bool{ - // The following tests all have extra information in the description - "A-definition-json-guru": true, - "err-definition-json-guru": true, - "myUnclosedIf-definition-json-guru": true, - "Other-definition-json-guru": true, - "RandomParamY-definition-json-guru": true, - "S1-definition-json-guru": true, - "S2-definition-json-guru": true, - "Stuff-definition-json-guru": true, - "Thing-definition-json-guru": true, - "Things-definition-json-guru": true, -} - func (r *runner) Definition(t *testing.T, data tests.Definitions) { for _, d := range data { if d.IsType { @@ -94,21 +76,6 @@ func (r *runner) Definition(t *testing.T, data tests.Definitions) { tag += "-json" args = append(args, "-json") } - if mode&guruGoDef != 0 { - if r.exporter.Name() != "GOPATH" { - //only run guru compatability tests in GOPATH mode - continue - } - if d.Name == "PackageFoo" { - //guru does not support definition on packages - continue - } - tag += "-guru" - args = append(args, "-emulate=guru") - } - if _, found := brokenDefinitionTests[tag]; found { - continue - } args = append(args, "definition") uri := d.Src.URI() filename, err := uri.Filename() @@ -123,35 +90,8 @@ func (r *runner) Definition(t *testing.T, data tests.Definitions) { if mode&jsonGoDef != 0 && runtime.GOOS == "windows" { got = strings.Replace(got, "file:///", "file://", -1) } - if mode&guruGoDef == 0 { - expect := string(r.data.Golden(tag, filename, func() ([]byte, error) { - return []byte(got), nil - })) - if got != expect { - t.Errorf("definition %v failed with %#v expected:\n%s\ngot:\n%s", tag, args, expect, got) - } - continue - } - guruArgs := []string{} - if mode&jsonGoDef != 0 { - guruArgs = append(guruArgs, "-json") - } - guruArgs = append(guruArgs, "definition", fmt.Sprint(d.Src)) expect := strings.TrimSpace(string(r.data.Golden(tag, filename, func() ([]byte, error) { - cmd := exec.Command("guru", guruArgs...) - cmd.Env = r.data.Exported.Config.Env - out, _ := cmd.Output() - if err != nil { - if _, ok := err.(*exec.ExitError); !ok { - return nil, fmt.Errorf("Could not run guru %v: %v\n%s", guruArgs, err, out) - } - } - result := normalizePaths(r.data, string(out)) - // guru sometimes puts the full package path in type names, but we don't - if mode&jsonGoDef == 0 && d.Name != "AImport" { - result = strings.Replace(result, "golang.org/x/tools/internal/lsp/godef/", "", -1) - } - return []byte(result), nil + return []byte(got), nil }))) if expect != "" && !strings.HasPrefix(got, expect) { t.Errorf("definition %v failed with %#v expected:\n%q\ngot:\n%q", tag, args, expect, got) diff --git a/internal/lsp/general.go b/internal/lsp/general.go index 38f9b9c3..b23d7d5d 100644 --- a/internal/lsp/general.go +++ b/internal/lsp/general.go @@ -169,9 +169,9 @@ func (s *Server) processConfig(view source.View, config interface{}) error { if usePlaceholders, ok := c["usePlaceholders"].(bool); ok { s.usePlaceholders = usePlaceholders } - // Check if enhancedHover is enabled. - if enhancedHover, ok := c["enhancedHover"].(bool); ok { - s.enhancedHover = enhancedHover + // Check if user has disabled documentation on hover. + if noDocsOnHover, ok := c["noDocsOnHover"].(bool); ok { + s.noDocsOnHover = noDocsOnHover } return nil } diff --git a/internal/lsp/hover.go b/internal/lsp/hover.go index a3d66aa8..f053b9d4 100644 --- a/internal/lsp/hover.go +++ b/internal/lsp/hover.go @@ -32,7 +32,7 @@ func (s *Server) hover(ctx context.Context, params *protocol.TextDocumentPositio if err != nil { return nil, err } - hover, err := ident.Hover(ctx, nil, s.enhancedHover, s.preferredContentFormat == protocol.Markdown) + hover, err := ident.Hover(ctx, nil, s.preferredContentFormat == protocol.Markdown, !s.noDocsOnHover) if err != nil { return nil, err } diff --git a/internal/lsp/server.go b/internal/lsp/server.go index 3ccd7f55..7424ba34 100644 --- a/internal/lsp/server.go +++ b/internal/lsp/server.go @@ -73,7 +73,7 @@ type Server struct { // Configurations. // TODO(rstambler): Separate these into their own struct? usePlaceholders bool - enhancedHover bool + noDocsOnHover bool insertTextFormat protocol.InsertTextFormat configurationSupported bool dynamicConfigurationSupported bool diff --git a/internal/lsp/source/hover.go b/internal/lsp/source/hover.go index ede27afe..931489a7 100644 --- a/internal/lsp/source/hover.go +++ b/internal/lsp/source/hover.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "go/ast" + "go/doc" "go/format" "go/token" "go/types" @@ -17,7 +18,7 @@ import ( // formatter returns the a hover value formatted with its documentation. type formatter func(interface{}, *ast.CommentGroup) (string, error) -func (i *IdentifierInfo) Hover(ctx context.Context, qf types.Qualifier, enhancedHover, markdownSupported bool) (string, error) { +func (i *IdentifierInfo) Hover(ctx context.Context, qf types.Qualifier, markdownSupported, wantComments bool) (string, error) { file := i.File.GetAST(ctx) if qf == nil { pkg := i.File.GetPackage(ctx) @@ -25,21 +26,21 @@ func (i *IdentifierInfo) Hover(ctx context.Context, qf types.Qualifier, enhanced } var b strings.Builder f := func(x interface{}, c *ast.CommentGroup) (string, error) { + if !wantComments { + c = nil + } return writeHover(x, i.File.GetFileSet(ctx), &b, c, markdownSupported, qf) } obj := i.Declaration.Object - // TODO(rstambler): Remove this configuration when hover behavior is stable. - if enhancedHover { - switch node := i.Declaration.Node.(type) { - case *ast.GenDecl: - switch obj := obj.(type) { - case *types.TypeName, *types.Var, *types.Const, *types.Func: - return formatGenDecl(node, obj, obj.Type(), f) - } - case *ast.FuncDecl: - if _, ok := obj.(*types.Func); ok { - return f(obj, node.Doc) - } + switch node := i.Declaration.Node.(type) { + case *ast.GenDecl: + switch obj := obj.(type) { + case *types.TypeName, *types.Var, *types.Const, *types.Func: + return formatGenDecl(node, obj, obj.Type(), f) + } + case *ast.FuncDecl: + if _, ok := obj.(*types.Func); ok { + return f(obj, node.Doc) } } return f(obj, nil) @@ -70,8 +71,8 @@ func formatGenDecl(node *ast.GenDecl, obj types.Object, typ types.Type, f format // Handle types. switch spec := spec.(type) { case *ast.TypeSpec: - // If multiple types are declared in the same block. if len(node.Specs) > 1 { + // If multiple types are declared in the same block. return f(spec.Type, spec.Doc) } else { return f(spec, node.Doc) @@ -97,7 +98,7 @@ func formatVar(node ast.Spec, obj types.Object, f formatter) (string, error) { // If we have a struct or interface declaration, // we need to match the object to the corresponding field or method. if fieldList != nil { - for i := 0; i < fieldList.NumFields(); i++ { + for i := 0; i < len(fieldList.List); i++ { field := fieldList.List[i] if field.Pos() <= obj.Pos() && obj.Pos() <= field.End() { if field.Doc.Text() != "" { @@ -115,7 +116,8 @@ func formatVar(node ast.Spec, obj types.Object, f formatter) (string, error) { // writeHover writes the hover for a given node and its documentation. func writeHover(x interface{}, fset *token.FileSet, b *strings.Builder, c *ast.CommentGroup, markdownSupported bool, qf types.Qualifier) (string, error) { if c != nil { - b.WriteString(c.Text()) + // TODO(rstambler): Improve conversion from Go docs to markdown. + b.WriteString(doc.Synopsis(c.Text())) b.WriteRune('\n') } if markdownSupported { diff --git a/internal/lsp/source/source_test.go b/internal/lsp/source/source_test.go index b08b1105..a0e83087 100644 --- a/internal/lsp/source/source_test.go +++ b/internal/lsp/source/source_test.go @@ -301,7 +301,7 @@ func (r *runner) Definition(t *testing.T, data tests.Definitions) { if err != nil { t.Fatalf("failed for %v: %v", d.Src, err) } - hover, err := ident.Hover(ctx, nil, false, false) + hover, err := ident.Hover(ctx, nil, false, true) if err != nil { t.Fatalf("failed for %v: %v", d.Src, err) } diff --git a/internal/lsp/testdata/godef/a/a.go.golden b/internal/lsp/testdata/godef/a/a.go.golden index c3cc4883..a8a81085 100644 --- a/internal/lsp/testdata/godef/a/a.go.golden +++ b/internal/lsp/testdata/godef/a/a.go.golden @@ -1,6 +1,5 @@ -- Random-definition -- godef/a/random.go:3:6-12: defined here as func Random() int --- Random-definition-guru -- -- Random-definition-json -- { @@ -20,14 +19,10 @@ godef/a/random.go:3:6-12: defined here as func Random() int "description": "func Random() int" } --- Random-definition-json-guru -- - -- Random-hover -- func Random() int -- Random2-definition -- godef/a/random.go:8:6-13: defined here as func Random2(y int) int --- Random2-definition-guru -- -godef/a/random.go:8:6: defined here as func Random2(y int) int -- Random2-definition-json -- { @@ -47,18 +42,10 @@ godef/a/random.go:8:6: defined here as func Random2(y int) int "description": "func Random2(y int) int" } --- Random2-definition-json-guru -- -{ - "objpos": "godef/a/random.go:8:6", - "desc": "func Random2(y int) int" -} - -- Random2-hover -- func Random2(y int) int -- err-definition -- godef/a/a.go:14:6-9: defined here as var err error --- err-definition-guru -- -godef/a/a.go:14:6: defined here as var err -- err-definition-json -- { diff --git a/internal/lsp/testdata/godef/a/d.go.golden b/internal/lsp/testdata/godef/a/d.go.golden index 6e3a2bdc..6c7cf096 100644 --- a/internal/lsp/testdata/godef/a/d.go.golden +++ b/internal/lsp/testdata/godef/a/d.go.golden @@ -1,7 +1,5 @@ -- Member-definition -- godef/a/d.go:6:2-8: defined here as field Member string --- Member-definition-guru -- -godef/a/d.go:6:2: defined here as field Member string -- Member-definition-json -- { @@ -21,18 +19,11 @@ godef/a/d.go:6:2: defined here as field Member string "description": "field Member string" } --- Member-definition-json-guru -- -{ - "objpos": "godef/a/d.go:6:2", - "desc": "field Member string" -} - -- Member-hover -- +@Member field Member string -- Method-definition -- godef/a/d.go:15:16-22: defined here as func (Thing).Method(i int) string --- Method-definition-guru -- -godef/a/d.go:15:16: defined here as func (Thing).Method(i int) string -- Method-definition-json -- { @@ -52,18 +43,10 @@ godef/a/d.go:15:16: defined here as func (Thing).Method(i int) string "description": "func (Thing).Method(i int) string" } --- Method-definition-json-guru -- -{ - "objpos": "godef/a/d.go:15:16", - "desc": "func (Thing).Method(i int) string" -} - -- Method-hover -- func (Thing).Method(i int) string -- Other-definition -- godef/a/d.go:9:5-10: defined here as var Other Thing --- Other-definition-guru -- -godef/a/d.go:9:5: defined here as var Other -- Other-definition-json -- { @@ -86,9 +69,9 @@ godef/a/d.go:9:5: defined here as var Other -- Other-hover -- var Other Thing -- Thing-definition -- -godef/a/d.go:5:6-11: defined here as type Thing struct{Member string} --- Thing-definition-guru -- -godef/a/d.go:5:6: defined here as type Thing +godef/a/d.go:5:6-11: defined here as Thing struct { + Member string //@Member +} -- Thing-definition-json -- { @@ -105,15 +88,15 @@ godef/a/d.go:5:6: defined here as type Thing "offset": 35 } }, - "description": "type Thing struct{Member string}" + "description": "Thing struct {\n\tMember string //@Member\n}" } -- Thing-hover -- -type Thing struct{Member string} +Thing struct { + Member string //@Member +} -- Things-definition -- godef/a/d.go:11:6-12: defined here as func Things(val []string) []Thing --- Things-definition-guru -- -godef/a/d.go:11:6: defined here as func Things -- Things-definition-json -- { diff --git a/internal/lsp/testdata/godef/a/random.go.golden b/internal/lsp/testdata/godef/a/random.go.golden index 077b7106..0775d552 100644 --- a/internal/lsp/testdata/godef/a/random.go.golden +++ b/internal/lsp/testdata/godef/a/random.go.golden @@ -1,6 +1,5 @@ -- PosSum-definition -- godef/a/random.go:16:15-18: defined here as func (*Pos).Sum() int --- PosSum-definition-guru -- -- PosSum-definition-json -- { @@ -20,14 +19,10 @@ godef/a/random.go:16:15-18: defined here as func (*Pos).Sum() int "description": "func (*Pos).Sum() int" } --- PosSum-definition-json-guru -- - -- PosSum-hover -- func (*Pos).Sum() int -- PosX-definition -- godef/a/random.go:13:2-3: defined here as field x int --- PosX-definition-guru -- -godef/a/random.go:13:2: defined here as field x int -- PosX-definition-json -- { @@ -47,18 +42,11 @@ godef/a/random.go:13:2: defined here as field x int "description": "field x int" } --- PosX-definition-json-guru -- -{ - "objpos": "godef/a/random.go:13:2", - "desc": "field x int" -} - -- PosX-hover -- +@mark(PosX, "x"),mark(PosY, "y") field x int -- RandomParamY-definition -- godef/a/random.go:8:14-15: defined here as var y int --- RandomParamY-definition-guru -- -godef/a/random.go:8:14: defined here as var y -- RandomParamY-definition-json -- { diff --git a/internal/lsp/testdata/godef/b/b.go.golden b/internal/lsp/testdata/godef/b/b.go.golden index 556337e5..febfce68 100644 --- a/internal/lsp/testdata/godef/b/b.go.golden +++ b/internal/lsp/testdata/godef/b/b.go.golden @@ -1,7 +1,5 @@ -- A-definition -- -godef/a/a.go:7:6-7: defined here as type a.A string --- A-definition-guru -- -godef/a/a.go:7:6: defined here as type a.A +godef/a/a.go:7:6-7: defined here as A string //@A -- A-definition-json -- { @@ -18,15 +16,14 @@ godef/a/a.go:7:6: defined here as type a.A "offset": 76 } }, - "description": "type a.A string" + "description": "A string //@A" } -- A-hover -- -type a.A string +A string //@A + -- AImport-definition -- godef/b/b.go:5:2-3: defined here as package a ("golang.org/x/tools/internal/lsp/godef/a") --- AImport-definition-guru -- -godef/b/b.go:5:2: defined here as package a ("golang.org/x/tools/internal/lsp/godef/a") -- AImport-definition-json -- { @@ -46,12 +43,6 @@ godef/b/b.go:5:2: defined here as package a ("golang.org/x/tools/internal/lsp/go "description": "package a (\"golang.org/x/tools/internal/lsp/godef/a\")" } --- AImport-definition-json-guru -- -{ - "objpos": "godef/b/b.go:5:2", - "desc": "package a (\"golang.org/x/tools/internal/lsp/godef/a\")" -} - -- AImport-hover -- package a ("golang.org/x/tools/internal/lsp/godef/a") -- PackageFoo-definition -- @@ -77,9 +68,11 @@ foo/foo.go:1:9-12: defined here as -- PackageFoo-hover -- -- S1-definition -- -godef/b/b.go:8:6-8: defined here as type S1 struct{F1 int; S2; a.A} --- S1-definition-guru -- -godef/b/b.go:8:6: defined here as type S1 +godef/b/b.go:8:6-8: defined here as S1 struct { + F1 int //@mark(S1F1, "F1") + S2 //@godef("S2", S2), mark(S1S2, "S2") + a.A //@godef("A", A) +} -- S1-definition-json -- { @@ -96,15 +89,17 @@ godef/b/b.go:8:6: defined here as type S1 "offset": 198 } }, - "description": "type S1 struct{F1 int; S2; a.A}" + "description": "S1 struct {\n\tF1 int //@mark(S1F1, \"F1\")\n\tS2 //@godef(\"S2\", S2), mark(S1S2, \"S2\")\n\ta.A //@godef(\"A\", A)\n}" } -- S1-hover -- -type S1 struct{F1 int; S2; a.A} +S1 struct { + F1 int //@mark(S1F1, "F1") + S2 //@godef("S2", S2), mark(S1S2, "S2") + a.A //@godef("A", A) +} -- S1F1-definition -- godef/b/b.go:9:2-4: defined here as field F1 int --- S1F1-definition-guru -- -godef/b/b.go:9:2: defined here as field F1 int -- S1F1-definition-json -- { @@ -124,18 +119,11 @@ godef/b/b.go:9:2: defined here as field F1 int "description": "field F1 int" } --- S1F1-definition-json-guru -- -{ - "objpos": "godef/b/b.go:9:2", - "desc": "field F1 int" -} - -- S1F1-hover -- +@mark(S1F1, "F1") field F1 int -- S1S2-definition -- godef/b/b.go:10:2-4: defined here as field S2 S2 --- S1S2-definition-guru -- -godef/b/b.go:10:2: defined here as field S2 S2 -- S1S2-definition-json -- { @@ -155,18 +143,15 @@ godef/b/b.go:10:2: defined here as field S2 S2 "description": "field S2 S2" } --- S1S2-definition-json-guru -- -{ - "objpos": "godef/b/b.go:10:2", - "desc": "field S2 S2" -} - -- S1S2-hover -- +@godef("S2", S2), mark(S1S2, "S2") field S2 S2 -- S2-definition -- -godef/b/b.go:14:6-8: defined here as type S2 struct{F1 string; F2 int; *a.A} --- S2-definition-guru -- -godef/b/b.go:14:6: defined here as type S2 +godef/b/b.go:14:6-8: defined here as S2 struct { + F1 string //@mark(S2F1, "F1") + F2 int //@mark(S2F2, "F2") + *a.A //@godef("A", A),godef("a",AImport) +} -- S2-definition-json -- { @@ -183,15 +168,17 @@ godef/b/b.go:14:6: defined here as type S2 "offset": 325 } }, - "description": "type S2 struct{F1 string; F2 int; *a.A}" + "description": "S2 struct {\n\tF1 string //@mark(S2F1, \"F1\")\n\tF2 int //@mark(S2F2, \"F2\")\n\t*a.A //@godef(\"A\", A),godef(\"a\",AImport)\n}" } -- S2-hover -- -type S2 struct{F1 string; F2 int; *a.A} +S2 struct { + F1 string //@mark(S2F1, "F1") + F2 int //@mark(S2F2, "F2") + *a.A //@godef("A", A),godef("a",AImport) +} -- S2F1-definition -- godef/b/b.go:15:2-4: defined here as field F1 string --- S2F1-definition-guru -- -godef/b/b.go:15:2: defined here as field F1 string -- S2F1-definition-json -- { @@ -211,18 +198,11 @@ godef/b/b.go:15:2: defined here as field F1 string "description": "field F1 string" } --- S2F1-definition-json-guru -- -{ - "objpos": "godef/b/b.go:15:2", - "desc": "field F1 string" -} - -- S2F1-hover -- +@mark(S2F1, "F1") field F1 string -- S2F2-definition -- godef/b/b.go:16:2-4: defined here as field F2 int --- S2F2-definition-guru -- -godef/b/b.go:16:2: defined here as field F2 int -- S2F2-definition-json -- { @@ -242,18 +222,11 @@ godef/b/b.go:16:2: defined here as field F2 int "description": "field F2 int" } --- S2F2-definition-json-guru -- -{ - "objpos": "godef/b/b.go:16:2", - "desc": "field F2 int" -} - -- S2F2-hover -- +@mark(S2F2, "F2") field F2 int -- Stuff-definition -- godef/a/a.go:9:6-11: defined here as func a.Stuff() --- Stuff-definition-guru -- -godef/a/a.go:9:6: defined here as func a.Stuff -- Stuff-definition-json -- { diff --git a/internal/lsp/testdata/godef/b/c.go.golden b/internal/lsp/testdata/godef/b/c.go.golden index 69a14ebc..62fb1841 100644 --- a/internal/lsp/testdata/godef/b/c.go.golden +++ b/internal/lsp/testdata/godef/b/c.go.golden @@ -1,7 +1,9 @@ -- S1-definition -- -godef/b/b.go:8:6-8: defined here as type S1 struct{F1 int; S2; a.A} --- S1-definition-guru -- -godef/b/b.go:8:6: defined here as type S1 struct{F1 int; S2; a.A} +godef/b/b.go:8:6-8: defined here as S1 struct { + F1 int //@mark(S1F1, "F1") + S2 //@godef("S2", S2), mark(S1S2, "S2") + a.A //@godef("A", A) +} -- S1-definition-json -- { @@ -18,15 +20,17 @@ godef/b/b.go:8:6: defined here as type S1 struct{F1 int; S2; a.A} "offset": 198 } }, - "description": "type S1 struct{F1 int; S2; a.A}" + "description": "S1 struct {\n\tF1 int //@mark(S1F1, \"F1\")\n\tS2 //@godef(\"S2\", S2), mark(S1S2, \"S2\")\n\ta.A //@godef(\"A\", A)\n}" } -- S1-hover -- -type S1 struct{F1 int; S2; a.A} +S1 struct { + F1 int //@mark(S1F1, "F1") + S2 //@godef("S2", S2), mark(S1S2, "S2") + a.A //@godef("A", A) +} -- S1F1-definition -- godef/b/b.go:9:2-4: defined here as field F1 int --- S1F1-definition-guru -- -godef/b/b.go:9:2: defined here as field F1 int -- S1F1-definition-json -- { @@ -46,11 +50,6 @@ godef/b/b.go:9:2: defined here as field F1 int "description": "field F1 int" } --- S1F1-definition-json-guru -- -{ - "objpos": "godef/b/b.go:9:2", - "desc": "field F1 int" -} - -- S1F1-hover -- +@mark(S1F1, "F1") field F1 int diff --git a/internal/lsp/testdata/godef/b/e.go.golden b/internal/lsp/testdata/godef/b/e.go.golden index 5db0e4c6..8ff469ef 100644 --- a/internal/lsp/testdata/godef/b/e.go.golden +++ b/internal/lsp/testdata/godef/b/e.go.golden @@ -1,7 +1,5 @@ -- Member-definition -- godef/a/d.go:6:2-8: defined here as field Member string --- Member-definition-guru -- -godef/a/d.go:6:2: defined here as field Member string -- Member-definition-json -- { @@ -21,18 +19,11 @@ godef/a/d.go:6:2: defined here as field Member string "description": "field Member string" } --- Member-definition-json-guru -- -{ - "objpos": "godef/a/d.go:6:2", - "desc": "field Member string" -} - -- Member-hover -- +@Member field Member string -- Other-definition -- godef/a/d.go:9:5-10: defined here as var a.Other a.Thing --- Other-definition-guru -- -godef/a/d.go:9:5: defined here as var a.Other -- Other-definition-json -- { @@ -55,9 +46,9 @@ godef/a/d.go:9:5: defined here as var a.Other -- Other-hover -- var a.Other a.Thing -- Thing-definition -- -godef/a/d.go:5:6-11: defined here as type a.Thing struct{Member string} --- Thing-definition-guru -- -godef/a/d.go:5:6: defined here as type a.Thing +godef/a/d.go:5:6-11: defined here as Thing struct { + Member string //@Member +} -- Thing-definition-json -- { @@ -74,15 +65,15 @@ godef/a/d.go:5:6: defined here as type a.Thing "offset": 35 } }, - "description": "type a.Thing struct{Member string}" + "description": "Thing struct {\n\tMember string //@Member\n}" } -- Thing-hover -- -type a.Thing struct{Member string} +Thing struct { + Member string //@Member +} -- Things-definition -- godef/a/d.go:11:6-12: defined here as func a.Things(val []string) []a.Thing --- Things-definition-guru -- -godef/a/d.go:11:6: defined here as func a.Things -- Things-definition-json -- { diff --git a/internal/lsp/testdata/godef/broken/unclosedIf.go.golden b/internal/lsp/testdata/godef/broken/unclosedIf.go.golden index e49297a5..2ed081a5 100644 --- a/internal/lsp/testdata/godef/broken/unclosedIf.go.golden +++ b/internal/lsp/testdata/godef/broken/unclosedIf.go.golden @@ -1,7 +1,5 @@ -- myUnclosedIf-definition -- godef/broken/unclosedIf.go:7:7-19: defined here as var myUnclosedIf string --- myUnclosedIf-definition-guru -- -godef/broken/unclosedIf.go:7:7: defined here as var myUnclosedIf -- myUnclosedIf-definition-json -- { diff --git a/internal/lsp/tests/tests.go b/internal/lsp/tests/tests.go index d374d70d..15286777 100644 --- a/internal/lsp/tests/tests.go +++ b/internal/lsp/tests/tests.go @@ -267,7 +267,7 @@ func Run(t *testing.T, tests Tests, data *Data) { tests.Format(t, data.Formats) }) - t.Run("Definitions", func(t *testing.T) { + t.Run("Definition", func(t *testing.T) { t.Helper() if len(data.Definitions) != ExpectedDefinitionsCount { t.Errorf("got %v definitions expected %v", len(data.Definitions), ExpectedDefinitionsCount) @@ -275,7 +275,7 @@ func Run(t *testing.T, tests Tests, data *Data) { tests.Definition(t, data.Definitions) }) - t.Run("Highlights", func(t *testing.T) { + t.Run("Highlight", func(t *testing.T) { t.Helper() if len(data.Highlights) != ExpectedHighlightsCount { t.Errorf("got %v highlights expected %v", len(data.Highlights), ExpectedHighlightsCount) @@ -299,7 +299,7 @@ func Run(t *testing.T, tests Tests, data *Data) { tests.SignatureHelp(t, data.Signatures) }) - t.Run("Links", func(t *testing.T) { + t.Run("Link", func(t *testing.T) { t.Helper() linksCount := 0 for _, want := range data.Links {