mirror of
https://github.com/golang/go
synced 2024-11-18 13:04:46 -07:00
internal/lsp: add a reg test to test "go mod init"
This change adds a RunGoCommand function to the workspace, which will allow us to test how gopls responds when a certain go command is executed. Add a test that checks behavior after "go mod init" runs. Change-Id: I679249c1654b136d44187397b4196b8a10b5615e Reviewed-on: https://go-review.googlesource.com/c/tools/+/226478 Run-TryBot: Rebecca Stambler <rstambler@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
parent
a7c0594f4e
commit
e18c1c42de
@ -82,7 +82,7 @@ func (s *Server) diagnose(ctx context.Context, snapshot source.Snapshot, alwaysA
|
|||||||
// Diagnose all of the packages in the workspace.
|
// Diagnose all of the packages in the workspace.
|
||||||
wsPackages, err := snapshot.WorkspacePackages(ctx)
|
wsPackages, err := snapshot.WorkspacePackages(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
event.Error(ctx, "failed to load workspace packages, skipping diagnostics", err, tag.Snapshot.Of(snapshot.ID()), tag.Directory.Of(snapshot.View().Folder))
|
event.Error(ctx, "failed to load workspace packages, skipping diagnostics", err, tag.Snapshot.Of(snapshot.ID()), tag.Directory.Of(snapshot.View().Folder()))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
for _, ph := range wsPackages {
|
for _, ph := range wsPackages {
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"golang.org/x/tools/internal/gocommand"
|
||||||
"golang.org/x/tools/internal/lsp/protocol"
|
"golang.org/x/tools/internal/lsp/protocol"
|
||||||
"golang.org/x/tools/internal/span"
|
"golang.org/x/tools/internal/span"
|
||||||
"golang.org/x/tools/txtar"
|
"golang.org/x/tools/txtar"
|
||||||
@ -149,6 +150,32 @@ func (w *Workspace) RemoveFile(ctx context.Context, path string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RunGoCommand executes a go command in the workspace.
|
||||||
|
func (w *Workspace) RunGoCommand(ctx context.Context, verb string, args ...string) error {
|
||||||
|
inv := gocommand.Invocation{
|
||||||
|
Verb: verb,
|
||||||
|
Args: args,
|
||||||
|
WorkingDir: w.workdir,
|
||||||
|
}
|
||||||
|
_, stderr, _, err := inv.RunRaw(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// Hardcoded "file watcher": If the command executed was "go mod init",
|
||||||
|
// send a file creation event for a go.mod in the working directory.
|
||||||
|
if strings.HasPrefix(stderr.String(), "go: creating new go.mod") {
|
||||||
|
modpath := filepath.Join(w.workdir, "go.mod")
|
||||||
|
w.sendEvents(ctx, []FileEvent{{
|
||||||
|
Path: modpath,
|
||||||
|
ProtocolEvent: protocol.FileEvent{
|
||||||
|
URI: toURI(modpath),
|
||||||
|
Type: protocol.Created,
|
||||||
|
},
|
||||||
|
}})
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (w *Workspace) sendEvents(ctx context.Context, evts []FileEvent) {
|
func (w *Workspace) sendEvents(ctx context.Context, evts []FileEvent) {
|
||||||
w.watcherMu.Lock()
|
w.watcherMu.Lock()
|
||||||
watchers := make([]func(context.Context, []FileEvent), len(w.watchers))
|
watchers := make([]func(context.Context, []FileEvent), len(w.watchers))
|
||||||
|
@ -152,34 +152,46 @@ import "mod.com/bob"
|
|||||||
func main() {
|
func main() {
|
||||||
bob.Hello()
|
bob.Hello()
|
||||||
}
|
}
|
||||||
|
-- bob/bob.go --
|
||||||
|
package bob
|
||||||
|
|
||||||
|
func Hello() {
|
||||||
|
var x int
|
||||||
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
// TestNoMod confirms that gopls continues to work when a user adds a go.mod
|
// TestNoMod confirms that gopls continues to work when a user adds a go.mod
|
||||||
// file to their workspace.
|
// file to their workspace.
|
||||||
func TestNoMod(t *testing.T) {
|
func TestNoMod(t *testing.T) {
|
||||||
runner.Run(t, noMod, func(env *Env) {
|
t.Run("manual", func(t *testing.T) {
|
||||||
env.Await(
|
runner.Run(t, noMod, func(env *Env) {
|
||||||
env.DiagnosticAtRegexp("main.go", `"mod.com/bob"`),
|
env.Await(
|
||||||
)
|
env.DiagnosticAtRegexp("main.go", `"mod.com/bob"`),
|
||||||
env.CreateBuffer("bob/bob.go", `package bob
|
)
|
||||||
|
env.CreateBuffer("go.mod", `module mod.com
|
||||||
|
|
||||||
func Hello() {
|
go 1.12
|
||||||
var x int
|
|
||||||
}
|
|
||||||
`)
|
`)
|
||||||
env.Await(
|
env.SaveBuffer("go.mod")
|
||||||
env.DiagnosticAtRegexp("bob/bob.go", "x"),
|
env.Await(
|
||||||
)
|
EmptyDiagnostics("main.go"),
|
||||||
// Save this file because otherwise, the go command will not be able to
|
env.DiagnosticAtRegexp("bob/bob.go", "x"),
|
||||||
// resolve mod.com/bob as a package.
|
)
|
||||||
env.SaveBuffer("bob/bob.go")
|
})
|
||||||
env.CreateBuffer("go.mod", `module mod.com
|
|
||||||
|
|
||||||
go 1.12
|
|
||||||
`)
|
|
||||||
env.SaveBuffer("go.mod")
|
|
||||||
env.Await(
|
|
||||||
EmptyDiagnostics("main.go"),
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
t.Run("initialized", func(t *testing.T) {
|
||||||
|
runner.Run(t, noMod, func(env *Env) {
|
||||||
|
env.Await(
|
||||||
|
env.DiagnosticAtRegexp("main.go", `"mod.com/bob"`),
|
||||||
|
)
|
||||||
|
if err := env.W.RunGoCommand(env.Ctx, "mod", "init", "mod.com"); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
env.Await(
|
||||||
|
EmptyDiagnostics("main.go"),
|
||||||
|
env.DiagnosticAtRegexp("bob/bob.go", "x"),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user