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