зеркало из https://github.com/golang/tools.git
internal/lsp: refactor code action go command calls
Change-Id: I211e8f97d7d121f5c0acd845eadb00ec73d89c2c Reviewed-on: https://go-review.googlesource.com/c/tools/+/272091 Trust: Heschi Kreinick <heschi@google.com> Run-TryBot: Heschi Kreinick <heschi@google.com> gopls-CI: kokoro <noreply+kokoro@google.com> TryBot-Result: Go Bot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
This commit is contained in:
Родитель
5bad45943a
Коммит
a9763abba0
|
@ -192,11 +192,16 @@ func (s *Server) runCommand(ctx context.Context, work *workDone, command *source
|
|||
}
|
||||
// The flow for `go mod tidy` and `go mod vendor` is almost identical,
|
||||
// so we combine them into one case for convenience.
|
||||
a := "tidy"
|
||||
action := "tidy"
|
||||
if command == source.CommandVendor {
|
||||
a = "vendor"
|
||||
action = "vendor"
|
||||
}
|
||||
return s.directGoModCommand(ctx, uri, "mod", a)
|
||||
snapshot, _, ok, release, err := s.beginFileRequest(ctx, uri, source.UnknownKind)
|
||||
defer release()
|
||||
if !ok {
|
||||
return err
|
||||
}
|
||||
return runSimpleGoCommand(ctx, snapshot, source.UpdateUserModFile, uri.SpanURI(), "mod", []string{action})
|
||||
case source.CommandAddDependency, source.CommandUpgradeDependency, source.CommandRemoveDependency:
|
||||
var uri protocol.DocumentURI
|
||||
var goCmdArgs []string
|
||||
|
@ -204,22 +209,18 @@ func (s *Server) runCommand(ctx context.Context, work *workDone, command *source
|
|||
if err := source.UnmarshalArgs(args, &uri, &addRequire, &goCmdArgs); err != nil {
|
||||
return err
|
||||
}
|
||||
if addRequire {
|
||||
// Using go get to create a new dependency results in an
|
||||
// `// indirect` comment we may not want. The only way to avoid it
|
||||
// is to add the require as direct first. Then we can use go get to
|
||||
// update go.sum and tidy up.
|
||||
if err := s.directGoModCommand(ctx, uri, "mod", append([]string{"edit", "-require"}, goCmdArgs...)...); err != nil {
|
||||
return err
|
||||
}
|
||||
snapshot, _, ok, release, err := s.beginFileRequest(ctx, uri, source.UnknownKind)
|
||||
defer release()
|
||||
if !ok {
|
||||
return err
|
||||
}
|
||||
return s.directGoModCommand(ctx, uri, "get", append([]string{"-d"}, goCmdArgs...)...)
|
||||
return s.runGoGetModule(ctx, snapshot, uri.SpanURI(), addRequire, goCmdArgs)
|
||||
case source.CommandToggleDetails:
|
||||
var fileURI span.URI
|
||||
var fileURI protocol.DocumentURI
|
||||
if err := source.UnmarshalArgs(args, &fileURI); err != nil {
|
||||
return err
|
||||
}
|
||||
pkgDir := span.URIFromPath(filepath.Dir(fileURI.Filename()))
|
||||
pkgDir := span.URIFromPath(filepath.Dir(fileURI.SpanURI().Filename()))
|
||||
s.gcOptimizationDetailsMu.Lock()
|
||||
if _, ok := s.gcOptimizationDetails[pkgDir]; ok {
|
||||
delete(s.gcOptimizationDetails, pkgDir)
|
||||
|
@ -229,12 +230,11 @@ func (s *Server) runCommand(ctx context.Context, work *workDone, command *source
|
|||
s.gcOptimizationDetailsMu.Unlock()
|
||||
// need to recompute diagnostics.
|
||||
// so find the snapshot
|
||||
sv, err := s.session.ViewOf(fileURI)
|
||||
if err != nil {
|
||||
snapshot, _, ok, release, err := s.beginFileRequest(ctx, fileURI, source.UnknownKind)
|
||||
defer release()
|
||||
if !ok {
|
||||
return err
|
||||
}
|
||||
snapshot, release := sv.Snapshot(ctx)
|
||||
defer release()
|
||||
s.diagnoseSnapshot(snapshot, nil, false)
|
||||
case source.CommandGenerateGoplsMod:
|
||||
var v source.View
|
||||
|
@ -275,21 +275,6 @@ func (s *Server) runCommand(ctx context.Context, work *workDone, command *source
|
|||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) directGoModCommand(ctx context.Context, uri protocol.DocumentURI, verb string, args ...string) error {
|
||||
view, err := s.session.ViewOf(uri.SpanURI())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
snapshot, release := view.Snapshot(ctx)
|
||||
defer release()
|
||||
_, err = snapshot.RunGoCommandDirect(ctx, source.UpdateUserModFile, &gocommand.Invocation{
|
||||
Verb: verb,
|
||||
Args: args,
|
||||
WorkingDir: filepath.Dir(uri.SpanURI().Filename()),
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *Server) runTests(ctx context.Context, snapshot source.Snapshot, uri protocol.DocumentURI, work *workDone, tests, benchmarks []string) error {
|
||||
pkgs, err := snapshot.PackagesForFile(ctx, uri.SpanURI(), source.TypecheckWorkspace)
|
||||
if err != nil {
|
||||
|
@ -387,3 +372,25 @@ func (s *Server) runGoGenerate(ctx context.Context, snapshot source.Snapshot, di
|
|||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Server) runGoGetModule(ctx context.Context, snapshot source.Snapshot, uri span.URI, addRequire bool, args []string) error {
|
||||
if addRequire {
|
||||
// Using go get to create a new dependency results in an
|
||||
// `// indirect` comment we may not want. The only way to avoid it
|
||||
// is to add the require as direct first. Then we can use go get to
|
||||
// update go.sum and tidy up.
|
||||
if err := runSimpleGoCommand(ctx, snapshot, source.UpdateUserModFile, uri, "mod", append([]string{"edit", "-require"}, args...)); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return runSimpleGoCommand(ctx, snapshot, source.UpdateUserModFile, uri, "get", append([]string{"-d"}, args...))
|
||||
}
|
||||
|
||||
func runSimpleGoCommand(ctx context.Context, snapshot source.Snapshot, mode source.InvocationMode, uri span.URI, verb string, args []string) error {
|
||||
_, err := snapshot.RunGoCommandDirect(ctx, mode, &gocommand.Invocation{
|
||||
Verb: verb,
|
||||
Args: args,
|
||||
WorkingDir: filepath.Dir(uri.Filename()),
|
||||
})
|
||||
return err
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче