1package lsp
2
3import (
4	"context"
5
6	"golang.org/x/tools/internal/lsp/protocol"
7	"golang.org/x/tools/internal/lsp/source"
8	errors "golang.org/x/xerrors"
9)
10
11func (s *Server) executeCommand(ctx context.Context, params *protocol.ExecuteCommandParams) (interface{}, error) {
12	switch params.Command {
13	case "tidy":
14		if len(params.Arguments) == 0 || len(params.Arguments) > 1 {
15			return nil, errors.Errorf("expected one file URI for call to `go mod tidy`, got %v", params.Arguments)
16		}
17		uri := protocol.DocumentURI(params.Arguments[0].(string))
18		snapshot, _, ok, err := s.beginFileRequest(uri, source.Mod)
19		if !ok {
20			return nil, err
21		}
22		// Run go.mod tidy on the view.
23		if _, err := source.InvokeGo(ctx, snapshot.View().Folder().Filename(), snapshot.Config(ctx).Env, "mod", "tidy"); err != nil {
24			return nil, err
25		}
26	case "upgrade.dependency":
27		if len(params.Arguments) < 2 {
28			return nil, errors.Errorf("expected one file URI and one dependency for call to `go get`, got %v", params.Arguments)
29		}
30		uri := protocol.DocumentURI(params.Arguments[0].(string))
31		snapshot, _, ok, err := s.beginFileRequest(uri, source.UnknownKind)
32		if !ok {
33			return nil, err
34		}
35		dep := params.Arguments[1].(string)
36		// Run "go get" on the dependency to upgrade it to the latest version.
37		if _, err := source.InvokeGo(ctx, snapshot.View().Folder().Filename(), snapshot.Config(ctx).Env, "get", dep); err != nil {
38			return nil, err
39		}
40	}
41	return nil, nil
42}
43