internal/lsp/command: stub out the ListKnownPackages and AddImport commands
Add the ListKnownPackages and AddImport methods to command.Interface and
regenerate bindings. Add empty implementations to lsp.commandHandler.
These are our first commands returning results. I'll update our docgen
to support result in a subsequent CL.
Change-Id: Ic3b7c0d9383ac8f3e1cb546a71e9c496a92a7840
Reviewed-on: https://go-review.googlesource.com/c/tools/+/291129
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Trust: Robert Findley <rfindley@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
diff --git a/gopls/doc/commands.md b/gopls/doc/commands.md
index ab77bbe..1d7aa58 100644
--- a/gopls/doc/commands.md
+++ b/gopls/doc/commands.md
@@ -21,6 +21,20 @@
}
```
+### ****
+Identifier: `gopls.add_import`
+
+
+
+Args:
+
+```
+{
+ "ImportPath": string,
+ "URI": string,
+}
+```
+
### **Apply a fix**
Identifier: `gopls.apply_fix`
@@ -122,6 +136,20 @@
}
```
+### ****
+Identifier: `gopls.list_known_packages`
+
+
+
+Args:
+
+```
+{
+ // The file URI.
+ "URI": string,
+}
+```
+
### **Regenerate cgo**
Identifier: `gopls.regenerate_cgo`
diff --git a/internal/lsp/command.go b/internal/lsp/command.go
index a959d1c..469ef92 100644
--- a/internal/lsp/command.go
+++ b/internal/lsp/command.go
@@ -52,7 +52,7 @@
// commandConfig configures common command set-up and execution.
type commandConfig struct {
- async bool
+ async bool // whether to run the command asynchronously. Async commands cannot return results.
requireSave bool // whether all files must be saved for the command to work
progress string // title to use for progress reporting. If empty, no progress will be reported.
forURI protocol.DocumentURI // URI to resolve to a snapshot. If unset, snapshot will be nil.
@@ -556,3 +556,28 @@
return nil
})
}
+
+func (c *commandHandler) ListKnownPackages(ctx context.Context, args command.URIArg) (command.ListKnownPackagesResult, error) {
+ var result command.ListKnownPackagesResult
+ err := c.run(ctx, commandConfig{
+ progress: "Listing packages", // optional, causes a progress report during command execution
+ forURI: args.URI, // optional, populates deps.snapshot and deps.fh
+ }, func(ctx context.Context, deps commandDeps) error {
+ // Marwan: add implementation here. deps.snapshot and deps.fh are available for use.
+ result.Packages = []string{}
+ return nil
+ })
+ return result, err
+}
+
+func (c *commandHandler) AddImport(ctx context.Context, args command.AddImportArgs) (command.AddImportResult, error) {
+ var result command.AddImportResult
+ err := c.run(ctx, commandConfig{
+ progress: "Adding import",
+ forURI: args.URI,
+ }, func(ctx context.Context, deps commandDeps) error {
+ result.Edits = nil
+ return nil
+ })
+ return result, err
+}
diff --git a/internal/lsp/command/command_gen.go b/internal/lsp/command/command_gen.go
index 3e7280c..aca505c 100644
--- a/internal/lsp/command/command_gen.go
+++ b/internal/lsp/command/command_gen.go
@@ -19,12 +19,14 @@
const (
AddDependency Command = "add_dependency"
+ AddImport Command = "add_import"
ApplyFix Command = "apply_fix"
CheckUpgrades Command = "check_upgrades"
GCDetails Command = "gc_details"
Generate Command = "generate"
GenerateGoplsMod Command = "generate_gopls_mod"
GoGetPackage Command = "go_get_package"
+ ListKnownPackages Command = "list_known_packages"
RegenerateCgo Command = "regenerate_cgo"
RemoveDependency Command = "remove_dependency"
RunTests Command = "run_tests"
@@ -38,12 +40,14 @@
var Commands = []Command{
AddDependency,
+ AddImport,
ApplyFix,
CheckUpgrades,
GCDetails,
Generate,
GenerateGoplsMod,
GoGetPackage,
+ ListKnownPackages,
RegenerateCgo,
RemoveDependency,
RunTests,
@@ -62,71 +66,73 @@
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.AddDependency(ctx, a0)
- return nil, err
+ return nil, s.AddDependency(ctx, a0)
+ case "gopls.add_import":
+ var a0 AddImportArgs
+ if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
+ return nil, err
+ }
+ return s.AddImport(ctx, a0)
case "gopls.apply_fix":
var a0 ApplyFixArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.ApplyFix(ctx, a0)
- return nil, err
+ return nil, s.ApplyFix(ctx, a0)
case "gopls.check_upgrades":
var a0 CheckUpgradesArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.CheckUpgrades(ctx, a0)
- return nil, err
+ return nil, s.CheckUpgrades(ctx, a0)
case "gopls.gc_details":
var a0 protocol.DocumentURI
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.GCDetails(ctx, a0)
- return nil, err
+ return nil, s.GCDetails(ctx, a0)
case "gopls.generate":
var a0 GenerateArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.Generate(ctx, a0)
- return nil, err
+ return nil, s.Generate(ctx, a0)
case "gopls.generate_gopls_mod":
var a0 URIArg
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.GenerateGoplsMod(ctx, a0)
- return nil, err
+ return nil, s.GenerateGoplsMod(ctx, a0)
case "gopls.go_get_package":
var a0 GoGetPackageArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.GoGetPackage(ctx, a0)
- return nil, err
+ return nil, s.GoGetPackage(ctx, a0)
+ case "gopls.list_known_packages":
+ var a0 URIArg
+ if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
+ return nil, err
+ }
+ return s.ListKnownPackages(ctx, a0)
case "gopls.regenerate_cgo":
var a0 URIArg
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.RegenerateCgo(ctx, a0)
- return nil, err
+ return nil, s.RegenerateCgo(ctx, a0)
case "gopls.remove_dependency":
var a0 RemoveDependencyArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.RemoveDependency(ctx, a0)
- return nil, err
+ return nil, s.RemoveDependency(ctx, a0)
case "gopls.run_tests":
var a0 RunTestsArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.RunTests(ctx, a0)
- return nil, err
+ return nil, s.RunTests(ctx, a0)
case "gopls.test":
var a0 protocol.DocumentURI
var a1 []string
@@ -134,43 +140,37 @@
if err := UnmarshalArgs(params.Arguments, &a0, &a1, &a2); err != nil {
return nil, err
}
- err := s.Test(ctx, a0, a1, a2)
- return nil, err
+ return nil, s.Test(ctx, a0, a1, a2)
case "gopls.tidy":
var a0 URIArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.Tidy(ctx, a0)
- return nil, err
+ return nil, s.Tidy(ctx, a0)
case "gopls.toggle_gc_details":
var a0 URIArg
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.ToggleGCDetails(ctx, a0)
- return nil, err
+ return nil, s.ToggleGCDetails(ctx, a0)
case "gopls.update_go_sum":
var a0 URIArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.UpdateGoSum(ctx, a0)
- return nil, err
+ return nil, s.UpdateGoSum(ctx, a0)
case "gopls.upgrade_dependency":
var a0 DependencyArgs
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.UpgradeDependency(ctx, a0)
- return nil, err
+ return nil, s.UpgradeDependency(ctx, a0)
case "gopls.vendor":
var a0 URIArg
if err := UnmarshalArgs(params.Arguments, &a0); err != nil {
return nil, err
}
- err := s.Vendor(ctx, a0)
- return nil, err
+ return nil, s.Vendor(ctx, a0)
}
return nil, fmt.Errorf("unsupported command %q", params.Command)
}
@@ -187,6 +187,18 @@
}, nil
}
+func NewAddImportCommand(title string, a0 AddImportArgs) (protocol.Command, error) {
+ args, err := MarshalArgs(a0)
+ if err != nil {
+ return protocol.Command{}, err
+ }
+ return protocol.Command{
+ Title: title,
+ Command: "gopls.add_import",
+ Arguments: args,
+ }, nil
+}
+
func NewApplyFixCommand(title string, a0 ApplyFixArgs) (protocol.Command, error) {
args, err := MarshalArgs(a0)
if err != nil {
@@ -259,6 +271,18 @@
}, nil
}
+func NewListKnownPackagesCommand(title string, a0 URIArg) (protocol.Command, error) {
+ args, err := MarshalArgs(a0)
+ if err != nil {
+ return protocol.Command{}, err
+ }
+ return protocol.Command{
+ Title: title,
+ Command: "gopls.list_known_packages",
+ Arguments: args,
+ }, nil
+}
+
func NewRegenerateCgoCommand(title string, a0 URIArg) (protocol.Command, error) {
args, err := MarshalArgs(a0)
if err != nil {
diff --git a/internal/lsp/command/generate/generate.go b/internal/lsp/command/generate/generate.go
index 019574b..d76ff6f 100644
--- a/internal/lsp/command/generate/generate.go
+++ b/internal/lsp/command/generate/generate.go
@@ -58,8 +58,7 @@
return nil, err
}
{{end -}}
- {{- if .Result -}}res, {{end}}err := s.{{.MethodName}}(ctx{{range $i, $v := .Args}}, a{{$i}}{{end}})
- return {{if .Result}}res{{else}}nil{{end}}, err
+ return {{if not .Result}}nil, {{end}}s.{{.MethodName}}(ctx{{range $i, $v := .Args}}, a{{$i}}{{end}})
{{- end}}
}
return nil, fmt.Errorf("unsupported command %q", params.Command)
diff --git a/internal/lsp/command/interface.go b/internal/lsp/command/interface.go
index 1fd7fc5..bd5e4c2 100644
--- a/internal/lsp/command/interface.go
+++ b/internal/lsp/command/interface.go
@@ -114,6 +114,10 @@
//
// (Re)generate the gopls.mod file for a workspace.
GenerateGoplsMod(context.Context, URIArg) error
+
+ ListKnownPackages(context.Context, URIArg) (ListKnownPackagesResult, error)
+
+ AddImport(context.Context, AddImportArgs) (AddImportResult, error)
}
type RunTestsArgs struct {
@@ -187,3 +191,18 @@
Pkg string
AddRequire bool
}
+
+// TODO (Marwan): document :)
+
+type AddImportArgs struct {
+ ImportPath string
+ URI protocol.DocumentURI
+}
+
+type AddImportResult struct {
+ Edits []protocol.TextDocumentEdit
+}
+
+type ListKnownPackagesResult struct {
+ Packages []string
+}
diff --git a/internal/lsp/source/api_json.go b/internal/lsp/source/api_json.go
index 83b3b34..7352130 100755
--- a/internal/lsp/source/api_json.go
+++ b/internal/lsp/source/api_json.go
@@ -679,6 +679,12 @@
ArgDoc: "{\n\t// The go.mod file URI.\n\t\"URI\": string,\n\t// Additional args to pass to the go command.\n\t\"GoCmdArgs\": []string,\n\t// Whether to add a require directive.\n\t\"AddRequire\": bool,\n}",
},
{
+ Command: "gopls.add_import",
+ Title: "",
+ Doc: "",
+ ArgDoc: "{\n\t\"ImportPath\": string,\n\t\"URI\": string,\n}",
+ },
+ {
Command: "gopls.apply_fix",
Title: "Apply a fix",
Doc: "Applies a fix to a region of source code.",
@@ -715,6 +721,12 @@
ArgDoc: "{\n\t// Any document URI within the relevant module.\n\t\"URI\": string,\n\t// The package to go get.\n\t\"Pkg\": string,\n\t\"AddRequire\": bool,\n}",
},
{
+ Command: "gopls.list_known_packages",
+ Title: "",
+ Doc: "",
+ ArgDoc: "{\n\t// The file URI.\n\t\"URI\": string,\n}",
+ },
+ {
Command: "gopls.regenerate_cgo",
Title: "Regenerate cgo",
Doc: "Regenerates cgo definitions.",