internal/lsp/regtest: remove redundant T and ctx params from regtest funcs

In an effort to be idiomatic, I made the regtest func signature
func(context.Context, testing.T, *Env), despite the fact that Env
already has a Context and a T.

This just ended up causing more confusion, as it's not clear which
Context or T to use. Remove this and just use the fields on Env.

Change-Id: I54da1fdfe6ce17a67601b2af8640d4d2ea676e8c
Reviewed-on: https://go-review.googlesource.com/c/tools/+/225157
Run-TryBot: Robert Findley <rfindley@google.com>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/internal/lsp/regtest/definition_test.go b/internal/lsp/regtest/definition_test.go
index 09084ac..9f175b5 100644
--- a/internal/lsp/regtest/definition_test.go
+++ b/internal/lsp/regtest/definition_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"path"
 	"testing"
 )
@@ -30,7 +29,7 @@
 `
 
 func TestGoToInternalDefinition(t *testing.T) {
-	runner.Run(t, internalDefinition, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, internalDefinition, func(env *Env) {
 		env.OpenFile("main.go")
 		name, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", "message"))
 		if want := "const.go"; name != want {
@@ -60,7 +59,7 @@
 }`
 
 func TestGoToStdlibDefinition(t *testing.T) {
-	runner.Run(t, stdlibDefinition, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, stdlibDefinition, func(env *Env) {
 		env.OpenFile("main.go")
 		name, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", "Now"))
 		if got, want := path.Base(name), "time.go"; got != want {
diff --git a/internal/lsp/regtest/diagnostics_test.go b/internal/lsp/regtest/diagnostics_test.go
index 48a3fdc..609b375 100644
--- a/internal/lsp/regtest/diagnostics_test.go
+++ b/internal/lsp/regtest/diagnostics_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"testing"
 )
 
@@ -24,7 +23,7 @@
 }`
 
 func TestDiagnosticErrorInEditedFile(t *testing.T) {
-	runner.Run(t, exampleProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, exampleProgram, func(env *Env) {
 		// Deleting the 'n' at the end of Println should generate a single error
 		// diagnostic.
 		env.OpenFile("main.go")
@@ -43,7 +42,7 @@
 func TestMissingImportDiagsClearOnFirstFile(t *testing.T) {
 	t.Skip("skipping due to golang.org/issues/37195")
 	t.Parallel()
-	runner.Run(t, onlyMod, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, onlyMod, func(env *Env) {
 		env.CreateBuffer("main.go", "package main\n\nfunc m() {\nlog.Println()\n}")
 		env.SaveBuffer("main.go")
 		// TODO: this shouldn't actually happen
@@ -57,7 +56,7 @@
 `
 
 func TestDiagnosticErrorInNewFile(t *testing.T) {
-	runner.Run(t, brokenFile, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, brokenFile, func(env *Env) {
 		env.CreateBuffer("broken.go", brokenFile)
 		env.Await(env.DiagnosticAtRegexp("broken.go", "\"abc"))
 	})
@@ -80,7 +79,7 @@
 `
 
 func TestDiagnosticClearingOnEdit(t *testing.T) {
-	runner.Run(t, badPackage, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, badPackage, func(env *Env) {
 		env.OpenFile("b.go")
 		env.Await(env.DiagnosticAtRegexp("a.go", "a = 1"), env.DiagnosticAtRegexp("b.go", "a = 2"))
 
@@ -91,7 +90,7 @@
 }
 
 func TestDiagnosticClearingOnDelete(t *testing.T) {
-	runner.Run(t, badPackage, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, badPackage, func(env *Env) {
 		env.OpenFile("a.go")
 		env.Await(env.DiagnosticAtRegexp("a.go", "a = 1"), env.DiagnosticAtRegexp("b.go", "a = 2"))
 		env.RemoveFileFromWorkspace("b.go")
@@ -101,7 +100,7 @@
 }
 
 func TestDiagnosticClearingOnClose(t *testing.T) {
-	runner.Run(t, badPackage, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, badPackage, func(env *Env) {
 		env.CreateBuffer("c.go", `package consts
 
 const a = 3`)
diff --git a/internal/lsp/regtest/env.go b/internal/lsp/regtest/env.go
index 8ba39f9..2b372c0 100644
--- a/internal/lsp/regtest/env.go
+++ b/internal/lsp/regtest/env.go
@@ -141,13 +141,13 @@
 // Run executes the test function in the default configured gopls execution
 // modes. For each a test run, a new workspace is created containing the
 // un-txtared files specified by filedata.
-func (r *Runner) Run(t *testing.T, filedata string, test func(context.Context, *testing.T, *Env)) {
+func (r *Runner) Run(t *testing.T, filedata string, test func(e *Env)) {
 	t.Helper()
 	r.RunInMode(r.defaultModes, t, filedata, test)
 }
 
 // RunInMode runs the test in the execution modes specified by the modes bitmask.
-func (r *Runner) RunInMode(modes EnvMode, t *testing.T, filedata string, test func(ctx context.Context, t *testing.T, e *Env)) {
+func (r *Runner) RunInMode(modes EnvMode, t *testing.T, filedata string, test func(e *Env)) {
 	t.Helper()
 	tests := []struct {
 		name         string
@@ -182,7 +182,7 @@
 					panic(err)
 				}
 			}()
-			test(ctx, t, env)
+			test(env)
 		})
 	}
 }
@@ -230,8 +230,8 @@
 // on any error, so that tests for the happy path may be written without
 // checking errors.
 type Env struct {
-	t   *testing.T
-	ctx context.Context
+	T   *testing.T
+	Ctx context.Context
 
 	// Most tests should not need to access the workspace, editor, server, or
 	// connection, but they are available if needed.
@@ -266,8 +266,8 @@
 		t.Fatal(err)
 	}
 	env := &Env{
-		t:               t,
-		ctx:             ctx,
+		T:               t,
+		Ctx:             ctx,
 		W:               ws,
 		E:               editor,
 		Server:          ts,
@@ -362,7 +362,7 @@
 	// require careful checking of conditions around every state change, so for
 	// now we just limit the scope to diagnostic conditions.
 
-	e.t.Helper()
+	e.T.Helper()
 	e.mu.Lock()
 	// Before adding the waiter, we check if the condition is currently met to
 	// avoid a race where the condition was realized before Await was called.
@@ -379,7 +379,7 @@
 	e.mu.Unlock()
 
 	select {
-	case <-e.ctx.Done():
+	case <-e.Ctx.Done():
 		// Debugging an unmet expectation can be tricky, so we put some effort into
 		// nicely formatting the failure.
 		var descs []string
@@ -389,7 +389,7 @@
 		e.mu.Lock()
 		diagString := formatDiagnostics(e.lastDiagnostics)
 		e.mu.Unlock()
-		e.t.Fatalf("waiting on [%s]:\nerr:%v\ndiagnostics:\n%s", strings.Join(descs, ", "), e.ctx.Err(), diagString)
+		e.T.Fatalf("waiting on [%s]:\nerr:%v\ndiagnostics:\n%s", strings.Join(descs, ", "), e.Ctx.Err(), diagString)
 	case <-met:
 	}
 }
diff --git a/internal/lsp/regtest/formatting_test.go b/internal/lsp/regtest/formatting_test.go
index d1b43bb..202f4d4 100644
--- a/internal/lsp/regtest/formatting_test.go
+++ b/internal/lsp/regtest/formatting_test.go
@@ -1,7 +1,6 @@
 package regtest
 
 import (
-	"context"
 	"testing"
 )
 
@@ -23,7 +22,7 @@
 `
 
 func TestFormatting(t *testing.T) {
-	runner.Run(t, unformattedProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, unformattedProgram, func(env *Env) {
 		env.OpenFile("main.go")
 		env.FormatBuffer("main.go")
 		got := env.E.BufferText("main.go")
@@ -69,7 +68,7 @@
 `
 
 func TestOrganizeImports(t *testing.T) {
-	runner.Run(t, disorganizedProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, disorganizedProgram, func(env *Env) {
 		env.OpenFile("main.go")
 		env.OrganizeImports("main.go")
 		got := env.E.BufferText("main.go")
@@ -81,7 +80,7 @@
 }
 
 func TestFormattingOnSave(t *testing.T) {
-	runner.Run(t, disorganizedProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, disorganizedProgram, func(env *Env) {
 		env.OpenFile("main.go")
 		env.SaveBuffer("main.go")
 		got := env.E.BufferText("main.go")
diff --git a/internal/lsp/regtest/serialization_test.go b/internal/lsp/regtest/serialization_test.go
index 6b7bef0..2ac90d9 100644
--- a/internal/lsp/regtest/serialization_test.go
+++ b/internal/lsp/regtest/serialization_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"encoding/json"
 	"testing"
 
@@ -27,14 +26,14 @@
 }`
 
 func TestHoverSerialization(t *testing.T) {
-	runner.Run(t, simpleProgram, func(ctx context.Context, t *testing.T, env *Env) {
+	runner.Run(t, simpleProgram, func(env *Env) {
 		// Hover on an empty line.
 		params := protocol.HoverParams{}
 		params.TextDocument.URI = env.W.URI("main.go")
 		params.Position.Line = 3
 		params.Position.Character = 0
 		var resp json.RawMessage
-		if err := env.Conn.Call(ctx, "textDocument/hover", &params, &resp); err != nil {
+		if err := env.Conn.Call(env.Ctx, "textDocument/hover", &params, &resp); err != nil {
 			t.Fatal(err)
 		}
 		if len(string(resp)) > 0 {
diff --git a/internal/lsp/regtest/shared_test.go b/internal/lsp/regtest/shared_test.go
index dd465ae..8cf5e9c 100644
--- a/internal/lsp/regtest/shared_test.go
+++ b/internal/lsp/regtest/shared_test.go
@@ -5,7 +5,6 @@
 package regtest
 
 import (
-	"context"
 	"testing"
 )
 
@@ -23,19 +22,19 @@
 	fmt.Println("Hello World.")
 }`
 
-func runShared(t *testing.T, program string, testFunc func(ctx context.Context, t *testing.T, env1 *Env, env2 *Env)) {
+func runShared(t *testing.T, program string, testFunc func(env1 *Env, env2 *Env)) {
 	// Only run these tests in forwarded modes.
 	modes := runner.Modes() & (Forwarded | SeparateProcess)
-	runner.RunInMode(modes, t, sharedProgram, func(ctx context.Context, t *testing.T, env1 *Env) {
+	runner.RunInMode(modes, t, sharedProgram, func(env1 *Env) {
 		// Create a second test session connected to the same workspace and server
 		// as the first.
-		env2 := NewEnv(ctx, t, env1.W, env1.Server)
-		testFunc(ctx, t, env1, env2)
+		env2 := NewEnv(env1.Ctx, t, env1.W, env1.Server)
+		testFunc(env1, env2)
 	})
 }
 
 func TestSimultaneousEdits(t *testing.T) {
-	runShared(t, exampleProgram, func(ctx context.Context, t *testing.T, env1 *Env, env2 *Env) {
+	runShared(t, exampleProgram, func(env1 *Env, env2 *Env) {
 		// In editor #1, break fmt.Println as before.
 		env1.OpenFile("main.go")
 		env1.RegexpReplace("main.go", "Printl(n)", "")
@@ -50,7 +49,7 @@
 }
 
 func TestShutdown(t *testing.T) {
-	runShared(t, sharedProgram, func(ctx context.Context, t *testing.T, env1 *Env, env2 *Env) {
+	runShared(t, sharedProgram, func(env1 *Env, env2 *Env) {
 		env1.CloseEditor()
 		// Now make an edit in editor #2 to trigger diagnostics.
 		env2.OpenFile("main.go")
diff --git a/internal/lsp/regtest/wrappers.go b/internal/lsp/regtest/wrappers.go
index a374b57..ece6063 100644
--- a/internal/lsp/regtest/wrappers.go
+++ b/internal/lsp/regtest/wrappers.go
@@ -11,53 +11,53 @@
 // RemoveFileFromWorkspace deletes a file on disk but does nothing in the
 // editor. It calls t.Fatal on any error.
 func (e *Env) RemoveFileFromWorkspace(name string) {
-	e.t.Helper()
-	if err := e.W.RemoveFile(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.W.RemoveFile(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // ReadWorkspaceFile reads a file from the workspace, calling t.Fatal on any
 // error.
 func (e *Env) ReadWorkspaceFile(name string) string {
-	e.t.Helper()
+	e.T.Helper()
 	content, err := e.W.ReadFile(name)
 	if err != nil {
-		e.t.Fatal(err)
+		e.T.Fatal(err)
 	}
 	return content
 }
 
 // OpenFile opens a file in the editor, calling t.Fatal on any error.
 func (e *Env) OpenFile(name string) {
-	e.t.Helper()
-	if err := e.E.OpenFile(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.OpenFile(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // CreateBuffer creates a buffer in the editor, calling t.Fatal on any error.
 func (e *Env) CreateBuffer(name string, content string) {
-	e.t.Helper()
-	if err := e.E.CreateBuffer(e.ctx, name, content); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.CreateBuffer(e.Ctx, name, content); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // CloseBuffer closes an editor buffer without saving, calling t.Fatal on any
 // error.
 func (e *Env) CloseBuffer(name string) {
-	e.t.Helper()
-	if err := e.E.CloseBuffer(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.CloseBuffer(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // EditBuffer applies edits to an editor buffer, calling t.Fatal on any error.
 func (e *Env) EditBuffer(name string, edits ...fake.Edit) {
-	e.t.Helper()
-	if err := e.E.EditBuffer(e.ctx, name, edits); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.EditBuffer(e.Ctx, name, edits); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
@@ -65,13 +65,13 @@
 // buffer specified by name, calling t.Fatal on any error. It first searches
 // for the position in open buffers, then in workspace files.
 func (e *Env) RegexpSearch(name, re string) fake.Pos {
-	e.t.Helper()
+	e.T.Helper()
 	pos, err := e.E.RegexpSearch(name, re)
 	if err == fake.ErrUnknownBuffer {
 		pos, err = e.W.RegexpSearch(name, re)
 	}
 	if err != nil {
-		e.t.Fatalf("RegexpSearch: %v", err)
+		e.T.Fatalf("RegexpSearch: %v", err)
 	}
 	return pos
 }
@@ -79,55 +79,55 @@
 // RegexpReplace replaces the first group in the first match of regexpStr with
 // the replace text, calling t.Fatal on any error.
 func (e *Env) RegexpReplace(name, regexpStr, replace string) {
-	e.t.Helper()
-	if err := e.E.RegexpReplace(e.ctx, name, regexpStr, replace); err != nil {
-		e.t.Fatalf("RegexpReplace: %v", err)
+	e.T.Helper()
+	if err := e.E.RegexpReplace(e.Ctx, name, regexpStr, replace); err != nil {
+		e.T.Fatalf("RegexpReplace: %v", err)
 	}
 }
 
 // SaveBuffer saves an editor buffer, calling t.Fatal on any error.
 func (e *Env) SaveBuffer(name string) {
-	e.t.Helper()
-	if err := e.E.SaveBuffer(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.SaveBuffer(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // GoToDefinition goes to definition in the editor, calling t.Fatal on any
 // error.
 func (e *Env) GoToDefinition(name string, pos fake.Pos) (string, fake.Pos) {
-	e.t.Helper()
-	n, p, err := e.E.GoToDefinition(e.ctx, name, pos)
+	e.T.Helper()
+	n, p, err := e.E.GoToDefinition(e.Ctx, name, pos)
 	if err != nil {
-		e.t.Fatal(err)
+		e.T.Fatal(err)
 	}
 	return n, p
 }
 
 // FormatBuffer formats the editor buffer, calling t.Fatal on any error.
 func (e *Env) FormatBuffer(name string) {
-	e.t.Helper()
-	if err := e.E.FormatBuffer(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.FormatBuffer(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // OrganizeImports processes the source.organizeImports codeAction, calling
 // t.Fatal on any error.
 func (e *Env) OrganizeImports(name string) {
-	e.t.Helper()
-	if err := e.E.OrganizeImports(e.ctx, name); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.OrganizeImports(e.Ctx, name); err != nil {
+		e.T.Fatal(err)
 	}
 }
 
 // CloseEditor shuts down the editor, calling t.Fatal on any error.
 func (e *Env) CloseEditor() {
-	e.t.Helper()
-	if err := e.E.Shutdown(e.ctx); err != nil {
-		e.t.Fatal(err)
+	e.T.Helper()
+	if err := e.E.Shutdown(e.Ctx); err != nil {
+		e.T.Fatal(err)
 	}
-	if err := e.E.Exit(e.ctx); err != nil {
-		e.t.Fatal(err)
+	if err := e.E.Exit(e.Ctx); err != nil {
+		e.T.Fatal(err)
 	}
 }