-
Notifications
You must be signed in to change notification settings - Fork 2.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
tools/gopls: add cmd support for implementation
This change adds command line support for implementation. Example: $ gopls implementation ~/tmp/foo/main.go:8:6 $ gopls implementation ~/tmp/foo/main.go:#53 Updates golang/go#32875 Change-Id: I3aa89a788ded886368b07c1824325069f3cba88a Reviewed-on: https://go-review.googlesource.com/c/tools/+/208357 Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
- Loading branch information
1 parent
b99b2d0
commit 59b2cd7
Showing
4 changed files
with
126 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// Copyright 2019 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package cmd | ||
|
||
import ( | ||
"context" | ||
"flag" | ||
"fmt" | ||
"sort" | ||
|
||
"golang.org/x/tools/internal/lsp/protocol" | ||
"golang.org/x/tools/internal/span" | ||
"golang.org/x/tools/internal/tool" | ||
) | ||
|
||
// implementation implements the implementation verb for gopls | ||
type implementation struct { | ||
app *Application | ||
} | ||
|
||
func (i *implementation) Name() string { return "implementation" } | ||
func (i *implementation) Usage() string { return "<position>" } | ||
func (i *implementation) ShortHelp() string { return "display selected identifier's implementation" } | ||
func (i *implementation) DetailedHelp(f *flag.FlagSet) { | ||
fmt.Fprint(f.Output(), ` | ||
Example: | ||
$ # 1-indexed location (:line:column or :#offset) of the target identifier | ||
$ gopls implementation helper/helper.go:8:6 | ||
$ gopls implementation helper/helper.go:#53 | ||
gopls implementation flags are: | ||
`) | ||
f.PrintDefaults() | ||
} | ||
|
||
func (i *implementation) Run(ctx context.Context, args ...string) error { | ||
if len(args) != 1 { | ||
return tool.CommandLineErrorf("implementation expects 1 argument (position)") | ||
} | ||
|
||
conn, err := i.app.connect(ctx) | ||
if err != nil { | ||
return err | ||
} | ||
defer conn.terminate(ctx) | ||
|
||
from := span.Parse(args[0]) | ||
file := conn.AddFile(ctx, from.URI()) | ||
if file.err != nil { | ||
return file.err | ||
} | ||
|
||
loc, err := file.mapper.Location(from) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
p := protocol.ImplementationParams{ | ||
TextDocumentPositionParams: protocol.TextDocumentPositionParams{ | ||
TextDocument: protocol.TextDocumentIdentifier{URI: loc.URI}, | ||
Position: loc.Range.Start, | ||
}, | ||
} | ||
|
||
implementations, err := conn.Implementation(ctx, &p) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
var spans []string | ||
for _, impl := range implementations { | ||
f := conn.AddFile(ctx, span.NewURI(impl.URI)) | ||
span, err := f.mapper.Span(impl) | ||
if err != nil { | ||
return err | ||
} | ||
spans = append(spans, fmt.Sprint(span)) | ||
} | ||
sort.Strings(spans) | ||
|
||
for _, s := range spans { | ||
fmt.Println(s) | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// Copyright 2019 The Go Authors. All rights reserved. | ||
// Use of this source code is governed by a BSD-style | ||
// license that can be found in the LICENSE file. | ||
|
||
package cmdtest | ||
|
||
import ( | ||
"fmt" | ||
"sort" | ||
"testing" | ||
|
||
"golang.org/x/tools/internal/lsp/tests" | ||
"golang.org/x/tools/internal/span" | ||
) | ||
|
||
func (r *runner) Implementation(t *testing.T, spn span.Span, imp tests.Implementations) { | ||
var itemStrings []string | ||
for _, i := range imp.Implementations { | ||
itemStrings = append(itemStrings, fmt.Sprint(i)) | ||
} | ||
sort.Strings(itemStrings) | ||
var expect string | ||
for _, i := range itemStrings { | ||
expect += i + "\n" | ||
} | ||
expect = r.Normalize(expect) | ||
|
||
uri := spn.URI() | ||
filename := uri.Filename() | ||
target := filename + fmt.Sprintf(":%v:%v", spn.Start().Line(), spn.Start().Column()) | ||
|
||
got, _ := r.NormalizeGoplsCmd(t, "implementation", target) | ||
if expect != got { | ||
t.Errorf("implementation failed for %s expected:\n%s\ngot:\n%s", target, expect, got) | ||
} | ||
} |