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