| //+build go1.15 |
| |
| package regtest |
| |
| import ( |
| "testing" |
| |
| "golang.org/x/tools/internal/lsp/protocol" |
| "golang.org/x/tools/internal/lsp/source" |
| "golang.org/x/tools/internal/testenv" |
| ) |
| |
| func TestRegenerateCgo(t *testing.T) { |
| t.Skip("This test fails in some environments: see golang.org/issues/39135") |
| testenv.NeedsTool(t, "cgo") |
| |
| const workspace = ` |
| -- go.mod -- |
| module example.com |
| -- cgo.go -- |
| package x |
| |
| /* |
| int fortythree() { return 42; } |
| */ |
| import "C" |
| |
| func Foo() { |
| print(C.fortytwo()) |
| } |
| ` |
| runner.Run(t, workspace, func(t *testing.T, env *Env) { |
| // Open the file. We should have a nonexistant symbol. |
| env.OpenFile("cgo.go") |
| env.Await(env.DiagnosticAtRegexp("cgo.go", `C\.(fortytwo)`)) // could not determine kind of name for C.fortytwo |
| |
| // Fix the C function name. We haven't regenerated cgo, so nothing should be fixed. |
| env.RegexpReplace("cgo.go", `int fortythree`, "int fortytwo") |
| env.SaveBuffer("cgo.go") |
| env.Await(env.DiagnosticAtRegexp("cgo.go", `C\.(fortytwo)`)) |
| |
| // Regenerate cgo, fixing the diagnostic. |
| lenses := env.CodeLens("cgo.go") |
| var lens protocol.CodeLens |
| for _, l := range lenses { |
| if l.Command.Command == source.CommandRegenerateCgo { |
| lens = l |
| } |
| } |
| if _, err := env.Editor.Server.ExecuteCommand(env.Ctx, &protocol.ExecuteCommandParams{ |
| Command: lens.Command.Command, |
| Arguments: lens.Command.Arguments, |
| }); err != nil { |
| t.Fatal(err) |
| } |
| env.Await(EmptyDiagnostics("cgo.go")) |
| }) |
| } |