diff -urN a/gopls/README.md b/gopls/README.md
--- a/gopls/README.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/README.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,105 +0,0 @@
-# `gopls`, the Go language server
-
-[![PkgGoDev](https://pkg.go.dev/badge/golang.org/x/tools/gopls)](https://pkg.go.dev/golang.org/x/tools/gopls)
-
-`gopls` (pronounced "Go please") is the official Go [language server] developed
-by the Go team. It provides IDE features to any [LSP]-compatible editor.
-
-<!--TODO(rstambler): Add gifs here.-->
-
-You should not need to interact with `gopls` directly--it will be automatically
-integrated into your editor. The specific features and settings vary slightly
-by editor, so we recommend that you proceed to the [documentation for your
-editor](#editors) below.
-
-## Editors
-
-To get started with `gopls`, install an LSP plugin in your editor of choice.
-
-* [VSCode](https://github.com/golang/vscode-go/blob/master/README.md)
-* [Vim / Neovim](doc/vim.md)
-* [Emacs](doc/emacs.md)
-* [Atom](https://github.com/MordFustang21/ide-gopls)
-* [Sublime Text](doc/subl.md)
-* [Acme](https://github.com/fhs/acme-lsp)
-
-If you use `gopls` with an editor that is not on this list, please let us know
-by [filing an issue](#new-issue) or [modifying this documentation](doc/contributing.md).
-
-## Installation
-
-For the most part, you should not need to install or update `gopls`. Your
-editor should handle that step for you.
-
-If you do want to get the latest stable version of `gopls`, change to any
-directory that is both outside of your `GOPATH` and outside of a module (a temp
-directory is fine), and run:
-
-```sh
-go install golang.org/x/tools/gopls@latest
-```
-
-Learn more in the [advanced installation
-instructions](doc/advanced.md#installing-unreleased-versions).
-
-## Setting up your workspace
-
-`gopls` supports both Go module and GOPATH modes, but if you are working with
-multiple modules or uncommon project layouts, you will need to specifically
-configure your workspace. See the [Workspace document](doc/workspace.md) for
-information on supported workspace layouts.
-
-## Configuration
-
-You can configure `gopls` to change your editor experience or view additional
-debugging information. Configuration options will be made available by your
-editor, so see your [editor's instructions](#editors) for specific details. A
-full list of `gopls` settings can be found in the [Settings documentation](doc/settings.md).
-
-### Environment variables
-
-`gopls` inherits your editor's environment, so be aware of any environment
-variables you configure. Some editors, such as VS Code, allow users to
-selectively override the values of some environment variables.
-
-## Troubleshooting
-
-If you are having issues with `gopls`, please follow the steps described in the
-[troubleshooting guide](doc/troubleshooting.md).
-
-## Supported Go versions and build systems
-
-`gopls` follows the [Go Release
-Policy](https://golang.org/doc/devel/release.html#policy), meaning that it
-officially supports the last 2 major Go releases. Per
-[issue #39146](golang.org/issues/39146), we attempt to maintain best-effort
-support for the last 4 major Go releases, but this support extends only to not
-breaking the build and avoiding easily fixable regressions.
-
-Our extended support is enforced via [continuous integration with older Go
-versions](doc/contributing.md#ci). This legacy Go CI may not block releases:
-test failures may be skipped rather than fixed. Furthermore, if a regression in
-an older Go version causes irreconcilable CI failures, we may drop support for
-that Go version in CI if it is 3 or 4 Go versions old.
-
-`gopls` currently only supports the `go` command, so if you are using a
-different build system, `gopls` will not work well. Bazel is not officially
-supported, but Bazel support is in development (see
-[bazelbuild/rules_go#512](https://github.com/bazelbuild/rules_go/issues/512)).
-You can follow [these instructions](https://github.com/bazelbuild/rules_go/wiki/Editor-setup)
-to configure your `gopls` to work with Bazel.
-
-## Additional information
-
-* [Features](doc/features.md)
-* [Command-line interface](doc/command-line.md)
-* [Advanced topics](doc/advanced.md)
-* [Contributing to `gopls`](doc/contributing.md)
-* [Integrating `gopls` with an editor](doc/design/integrating.md)
-* [Design requirements and decisions](doc/design/design.md)
-* [Implementation details](doc/design/implementation.md)
-* [Open issues](https://github.com/golang/go/issues?q=is%3Aissue+is%3Aopen+label%3Agopls)
-
-[language server]: https://langserver.org
-[LSP]: https://microsoft.github.io/language-server-protocol/
-[Gophers Slack]: https://gophers.slack.com/
diff -urN a/gopls/api-diff/api_diff.go b/gopls/api-diff/api_diff.go
--- a/gopls/api-diff/api_diff.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/api-diff/api_diff.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,274 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build go1.18
-// +build go1.18
-
-package main
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"flag"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"strings"
-
-	"golang.org/x/tools/internal/gocommand"
-	difflib "golang.org/x/tools/internal/lsp/diff"
-	"golang.org/x/tools/internal/lsp/diff/myers"
-	"golang.org/x/tools/internal/lsp/source"
-)
-
-var (
-	previousVersionFlag = flag.String("prev", "", "version to compare against")
-	versionFlag         = flag.String("version", "", "version being tagged, or current version if omitted")
-)
-
-func main() {
-	flag.Parse()
-
-	apiDiff, err := diffAPI(*versionFlag, *previousVersionFlag)
-	if err != nil {
-		log.Fatal(err)
-	}
-	fmt.Printf(`
-%s
-`, apiDiff)
-}
-
-type JSON interface {
-	String() string
-	Write(io.Writer)
-}
-
-func diffAPI(version, prev string) (string, error) {
-	ctx := context.Background()
-	previousApi, err := loadAPI(ctx, prev)
-	if err != nil {
-		return "", fmt.Errorf("load previous API: %v", err)
-	}
-	var currentApi *source.APIJSON
-	if version == "" {
-		currentApi = source.GeneratedAPIJSON
-	} else {
-		var err error
-		currentApi, err = loadAPI(ctx, version)
-		if err != nil {
-			return "", fmt.Errorf("load current API: %v", err)
-		}
-	}
-
-	b := &strings.Builder{}
-	if err := diff(b, previousApi.Commands, currentApi.Commands, "command", func(c *source.CommandJSON) string {
-		return c.Command
-	}, diffCommands); err != nil {
-		return "", fmt.Errorf("diff commands: %v", err)
-	}
-	if diff(b, previousApi.Analyzers, currentApi.Analyzers, "analyzer", func(a *source.AnalyzerJSON) string {
-		return a.Name
-	}, diffAnalyzers); err != nil {
-		return "", fmt.Errorf("diff analyzers: %v", err)
-	}
-	if err := diff(b, previousApi.Lenses, currentApi.Lenses, "code lens", func(l *source.LensJSON) string {
-		return l.Lens
-	}, diffLenses); err != nil {
-		return "", fmt.Errorf("diff lenses: %v", err)
-	}
-	for key, prev := range previousApi.Options {
-		current, ok := currentApi.Options[key]
-		if !ok {
-			panic(fmt.Sprintf("unexpected option key: %s", key))
-		}
-		if err := diff(b, prev, current, "option", func(o *source.OptionJSON) string {
-			return o.Name
-		}, diffOptions); err != nil {
-			return "", fmt.Errorf("diff options (%s): %v", key, err)
-		}
-	}
-
-	return b.String(), nil
-}
-
-func diff[T JSON](b *strings.Builder, previous, new []T, kind string, uniqueKey func(T) string, diffFunc func(*strings.Builder, T, T)) error {
-	prevJSON := collect(previous, uniqueKey)
-	newJSON := collect(new, uniqueKey)
-	for k := range newJSON {
-		delete(prevJSON, k)
-	}
-	for _, deleted := range prevJSON {
-		b.WriteString(fmt.Sprintf("%s %s was deleted.\n", kind, deleted))
-	}
-	for _, prev := range previous {
-		delete(newJSON, uniqueKey(prev))
-	}
-	if len(newJSON) > 0 {
-		b.WriteString("The following commands were added:\n")
-		for _, n := range newJSON {
-			n.Write(b)
-			b.WriteByte('\n')
-		}
-	}
-	previousMap := collect(previous, uniqueKey)
-	for _, current := range new {
-		prev, ok := previousMap[uniqueKey(current)]
-		if !ok {
-			continue
-		}
-		c, p := bytes.NewBuffer(nil), bytes.NewBuffer(nil)
-		prev.Write(p)
-		current.Write(c)
-		if diff, err := diffStr(p.String(), c.String()); err == nil && diff != "" {
-			diffFunc(b, prev, current)
-			b.WriteString("\n--\n")
-		}
-	}
-	return nil
-}
-
-func collect[T JSON](args []T, uniqueKey func(T) string) map[string]T {
-	m := map[string]T{}
-	for _, arg := range args {
-		m[uniqueKey(arg)] = arg
-	}
-	return m
-}
-
-var goCmdRunner = gocommand.Runner{}
-
-func loadAPI(ctx context.Context, version string) (*source.APIJSON, error) {
-	tmpGopath, err := ioutil.TempDir("", "gopath*")
-	if err != nil {
-		return nil, fmt.Errorf("temp dir: %v", err)
-	}
-	defer os.RemoveAll(tmpGopath)
-
-	exampleDir := fmt.Sprintf("%s/src/example.com", tmpGopath)
-	if err := os.MkdirAll(exampleDir, 0776); err != nil {
-		return nil, fmt.Errorf("mkdir: %v", err)
-	}
-
-	if stdout, err := goCmdRunner.Run(ctx, gocommand.Invocation{
-		Verb:       "mod",
-		Args:       []string{"init", "example.com"},
-		WorkingDir: exampleDir,
-		Env:        append(os.Environ(), fmt.Sprintf("GOPATH=%s", tmpGopath)),
-	}); err != nil {
-		return nil, fmt.Errorf("go mod init failed: %v (stdout: %v)", err, stdout)
-	}
-	if stdout, err := goCmdRunner.Run(ctx, gocommand.Invocation{
-		Verb:       "install",
-		Args:       []string{fmt.Sprintf("golang.org/x/tools/gopls@%s", version)},
-		WorkingDir: exampleDir,
-		Env:        append(os.Environ(), fmt.Sprintf("GOPATH=%s", tmpGopath)),
-	}); err != nil {
-		return nil, fmt.Errorf("go install failed: %v (stdout: %v)", err, stdout.String())
-	}
-	cmd := exec.Cmd{
-		Path: filepath.Join(tmpGopath, "bin", "gopls"),
-		Args: []string{"gopls", "api-json"},
-		Dir:  tmpGopath,
-	}
-	out, err := cmd.Output()
-	if err != nil {
-		return nil, fmt.Errorf("output: %v", err)
-	}
-	apiJson := &source.APIJSON{}
-	if err := json.Unmarshal(out, apiJson); err != nil {
-		return nil, fmt.Errorf("unmarshal: %v", err)
-	}
-	return apiJson, nil
-}
-
-func diffCommands(b *strings.Builder, prev, current *source.CommandJSON) {
-	if prev.Title != current.Title {
-		b.WriteString(fmt.Sprintf("Title changed from %q to %q\n", prev.Title, current.Title))
-	}
-	if prev.Doc != current.Doc {
-		b.WriteString(fmt.Sprintf("Documentation changed from %q to %q\n", prev.Doc, current.Doc))
-	}
-	if prev.ArgDoc != current.ArgDoc {
-		b.WriteString("Arguments changed from " + formatBlock(prev.ArgDoc) + " to " + formatBlock(current.ArgDoc))
-	}
-	if prev.ResultDoc != current.ResultDoc {
-		b.WriteString("Results changed from " + formatBlock(prev.ResultDoc) + " to " + formatBlock(current.ResultDoc))
-	}
-}
-
-func diffAnalyzers(b *strings.Builder, previous, current *source.AnalyzerJSON) {
-	b.WriteString(fmt.Sprintf("Changes to analyzer %s:\n\n", current.Name))
-	if previous.Doc != current.Doc {
-		b.WriteString(fmt.Sprintf("Documentation changed from %q to %q\n", previous.Doc, current.Doc))
-	}
-	if previous.Default != current.Default {
-		b.WriteString(fmt.Sprintf("Default changed from %v to %v\n", previous.Default, current.Default))
-	}
-}
-
-func diffLenses(b *strings.Builder, previous, current *source.LensJSON) {
-	b.WriteString(fmt.Sprintf("Changes to code lens %s:\n\n", current.Title))
-	if previous.Title != current.Title {
-		b.WriteString(fmt.Sprintf("Title changed from %q to %q\n", previous.Title, current.Title))
-	}
-	if previous.Doc != current.Doc {
-		b.WriteString(fmt.Sprintf("Documentation changed from %q to %q\n", previous.Doc, current.Doc))
-	}
-}
-
-func diffOptions(b *strings.Builder, previous, current *source.OptionJSON) {
-	b.WriteString(fmt.Sprintf("Changes to option %s:\n\n", current.Name))
-	if previous.Doc != current.Doc {
-		diff, err := diffStr(previous.Doc, current.Doc)
-		if err != nil {
-			panic(err)
-		}
-		b.WriteString(fmt.Sprintf("Documentation changed:\n%s\n", diff))
-	}
-	if previous.Default != current.Default {
-		b.WriteString(fmt.Sprintf("Default changed from %q to %q\n", previous.Default, current.Default))
-	}
-	if previous.Hierarchy != current.Hierarchy {
-		b.WriteString(fmt.Sprintf("Categorization changed from %q to %q\n", previous.Hierarchy, current.Hierarchy))
-	}
-	if previous.Status != current.Status {
-		b.WriteString(fmt.Sprintf("Status changed from %q to %q\n", previous.Status, current.Status))
-	}
-	if previous.Type != current.Type {
-		b.WriteString(fmt.Sprintf("Type changed from %q to %q\n", previous.Type, current.Type))
-	}
-	// TODO(rstambler): Handle possibility of same number but different keys/values.
-	if len(previous.EnumKeys.Keys) != len(current.EnumKeys.Keys) {
-		b.WriteString(fmt.Sprintf("Enum keys changed from\n%s\n to \n%s\n", previous.EnumKeys, current.EnumKeys))
-	}
-	if len(previous.EnumValues) != len(current.EnumValues) {
-		b.WriteString(fmt.Sprintf("Enum values changed from\n%s\n to \n%s\n", previous.EnumValues, current.EnumValues))
-	}
-}
-
-func formatBlock(str string) string {
-	if str == "" {
-		return `""`
-	}
-	return "\n```\n" + str + "\n```\n"
-}
-
-func diffStr(before, after string) (string, error) {
-	// Add newlines to avoid newline messages in diff.
-	if before == after {
-		return "", nil
-	}
-	before += "\n"
-	after += "\n"
-	d, err := myers.ComputeEdits("", before, after)
-	if err != nil {
-		return "", err
-	}
-	return fmt.Sprintf("%q", difflib.ToUnified("previous", "current", before, d)), err
-}
diff -urN a/gopls/doc/advanced.md b/gopls/doc/advanced.md
--- a/gopls/doc/advanced.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/advanced.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,75 +0,0 @@
-# Advanced topics
-
-This documentation is for advanced `gopls` users, who may want to test
-unreleased versions or try out special features.
-
-## Installing unreleased versions
-
-To get a specific version of `gopls` (for example, to test a prerelease
-version), run:
-
-```sh
-GO111MODULE=on go install golang.org/x/tools/gopls@vX.Y.Z
-```
-
-Where `vX.Y.Z` is the desired version.
-
-### Unstable versions
-
-To update `gopls` to the latest **unstable** version, use:
-
-```sh
-# Create an empty go.mod file, only for tracking requirements.
-cd $(mktemp -d)
-go mod init gopls-unstable
-
-# Use 'go get' to add requirements and to ensure they work together.
-go get golang.org/x/tools/gopls@master golang.org/x/tools@master
-
-# For go1.17 or older, the above `go get` command will build and
-# install `gopls`. For go1.18+ or tip, run the following command to install
-# using selected versions in go.mod.
-go install golang.org/x/tools/gopls
-```
-
-## Working on the Go source distribution
-
-If you are working on the [Go project] itself, the `go` command that `gopls`
-invokes will have to correspond to the version of the source you are working
-on. That is, if you have checked out the Go project to `$HOME/go`, your `go`
-command should be the `$HOME/go/bin/go` executable that you built with
-`make.bash` or equivalent.
-
-You can achieve this by adding the right version of `go` to your `PATH`
-(`export PATH=$HOME/go/bin:$PATH` on Unix systems) or by configuring your
-editor.
-
-## Working with generic code
-
-Gopls has beta support for editing generic Go code, as defined by the type
-parameters proposal ([golang/go#43651](https://golang.org/issues/43651)) and
-type set addendum ([golang/go#45346](https://golang.org/issues/45346)).
-
-To enable this support, you need to build gopls with a version of Go that
-supports generics. The easiest way to do this is by installing Go 1.18 Beta
-1 as described at
-[Tutorial: Getting started with generics#prerequisites](https://go.dev/doc/tutorial/generics),
-and then using this Go version to build gopls:
-
-```
-$ go1.18beta1 install golang.org/x/tools/gopls@latest
-```
-
-When using the Go 1.18, it is strongly recommended that you install the latest
-version of `gopls`, or the latest **unstable** version as
-[described above](#installing-unreleased-versions).
-
-The `gopls` built with these instructions understands generic code. To actually
-run the generic code you develop, you must also use the beta version of the Go
-compiler. For example:
-
-```
-$ go1.18beta1 run .
-```
-
-[Go project]: https://go.googlesource.com/go
diff -urN a/gopls/doc/analyzers.md b/gopls/doc/analyzers.md
--- a/gopls/doc/analyzers.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/analyzers.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,658 +0,0 @@
-# Analyzers
-
-This document describes the analyzers that `gopls` uses inside the editor.
-
-Details about how to enable/disable these analyses can be found
-[here](settings.md#analyses).
-
-<!-- BEGIN Analyzers: DO NOT MANUALLY EDIT THIS SECTION -->
-## **asmdecl**
-
-report mismatches between assembly files and Go declarations
-
-**Enabled by default.**
-
-## **assign**
-
-check for useless assignments
-
-This checker reports assignments of the form x = x or a[i] = a[i].
-These are almost always useless, and even when they aren't they are
-usually a mistake.
-
-**Enabled by default.**
-
-## **atomic**
-
-check for common mistakes using the sync/atomic package
-
-The atomic checker looks for assignment statements of the form:
-
-	x = atomic.AddUint64(&x, 1)
-
-which are not atomic.
-
-**Enabled by default.**
-
-## **atomicalign**
-
-check for non-64-bits-aligned arguments to sync/atomic functions
-
-**Enabled by default.**
-
-## **bools**
-
-check for common mistakes involving boolean operators
-
-**Enabled by default.**
-
-## **buildtag**
-
-check that +build tags are well-formed and correctly located
-
-**Enabled by default.**
-
-## **cgocall**
-
-detect some violations of the cgo pointer passing rules
-
-Check for invalid cgo pointer passing.
-This looks for code that uses cgo to call C code passing values
-whose types are almost always invalid according to the cgo pointer
-sharing rules.
-Specifically, it warns about attempts to pass a Go chan, map, func,
-or slice to C, either directly, or via a pointer, array, or struct.
-
-**Enabled by default.**
-
-## **composites**
-
-check for unkeyed composite literals
-
-This analyzer reports a diagnostic for composite literals of struct
-types imported from another package that do not use the field-keyed
-syntax. Such literals are fragile because the addition of a new field
-(even if unexported) to the struct will cause compilation to fail.
-
-As an example,
-
-	err = &net.DNSConfigError{err}
-
-should be replaced by:
-
-	err = &net.DNSConfigError{Err: err}
-
-
-**Enabled by default.**
-
-## **copylocks**
-
-check for locks erroneously passed by value
-
-Inadvertently copying a value containing a lock, such as sync.Mutex or
-sync.WaitGroup, may cause both copies to malfunction. Generally such
-values should be referred to through a pointer.
-
-**Enabled by default.**
-
-## **deepequalerrors**
-
-check for calls of reflect.DeepEqual on error values
-
-The deepequalerrors checker looks for calls of the form:
-
-    reflect.DeepEqual(err1, err2)
-
-where err1 and err2 are errors. Using reflect.DeepEqual to compare
-errors is discouraged.
-
-**Enabled by default.**
-
-## **errorsas**
-
-report passing non-pointer or non-error values to errors.As
-
-The errorsas analysis reports calls to errors.As where the type
-of the second argument is not a pointer to a type implementing error.
-
-**Enabled by default.**
-
-## **fieldalignment**
-
-find structs that would use less memory if their fields were sorted
-
-This analyzer find structs that can be rearranged to use less memory, and provides
-a suggested edit with the optimal order.
-
-Note that there are two different diagnostics reported. One checks struct size,
-and the other reports "pointer bytes" used. Pointer bytes is how many bytes of the
-object that the garbage collector has to potentially scan for pointers, for example:
-
-	struct { uint32; string }
-
-have 16 pointer bytes because the garbage collector has to scan up through the string's
-inner pointer.
-
-	struct { string; *uint32 }
-
-has 24 pointer bytes because it has to scan further through the *uint32.
-
-	struct { string; uint32 }
-
-has 8 because it can stop immediately after the string pointer.
-
-
-**Disabled by default. Enable it by setting `"analyses": {"fieldalignment": true}`.**
-
-## **httpresponse**
-
-check for mistakes using HTTP responses
-
-A common mistake when using the net/http package is to defer a function
-call to close the http.Response Body before checking the error that
-determines whether the response is valid:
-
-	resp, err := http.Head(url)
-	defer resp.Body.Close()
-	if err != nil {
-		log.Fatal(err)
-	}
-	// (defer statement belongs here)
-
-This checker helps uncover latent nil dereference bugs by reporting a
-diagnostic for such mistakes.
-
-**Enabled by default.**
-
-## **ifaceassert**
-
-detect impossible interface-to-interface type assertions
-
-This checker flags type assertions v.(T) and corresponding type-switch cases
-in which the static type V of v is an interface that cannot possibly implement
-the target interface T. This occurs when V and T contain methods with the same
-name but different signatures. Example:
-
-	var v interface {
-		Read()
-	}
-	_ = v.(io.Reader)
-
-The Read method in v has a different signature than the Read method in
-io.Reader, so this assertion cannot succeed.
-
-
-**Enabled by default.**
-
-## **infertypeargs**
-
-check for unnecessary type arguments in call expressions
-
-Explicit type arguments may be omitted from call expressions if they can be
-inferred from function arguments, or from other type arguments:
-
-	func f[T any](T) {}
-	
-	func _() {
-		f[string]("foo") // string could be inferred
-	}
-
-
-**Enabled by default.**
-
-## **loopclosure**
-
-check references to loop variables from within nested functions
-
-This analyzer checks for references to loop variables from within a
-function literal inside the loop body. It checks only instances where
-the function literal is called in a defer or go statement that is the
-last statement in the loop body, as otherwise we would need whole
-program analysis.
-
-For example:
-
-	for i, v := range s {
-		go func() {
-			println(i, v) // not what you might expect
-		}()
-	}
-
-See: https://golang.org/doc/go_faq.html#closures_and_goroutines
-
-**Enabled by default.**
-
-## **lostcancel**
-
-check cancel func returned by context.WithCancel is called
-
-The cancellation function returned by context.WithCancel, WithTimeout,
-and WithDeadline must be called or the new context will remain live
-until its parent context is cancelled.
-(The background context is never cancelled.)
-
-**Enabled by default.**
-
-## **nilfunc**
-
-check for useless comparisons between functions and nil
-
-A useless comparison is one like f == nil as opposed to f() == nil.
-
-**Enabled by default.**
-
-## **nilness**
-
-check for redundant or impossible nil comparisons
-
-The nilness checker inspects the control-flow graph of each function in
-a package and reports nil pointer dereferences, degenerate nil
-pointers, and panics with nil values. A degenerate comparison is of the form
-x==nil or x!=nil where x is statically known to be nil or non-nil. These are
-often a mistake, especially in control flow related to errors. Panics with nil
-values are checked because they are not detectable by
-
-	if r := recover(); r != nil {
-
-This check reports conditions such as:
-
-	if f == nil { // impossible condition (f is a function)
-	}
-
-and:
-
-	p := &v
-	...
-	if p != nil { // tautological condition
-	}
-
-and:
-
-	if p == nil {
-		print(*p) // nil dereference
-	}
-
-and:
-
-	if p == nil {
-		panic(p)
-	}
-
-
-**Disabled by default. Enable it by setting `"analyses": {"nilness": true}`.**
-
-## **printf**
-
-check consistency of Printf format strings and arguments
-
-The check applies to known functions (for example, those in package fmt)
-as well as any detected wrappers of known functions.
-
-A function that wants to avail itself of printf checking but is not
-found by this analyzer's heuristics (for example, due to use of
-dynamic calls) can insert a bogus call:
-
-	if false {
-		_ = fmt.Sprintf(format, args...) // enable printf checking
-	}
-
-The -funcs flag specifies a comma-separated list of names of additional
-known formatting functions or methods. If the name contains a period,
-it must denote a specific function using one of the following forms:
-
-	dir/pkg.Function
-	dir/pkg.Type.Method
-	(*dir/pkg.Type).Method
-
-Otherwise the name is interpreted as a case-insensitive unqualified
-identifier such as "errorf". Either way, if a listed name ends in f, the
-function is assumed to be Printf-like, taking a format string before the
-argument list. Otherwise it is assumed to be Print-like, taking a list
-of arguments with no format string.
-
-
-**Enabled by default.**
-
-## **shadow**
-
-check for possible unintended shadowing of variables
-
-This analyzer check for shadowed variables.
-A shadowed variable is a variable declared in an inner scope
-with the same name and type as a variable in an outer scope,
-and where the outer variable is mentioned after the inner one
-is declared.
-
-(This definition can be refined; the module generates too many
-false positives and is not yet enabled by default.)
-
-For example:
-
-	func BadRead(f *os.File, buf []byte) error {
-		var err error
-		for {
-			n, err := f.Read(buf) // shadows the function variable 'err'
-			if err != nil {
-				break // causes return of wrong value
-			}
-			foo(buf)
-		}
-		return err
-	}
-
-
-**Disabled by default. Enable it by setting `"analyses": {"shadow": true}`.**
-
-## **shift**
-
-check for shifts that equal or exceed the width of the integer
-
-**Enabled by default.**
-
-## **simplifycompositelit**
-
-check for composite literal simplifications
-
-An array, slice, or map composite literal of the form:
-	[]T{T{}, T{}}
-will be simplified to:
-	[]T{{}, {}}
-
-This is one of the simplifications that "gofmt -s" applies.
-
-**Enabled by default.**
-
-## **simplifyrange**
-
-check for range statement simplifications
-
-A range of the form:
-	for x, _ = range v {...}
-will be simplified to:
-	for x = range v {...}
-
-A range of the form:
-	for _ = range v {...}
-will be simplified to:
-	for range v {...}
-
-This is one of the simplifications that "gofmt -s" applies.
-
-**Enabled by default.**
-
-## **simplifyslice**
-
-check for slice simplifications
-
-A slice expression of the form:
-	s[a:len(s)]
-will be simplified to:
-	s[a:]
-
-This is one of the simplifications that "gofmt -s" applies.
-
-**Enabled by default.**
-
-## **sortslice**
-
-check the argument type of sort.Slice
-
-sort.Slice requires an argument of a slice type. Check that
-the interface{} value passed to sort.Slice is actually a slice.
-
-**Enabled by default.**
-
-## **stdmethods**
-
-check signature of methods of well-known interfaces
-
-Sometimes a type may be intended to satisfy an interface but may fail to
-do so because of a mistake in its method signature.
-For example, the result of this WriteTo method should be (int64, error),
-not error, to satisfy io.WriterTo:
-
-	type myWriterTo struct{...}
-        func (myWriterTo) WriteTo(w io.Writer) error { ... }
-
-This check ensures that each method whose name matches one of several
-well-known interface methods from the standard library has the correct
-signature for that interface.
-
-Checked method names include:
-	Format GobEncode GobDecode MarshalJSON MarshalXML
-	Peek ReadByte ReadFrom ReadRune Scan Seek
-	UnmarshalJSON UnreadByte UnreadRune WriteByte
-	WriteTo
-
-
-**Enabled by default.**
-
-## **stringintconv**
-
-check for string(int) conversions
-
-This checker flags conversions of the form string(x) where x is an integer
-(but not byte or rune) type. Such conversions are discouraged because they
-return the UTF-8 representation of the Unicode code point x, and not a decimal
-string representation of x as one might expect. Furthermore, if x denotes an
-invalid code point, the conversion cannot be statically rejected.
-
-For conversions that intend on using the code point, consider replacing them
-with string(rune(x)). Otherwise, strconv.Itoa and its equivalents return the
-string representation of the value in the desired base.
-
-
-**Enabled by default.**
-
-## **structtag**
-
-check that struct field tags conform to reflect.StructTag.Get
-
-Also report certain struct tags (json, xml) used with unexported fields.
-
-**Enabled by default.**
-
-## **testinggoroutine**
-
-report calls to (*testing.T).Fatal from goroutines started by a test.
-
-Functions that abruptly terminate a test, such as the Fatal, Fatalf, FailNow, and
-Skip{,f,Now} methods of *testing.T, must be called from the test goroutine itself.
-This checker detects calls to these functions that occur within a goroutine
-started by the test. For example:
-
-func TestFoo(t *testing.T) {
-    go func() {
-        t.Fatal("oops") // error: (*T).Fatal called from non-test goroutine
-    }()
-}
-
-
-**Enabled by default.**
-
-## **tests**
-
-check for common mistaken usages of tests and examples
-
-The tests checker walks Test, Benchmark and Example functions checking
-malformed names, wrong signatures and examples documenting non-existent
-identifiers.
-
-Please see the documentation for package testing in golang.org/pkg/testing
-for the conventions that are enforced for Tests, Benchmarks, and Examples.
-
-**Enabled by default.**
-
-## **unmarshal**
-
-report passing non-pointer or non-interface values to unmarshal
-
-The unmarshal analysis reports calls to functions such as json.Unmarshal
-in which the argument type is not a pointer or an interface.
-
-**Enabled by default.**
-
-## **unreachable**
-
-check for unreachable code
-
-The unreachable analyzer finds statements that execution can never reach
-because they are preceded by an return statement, a call to panic, an
-infinite loop, or similar constructs.
-
-**Enabled by default.**
-
-## **unsafeptr**
-
-check for invalid conversions of uintptr to unsafe.Pointer
-
-The unsafeptr analyzer reports likely incorrect uses of unsafe.Pointer
-to convert integers to pointers. A conversion from uintptr to
-unsafe.Pointer is invalid if it implies that there is a uintptr-typed
-word in memory that holds a pointer value, because that word will be
-invisible to stack copying and to the garbage collector.
-
-**Enabled by default.**
-
-## **unusedparams**
-
-check for unused parameters of functions
-
-The unusedparams analyzer checks functions to see if there are
-any parameters that are not being used.
-
-To reduce false positives it ignores:
-- methods
-- parameters that do not have a name or are underscored
-- functions in test files
-- functions with empty bodies or those with just a return stmt
-
-**Disabled by default. Enable it by setting `"analyses": {"unusedparams": true}`.**
-
-## **unusedresult**
-
-check for unused results of calls to some functions
-
-Some functions like fmt.Errorf return a result and have no side effects,
-so it is always a mistake to discard the result. This analyzer reports
-calls to certain functions in which the result of the call is ignored.
-
-The set of functions may be controlled using flags.
-
-**Enabled by default.**
-
-## **unusedwrite**
-
-checks for unused writes
-
-The analyzer reports instances of writes to struct fields and
-arrays that are never read. Specifically, when a struct object
-or an array is copied, its elements are copied implicitly by
-the compiler, and any element write to this copy does nothing
-with the original object.
-
-For example:
-
-	type T struct { x int }
-	func f(input []T) {
-		for i, v := range input {  // v is a copy
-			v.x = i  // unused write to field x
-		}
-	}
-
-Another example is about non-pointer receiver:
-
-	type T struct { x int }
-	func (t T) f() {  // t is a copy
-		t.x = i  // unused write to field x
-	}
-
-
-**Disabled by default. Enable it by setting `"analyses": {"unusedwrite": true}`.**
-
-## **useany**
-
-check for constraints that could be simplified to "any"
-
-**Enabled by default.**
-
-## **fillreturns**
-
-suggest fixes for errors due to an incorrect number of return values
-
-This checker provides suggested fixes for type errors of the
-type "wrong number of return values (want %d, got %d)". For example:
-	func m() (int, string, *bool, error) {
-		return
-	}
-will turn into
-	func m() (int, string, *bool, error) {
-		return 0, "", nil, nil
-	}
-
-This functionality is similar to https://github.com/sqs/goreturns.
-
-
-**Enabled by default.**
-
-## **nonewvars**
-
-suggested fixes for "no new vars on left side of :="
-
-This checker provides suggested fixes for type errors of the
-type "no new vars on left side of :=". For example:
-	z := 1
-	z := 2
-will turn into
-	z := 1
-	z = 2
-
-
-**Enabled by default.**
-
-## **noresultvalues**
-
-suggested fixes for unexpected return values
-
-This checker provides suggested fixes for type errors of the
-type "no result values expected" or "too many return values".
-For example:
-	func z() { return nil }
-will turn into
-	func z() { return }
-
-
-**Enabled by default.**
-
-## **undeclaredname**
-
-suggested fixes for "undeclared name: <>"
-
-This checker provides suggested fixes for type errors of the
-type "undeclared name: <>". It will either insert a new statement,
-such as:
-
-"<> := "
-
-or a new function declaration, such as:
-
-func <>(inferred parameters) {
-	panic("implement me!")
-}
-
-
-**Enabled by default.**
-
-## **fillstruct**
-
-note incomplete struct initializations
-
-This analyzer provides diagnostics for any struct literals that do not have
-any fields initialized. Because the suggested fix for this analysis is
-expensive to compute, callers should compute it separately, using the
-SuggestedFix function below.
-
-
-**Enabled by default.**
-
-<!-- END Analyzers: DO NOT MANUALLY EDIT THIS SECTION -->
diff -urN a/gopls/doc/command-line.md b/gopls/doc/command-line.md
--- a/gopls/doc/command-line.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/command-line.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,15 +0,0 @@
-# Command line
-
-**Note: The `gopls` command-line is still experimental and subject to change at any point.**
-
-`gopls` exposes some (but not all) features on the command-line. This can be useful for debugging `gopls` itself.
-
-<!--TODO(rstambler): Generate this file.-->
-
-Learn about available commands and flags by running `gopls help`.
-
-Much of the functionality of `gopls` is available through a command line interface.
-
-There are two main reasons for this. The first is that we do not want users to rely on separate command line tools when they wish to do some task outside of an editor. The second is that the CLI assists in debugging. It is easier to reproduce behavior via single command.
-
-It is not a goal of `gopls` to be a high performance command line tool. Its command line is intended for single file/package user interaction speeds, not bulk processing.
diff -urN a/gopls/doc/commands.md b/gopls/doc/commands.md
--- a/gopls/doc/commands.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/commands.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,370 +0,0 @@
-# Commands
-
-This document describes the LSP-level commands supported by `gopls`. They cannot be invoked directly by users, and all the details are subject to change, so nobody should rely on this information.
-
-<!-- BEGIN Commands: DO NOT MANUALLY EDIT THIS SECTION -->
-### **Add a dependency**
-Identifier: `gopls.add_dependency`
-
-Adds a dependency to the go.mod file for a module.
-
-Args:
-
-```
-{
-	// The go.mod file URI.
-	"URI": string,
-	// Additional args to pass to the go command.
-	"GoCmdArgs": []string,
-	// Whether to add a require directive.
-	"AddRequire": bool,
-}
-```
-
-### **Add an import**
-Identifier: `gopls.add_import`
-
-Ask the server to add an import path to a given Go file.  The method will
-call applyEdit on the client so that clients don't have to apply the edit
-themselves.
-
-Args:
-
-```
-{
-	// ImportPath is the target import path that should
-	// be added to the URI file
-	"ImportPath": string,
-	// URI is the file that the ImportPath should be
-	// added to
-	"URI": string,
-}
-```
-
-### **Apply a fix**
-Identifier: `gopls.apply_fix`
-
-Applies a fix to a region of source code.
-
-Args:
-
-```
-{
-	// The fix to apply.
-	"Fix": string,
-	// The file URI for the document to fix.
-	"URI": string,
-	// The document range to scan for fixes.
-	"Range": {
-		"start": {
-			"line": uint32,
-			"character": uint32,
-		},
-		"end": {
-			"line": uint32,
-			"character": uint32,
-		},
-	},
-}
-```
-
-### **Check for upgrades**
-Identifier: `gopls.check_upgrades`
-
-Checks for module upgrades.
-
-Args:
-
-```
-{
-	// The go.mod file URI.
-	"URI": string,
-	// The modules to check.
-	"Modules": []string,
-}
-```
-
-### **Toggle gc_details**
-Identifier: `gopls.gc_details`
-
-Toggle the calculation of gc annotations.
-
-Args:
-
-```
-string
-```
-
-### **Run go generate**
-Identifier: `gopls.generate`
-
-Runs `go generate` for a given directory.
-
-Args:
-
-```
-{
-	// URI for the directory to generate.
-	"Dir": string,
-	// Whether to generate recursively (go generate ./...)
-	"Recursive": bool,
-}
-```
-
-### **Generate gopls.mod**
-Identifier: `gopls.generate_gopls_mod`
-
-(Re)generate the gopls.mod file for a workspace.
-
-Args:
-
-```
-{
-	// The file URI.
-	"URI": string,
-}
-```
-
-### **go get a package**
-Identifier: `gopls.go_get_package`
-
-Runs `go get` to fetch a package.
-
-Args:
-
-```
-{
-	// Any document URI within the relevant module.
-	"URI": string,
-	// The package to go get.
-	"Pkg": string,
-	"AddRequire": bool,
-}
-```
-
-### **List known packages**
-Identifier: `gopls.list_known_packages`
-
-Retrieve a list of packages that are importable from the given URI.
-
-Args:
-
-```
-{
-	// The file URI.
-	"URI": string,
-}
-```
-
-Result:
-
-```
-{
-	// Packages is a list of packages relative
-	// to the URIArg passed by the command request.
-	// In other words, it omits paths that are already
-	// imported or cannot be imported due to compiler
-	// restrictions.
-	"Packages": []string,
-}
-```
-
-### **Regenerate cgo**
-Identifier: `gopls.regenerate_cgo`
-
-Regenerates cgo definitions.
-
-Args:
-
-```
-{
-	// The file URI.
-	"URI": string,
-}
-```
-
-### **Remove a dependency**
-Identifier: `gopls.remove_dependency`
-
-Removes a dependency from the go.mod file of a module.
-
-Args:
-
-```
-{
-	// The go.mod file URI.
-	"URI": string,
-	// The module path to remove.
-	"ModulePath": string,
-	"OnlyDiagnostic": bool,
-}
-```
-
-### **Run test(s)**
-Identifier: `gopls.run_tests`
-
-Runs `go test` for a specific set of test or benchmark functions.
-
-Args:
-
-```
-{
-	// The test file containing the tests to run.
-	"URI": string,
-	// Specific test names to run, e.g. TestFoo.
-	"Tests": []string,
-	// Specific benchmarks to run, e.g. BenchmarkFoo.
-	"Benchmarks": []string,
-}
-```
-
-### **Start the gopls debug server**
-Identifier: `gopls.start_debugging`
-
-Start the gopls debug server if it isn't running, and return the debug
-address.
-
-Args:
-
-```
-{
-	// Optional: the address (including port) for the debug server to listen on.
-	// If not provided, the debug server will bind to "localhost:0", and the
-	// full debug URL will be contained in the result.
-	// 
-	// If there is more than one gopls instance along the serving path (i.e. you
-	// are using a daemon), each gopls instance will attempt to start debugging.
-	// If Addr specifies a port, only the daemon will be able to bind to that
-	// port, and each intermediate gopls instance will fail to start debugging.
-	// For this reason it is recommended not to specify a port (or equivalently,
-	// to specify ":0").
-	// 
-	// If the server was already debugging this field has no effect, and the
-	// result will contain the previously configured debug URL(s).
-	"Addr": string,
-}
-```
-
-Result:
-
-```
-{
-	// The URLs to use to access the debug servers, for all gopls instances in
-	// the serving path. For the common case of a single gopls instance (i.e. no
-	// daemon), this will be exactly one address.
-	// 
-	// In the case of one or more gopls instances forwarding the LSP to a daemon,
-	// URLs will contain debug addresses for each server in the serving path, in
-	// serving order. The daemon debug address will be the last entry in the
-	// slice. If any intermediate gopls instance fails to start debugging, no
-	// error will be returned but the debug URL for that server in the URLs slice
-	// will be empty.
-	"URLs": []string,
-}
-```
-
-### **Run test(s) (legacy)**
-Identifier: `gopls.test`
-
-Runs `go test` for a specific set of test or benchmark functions.
-
-Args:
-
-```
-string,
-[]string,
-[]string
-```
-
-### **Run go mod tidy**
-Identifier: `gopls.tidy`
-
-Runs `go mod tidy` for a module.
-
-Args:
-
-```
-{
-	// The file URIs.
-	"URIs": []string,
-}
-```
-
-### **Toggle gc_details**
-Identifier: `gopls.toggle_gc_details`
-
-Toggle the calculation of gc annotations.
-
-Args:
-
-```
-{
-	// The file URI.
-	"URI": string,
-}
-```
-
-### **Update go.sum**
-Identifier: `gopls.update_go_sum`
-
-Updates the go.sum file for a module.
-
-Args:
-
-```
-{
-	// The file URIs.
-	"URIs": []string,
-}
-```
-
-### **Upgrade a dependency**
-Identifier: `gopls.upgrade_dependency`
-
-Upgrades a dependency in the go.mod file for a module.
-
-Args:
-
-```
-{
-	// The go.mod file URI.
-	"URI": string,
-	// Additional args to pass to the go command.
-	"GoCmdArgs": []string,
-	// Whether to add a require directive.
-	"AddRequire": bool,
-}
-```
-
-### **Run go mod vendor**
-Identifier: `gopls.vendor`
-
-Runs `go mod vendor` for a module.
-
-Args:
-
-```
-{
-	// The file URI.
-	"URI": string,
-}
-```
-
-### **Query workspace metadata**
-Identifier: `gopls.workspace_metadata`
-
-Query the server for information about active workspaces.
-
-Result:
-
-```
-{
-	// All workspaces for this session.
-	"Workspaces": []{
-		"Name": string,
-		"ModuleDir": string,
-	},
-}
-```
-
-<!-- END Commands: DO NOT MANUALLY EDIT THIS SECTION -->
diff -urN a/gopls/doc/contributing.md b/gopls/doc/contributing.md
--- a/gopls/doc/contributing.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/contributing.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,119 +0,0 @@
-# Documentation for contributors
-
-This documentation augments the general documentation for contributing to the
-x/tools repository, described at the [repository root](../../CONTRIBUTING.md).
-
-Contributions are welcome, but since development is so active, we request that
-you file an issue and claim it before starting to work on something. Otherwise,
-it is likely that we might already be working on a fix for your issue.
-
-## Finding issues
-
-All `gopls` issues are labeled as such (see the [`gopls` label][issue-gopls]).
-Issues that are suitable for contributors are additionally tagged with the
-[`help-wanted` label][issue-wanted].
-
-Before you begin working on an issue, please leave a comment that you are
-claiming it.
-
-## Getting started
-
-Most of the `gopls` logic is actually in the `golang.org/x/tools/internal/lsp`
-directory, so you are most likely to develop in the golang.org/x/tools module.
-
-## Build
-
-To build a version of `gopls` with your changes applied:
-
-```bash
-cd /path/to/tools/gopls
-go install
-```
-
-To confirm that you are testing with the correct `gopls` version, check that
-your `gopls` version looks like this:
-
-```bash
-$ gopls version
-golang.org/x/tools/gopls master
-    golang.org/x/tools/gopls@(devel)
-```
-
-## Getting help
-
-The best way to contact the gopls team directly is via the
-[#gopls-dev](https://app.slack.com/client/T029RQSE6/CRWSN9NCD) channel on the
-gophers slack. Please feel free to ask any questions about your contribution or
-about contributing in general.
-
-## Testing
-
-To run tests for just `gopls/`, run,
-
-```bash
-cd /path/to/tools/gopls
-go test ./...
-```
-
-But, much of the gopls work involves `internal/lsp` too, so you will want to
-run both:
-
-```bash
-cd /path/to/tools
-cd gopls && go test ./...
-cd ..
-go test ./internal/lsp/...
-```
-
-There is additional information about the `internal/lsp` tests in the
-[internal/lsp/tests `README`](https://github.com/golang/tools/blob/master/internal/lsp/tests/README.md).
-
-### Regtests
-
-gopls has a suite of regression tests defined in the `./gopls/internal/regtest`
-directory. Each of these tests writes files to a temporary directory, starts a
-separate gopls session, and scripts interactions using an editor-like API. As a
-result of this overhead they can be quite slow, particularly on systems where
-file operations are costly.
-
-Due to the asynchronous nature of the LSP, regtests assertions are written
-as 'expectations' that the editor state must achieve _eventually_. This can
-make debugging the regtests difficult. To aid with debugging, the regtests
-output their LSP logs on any failure. If your CL gets a test failure while
-running the regtests, please do take a look at the description of the error and
-the LSP logs, but don't hesitate to [reach out](#getting-help) to the gopls
-team if you need help.
-
-### CI
-
-When you mail your CL and you or a fellow contributor assigns the
-`Run-TryBot=1` label in Gerrit, the
-[TryBots](https://golang.org/doc/contribute.html#trybots) will run tests in
-both the `golang.org/x/tools` and `golang.org/x/tools/gopls` modules, as
-described above.
-
-Furthermore, an additional "gopls-CI" pass will be run by _Kokoro_, which is a
-Jenkins-like Google infrastructure for running Dockerized tests. This allows us
-to run gopls tests in various environments that would be difficult to add to
-the TryBots. Notably, Kokoro runs tests on
-[older Go versions](../README.md#supported-go-versions) that are no longer supported
-by the TryBots. Per that that policy, support for these older Go versions is
-best-effort, and test failures may be skipped rather than fixed.
-
-Kokoro runs are triggered by the `Run-TryBot=1` label, just like TryBots, but
-unlike TryBots they do not automatically re-run if the "gopls-CI" result is
-removed in Gerrit. To force a re-run of the Kokoro CI on a CL containing the
-`Run-TryBot=1` label, you can reply in Gerrit with the comment "kokoro rerun".
-
-## Debugging
-
-The easiest way to debug your change is to run a single `gopls` test with a
-debugger.
-
-See also [Troubleshooting](troubleshooting.md#troubleshooting).
-
-<!--TODO(rstambler): Add more details about the debug server and viewing
-telemetry.-->
-
-[issue-gopls]: https://github.com/golang/go/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3Agopls "gopls issues"
-[issue-wanted]: https://github.com/golang/go/issues?utf8=✓&q=is%3Aissue+is%3Aopen+label%3Agopls+label%3A"help+wanted" "help wanted"
diff -urN a/gopls/doc/daemon.md b/gopls/doc/daemon.md
--- a/gopls/doc/daemon.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/daemon.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,183 +0,0 @@
-# Running gopls as a daemon
-
-**Note: this feature is new. If you encounter bugs, please [file an
-issue](troubleshooting.md#file-an-issue).**
-
-If you just want to try this out, skip ahead to the [quickstart](#quickstart).
-
-## Background: gopls execution modes
-
-Gopls was originally implemented as an LSP sidecar: a process started by
-editors or editor plugins, and communicated with using jsonrpc 2.0 over
-stdin/stdout. By executing as a stateful process, gopls can maintain a
-significant amount of cache and can eagerly perform analysis on the source code
-being edited.
-
-This execution mode does not work as well when there are many separate editor
-processes or when editor processes are short-lived, as is often the case for
-users of non-IDE editors such as Vim or Emacs. Having many processes means
-having many caches, consuming a significant amount of system resources. Using
-short-lived sessions means paying a start-up cost each time a session is
-created.
-
-To support these types of workflows, a new mode of gopls execution is supported
-wherein a single, persistent, shared gopls "daemon" process is responsible for
-managing all gopls sessions. In this mode, editors still start a gopls sidecar,
-but this sidecar merely acts as a thin "forwarder", responsible for forwarding
-the LSP to the shared gopls instance and recording metrics, logs, and rpc
-traces.
-
-## Quickstart
-
-To use a shared gopls instance you must either manage the daemon process
-yourself, or let the gopls forwarder processes start the shared daemon as
-needed.
-
-### Running with `-remote=auto`
-
-Automatic management of the daemon is easiest, and can be done by passing the
-flag `-remote=auto` to the gopls process started by your editor. This will
-cause this process to auto-start the gopls daemon if needed, connect to it, and
-forward the LSP. For example, here is a reasonable gopls invocation, that sets
-some additional flags for easier [debugging](#debugging):
-
-```bash
-gopls -remote=auto -logfile=auto -debug=:0 -remote.debug=:0 -rpc.trace
-```
-
-Note that the shared gopls process will automatically shut down after one
-minute with no connected clients.
-
-### Managing the daemon manually
-
-To manage the gopls daemon process via external means rather than having the
-forwarders manage it, you must start a gopls daemon process with the
-`-listen=<addr>` flag, and then pass `-remote=<addr>` to the gopls processes
-started by your editor.
-
-For example, to host the daemon on the TCP port `37374`, do:
-
-```bash
-gopls -listen=:37374 -logfile=auto -debug=:0
-```
-
-And then from the editor, run
-
-```bash
-gopls -remote=:37374 -logfile=auto -debug=:0 -rpc.trace
-```
-
-If you are on a POSIX system, you can also use unix domain sockets by prefixing
-the flag values with `unix;`. For example:
-
-```bash
-gopls -listen="unix;/tmp/gopls-daemon-socket" -logfile=auto -debug=:0
-```
-
-And connect via:
-
-```bash
-gopls -remote="unix;/tmp/gopls-daemon-socket" -logfile=auto -debug=:0 -rpc.trace
-```
-
-(Note that these flag values MUST be enclosed in quotes, because ';' is a
-special shell character. For this reason, this syntax is subject to change in
-the future.)
-
-## Debugging
-
-Debugging a shared gopls session is more complicated than a singleton session,
-because there are now two gopls processes involved with handling the LSP. Here
-are some tips:
-
-### Finding logfiles and debug addresses
-
-When running in daemon mode, you can use the `gopls inspect sessions` command
-to find the logfile and debug port for your gopls daemon instance (as well as
-for all its connected clients). By default, this inspects the default daemon
-(i.e. `-remote=auto`). To inspect a different daemon, use the `-remote` flag
-explicitly: `gopls -remote=localhost:12345 inspect sessions`.
-
-This works whether or not you have enabled `-remote.debug`.
-
-### Traversing debug pages
-
-When `-debug=:0` is passed to gopls, it runs a webserver that serves stateful
-debug pages (see [troubleshooting.md](troubleshooting.md)). You can find the
-actual port hosting these pages by either using the `gopls inspect sessions`
-command, or by checking the start of the logfile -- it will be one of the first
-log messages. For example, if using `-logfile=auto`, find the debug address by
-checking `head /tmp/gopls-<pid>.log`.
-
-By default, the gopls daemon is not started with `-debug`. To enable it, set
-the `-remote.debug` flag on the forwarder instance, so that it invokes gopls
-with `-debug` when starting the daemon.
-
-The debug pages of the forwarder process will have a link to the debug pages of
-the daemon server process. Correspondingly, the debug pages of the daemon
-process will have a link to each of its clients.
-
-This can help you find metrics, traces, and log files for all of the various
-servers and clients.
-
-### Using logfiles
-
-The gopls daemon is started with logging disabled by default. To customize
-this, pass `-remote.logfile` to the gopls forwarder. Using
-`-remote.logfile=auto`, the daemon will log to a default location (on posix
-systems: `/tmp/gopls-daemon-<pid>.log`).
-
-The gopls daemon does not log session-scoped messages: those are instead
-reflected back to the forwarder so that they can be accessed by the editor.
-Daemon logs will only contain global messages, for example logs when sessions
-connect and disconnect.
-
-It is recommended to start the forwarder gopls process with `-rpc.trace`, so
-that its logfile will contain rpc trace logs specific to the LSP session.
-
-## Using multiple shared gopls instances
-
-There may be environments where it is desirable to have more than one shared
-gopls instance. If managing the daemon manually, this can be done by simply
-choosing different `-listen` addresses for each distinct daemon process.
-
-On POSIX systems, there is also support for automatic management of distinct
-shared gopls processes: distinct daemons can be selected by passing
-`-remote="auto;<id>"`. Any gopls forwarder passing the same value for `<id>`
-will use the same shared daemon.
-
-## FAQ
-
-**Q: Why am I not saving as much memory as I expected when using a shared gopls?**
-
-A: As described in [implementation.md](design/implementation.md), gopls has a
-concept of view/session/cache. Each session and view map onto exactly one
-editor session (because they contain things like edited but unsaved buffers).
-The cache contains things that are independent of any editor session, and can
-therefore be shared.
-
-When, for example, three editor session are sharing a single gopls process,
-they will share the cache but will each have their own session and view. The
-memory savings in this mode, when compared to three separate gopls processes,
-corresponds to the amount of cache overlap across sessions.
-
-Because this hasn't mattered much in the past, it is likely that there is state
-that can be moved out of the session/view, and into the cache, thereby
-increasing the amount of memory savings in the shared mode.
-
-**Q: How do I customize the daemon instance when using `-remote=auto`?**
-
-The daemon may be customized using flags of the form `-remote.*` on the
-forwarder gopls. This causes the forwarder to invoke gopls with these settings
-when starting the daemon. As of writing, we expose the following configuration:
-
-* `-remote.logfile`: the location of the daemon logfile
-* `-remote.debug`: the daemon's debug address
-* `-remote.listen.timeout`: the amount of time the daemon should wait for new
-  connections while there are no current connections, before shutting down.
-  Must be set to a valid `time.Duration` (e.g. `30s` or `5m`). If `0`, listen
-  indefinitely. Default: `1m`.
-
-Note that once the daemon is already running, setting these flags will not
-change its configuration. These flags only matter for the forwarder process
-that actually starts the daemon.
diff -urN a/gopls/doc/design/design.md b/gopls/doc/design/design.md
--- a/gopls/doc/design/design.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/design/design.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,394 +0,0 @@
-# `gopls` design documentation
-
-## Goals
-
-* `gopls` should **become the default editor backend** for the major editors used by Go programmers, fully supported by the Go team.
-* `gopls` will be a **full implementation of LSP**, as described in the [LSP specification], to standardize as many of its features as possible.
-* `gopls` will be **clean and extensible** so that it can encompass additional features in the future, allowing Go tooling to become best in class once more.
-* `gopls` will **support alternate build systems and file layouts**, allowing Go development to be simpler and more powerful in any environment.
-
-## Context
-
-While Go has a number of excellent and useful command-line tools that enhance the developer experience, it has become clear that integrating these tools with IDEs can pose challenges.
-
-Support of these tools has relied on the goodwill of community members, and they have been put under a large burden of support at times as the language, toolchain and environments change. As a result many tools have ceased to work, have had support problems, or become confusing with forks and replacements, or provided an experience that is not as good as it could be.
-See the section below on [existing solutions](#existing-solutions) for more problems and details.
-
-This is fine for tools used occasionally, but for core IDE features, this is not acceptable.
-Autocompletion, jump to definition, formatting, and other such features should always work, as they are key for Go development.
-
-The Go team will create an editor backend that works in any build system.
-It will also be able to improve upon the latency of Go tools, since each tool will no longer have to individually run the type-checker on each invocation, instead there will be a long-running process and data can be shared between the definitions, completions, diagnostics, and other features.
-
-By taking ownership of these tools and packaging them together in the form of gopls, the Go team will ensure that the Go development experience isn’t unnecessarily complicated for Go users.
-Having one editor backend will simplify the lives of Go developers, the Go team, and the maintainers of Go editor plugins.
-
-See Rebecca's excellent GopherCon keynote [talk] and [slides] for some more context.
-
-## Non-Goals
-
-* Command line speed
-
-  Although gopls will have a command line mode, it will be optimized for long running and not command responsiveness, as such it may not be the right tool for things like CI systems.
-  For such cases there will have to be an alternate tool using the same underlying libraries for consistency.
-
-* Low memory environments
-
-  In order to do a good job of processing large projects with very low latencies gopls will be holding a lot of information in memory.
-  It is presumed that developers are normally working on systems with significant RAM and this will not be a problem.
-  In general this is upheld by the large memory usage of existing IDE solutions (like IntelliJ)
-
-* Syntax highlighting
-
-  At the moment there is no editor that delegates this functionality to a separate binary, and no standard way of doing it.
-
-## Existing solutions
-
-Every year the Go team conducts a survey, asking developers about their experiences with the language.
-
-One question that is asked is “How do you feel about your editor?”.
-
-The responses told a very negative story. Some categorized quotes:
-
-* Setup
-  * "Hard to install and configure"
-  * "Inadequate documentation"
-* Performance
-  * "Performance is very poor"
-  * "Pretty slow in large projects"
-* Reliability
-  * "Features work one day, but not the next"
-  * "Tooling is not updated with new language features"
-
-Each editor has its own plugin that shells out to a variety of tools, many of which break with new Go releases or because they are no longer maintained.
-
-The individual tools each have to do the work to understand the code and all its transitive dependencies.
-
-Each feature is a different tool, with a different set of patterns for its command line, a different way to accept input and parse output, a different way of specifying source code locations.
-To support its existing feature set, VSCode installed 24 different command line tools, many of which have options or forks to configure. When looking at the set of tools that needed to be migrated to modules, across all the editors, there were 63 separate tools.
-
-All these tools need to understand the code, and they use the same standard libraries to do it. Those libraries are optimized for these kinds of tools, but even so processing that much code takes a lot of time time. Almost none of the tools are capable of returning results within 100ms.
-As developers type in their editor, multiple of these features need to activate, which means they are not just paying the cost once, but many times. The overall effect is an editing experience that feels sluggish, and features that are either not enabled or sometimes produce results that appear so slowly they are no longer useful when they arrive. This is a problem that increases with the size of the code base, which means it is getting worse over time, and is especially bad for the kinds of large code bases companies are dealing with as they use Go for more major tasks.
-
-## Requirements
-
-### Complete feature set
-
-For gopls to be considered a success it has to implement the full feature set discussed [below](#Features).
-This is the set of features that users need in order to feel as productive as they were with the tooling it is replacing. It does not include every feature of previous implementations, there are some features that are almost never used that should be dropped (like guru's pointer analysis) and some other features that do not easily fit and will have to be worked around (replacing the save hook/linter).
-
-### Equivalent or better experience
-
-For all of those features, the user experience must match or exceed the current one available in all editors.
-This is an easy statement to make, but a hard one to validate or measure. Many of the possible measures fail to capture the experience.
-
-For instance, if an attempt was made to measure the latency of a jump to definition call, the results would be fairly consistent from the old godef tool. From the gopls implementation there may be a much larger range of latencies, with the best being orders of magnitude faster, and the worse slightly worse, because gopls attempts to do far more work, but manages to cache it across calls.
-
-Or for a completion call, it might be slower but produce a better first match such that users accept it more often, resulting in an overall better experience.
-
-For the most part this has to rely on user reports. If users are refusing to switch because the experience is not better, it is clearly not done, if they are switching but most people are complaining, there are probably enough areas that are better to make the switch compelling but other areas which are worse. If most people are switching and either staying silent or being positive, it is probably done. When writing tools, the user is all that matters.
-
-### Solid community of contributors
-
-The scope and scale of the problem gopls is trying to solve is untenable for the core Go team, it is going to require a strong community to make it all happen.
-
-This implies the code must be easy to contribute to, and easy for many developers to work on in parallel. The functionality needs to be well decoupled, and have a thorough testing story.
-
-### Latencies that fall within user tolerance
-
-There has been a lot of research on acceptable latencies for user actions.
-<!-- TODO: research links -->
-The main result that affects gopls is that feedback in direct response to continuous user actions needs to be under 100ms to be imperceptible, and anything above 200ms aggravates the user.
-This means in general the aim has to be <100ms for anything that happens as the developer types.
-There will always be cases where gopls fails to meet this deadline, and there needs to be ways to make the user experience okay in those cases, but in general the point of this deadline is to inform the basic architecture design, any solution that cannot theoretically meet this goal in the long term is the wrong answer.
-
-### Easy to configure
-
-Developers are very particular, and have very differing desires in their coding experience. gopls is going to have to support a significant amount of flexibility, in order to meet those desires.
-The default settings however with no configuration at all must be the one that is best experience for most users, and where possible the features must be flexible without configuration so that the client can easily make the choices about treatment without changing its communication with gopls.
-
-## Difficulties
-
-### Volume of data
-
-<!-- TODO: project sizes -->
-* Small:
-* Medium:
-* Large:
-* Corporate mono-repo: Much much bigger
-
-Parsing and type checking large amounts of code is quite expensive, and the converted forms use a lot of space. As gopls has to keep updating this information while the developer types, it needs to manage how it caches the converted forms very carefully to balance memory use vs speed.
-
-### Cache invalidation
-
-The basic unit of operation for the type checking is the package, but the basic unit of operation for an editor is the file.
-gopls needs to be able to map files to packages efficiently, so that when files change it knows which packages need to be updated (along with any other packages that transitively depended on them).
-This is made especially difficult by the fact that changing the content of a file can modify which packages it is considered part of (either by changing the package declaration or the build tags), a file can be in more than one package, and changes can be made to files without using the editor, in which case it will not notify us of the changes.
-
-### Inappropriate core functionality
-
-The base libraries for Go (things like [go/token], [go/ast] and [go/types]) are all designed for compiler-like applications.
-They tend to worry more about throughput than memory use, they have structures that are intended to grow and then be thrown away at program exit, and they are not designed to keep going in the presence of errors in the source they are handling.
-They also have no abilities to do incremental changes.
-
-Making a long running service work well with those libraries is a very large challenge, but writing new libraries would be far more work, and cause a significant long term cost as both sets of libraries would have to be maintained. Right now it is more important to get a working tool into the hands of users. In the long term this decision may have to be revisited, new low level libraries may be the only way to keep pushing the capabilities forwards.
-
-### Build system capabilities
-
-gopls is supposed to be build system agnostic, but it must use the build system to discover how files map to packages. When it tries to do so, even when the functionality is the same, the costs (in time, CPU and memory) are very different, and can significantly impact the user experience. Designing how gopls interacts with the build system to try to minimize or hide these differences is hard.
-
-### Build tags
-
-The build tag system in Go is quite powerful, and has many use cases. Source files can exclude themselves using powerful boolean logic on the set of active tags.
-It is however designed for specifying the set of active tags on the command line, and the libraries are all designed to cope with only one valid combination at a time. There is also no way to work out the set of valid combinations.
-
-Type checking a file requires knowledge of all the other files in the same package, and that set of files is modified by the build tags. The set of exported identifiers of a package is also affected by which files are in the package, and thus its build tags.
-
-This means that even for files or packages that have no build tag controls it is not possible to produce correct results without knowing the set of build tags to consider.
-This makes it very hard to produce useful results when viewing a file.
-
-### Features not supported by LSP
-
-There are some things it would be good to be able to do that do not fit easily into the existing LSP protocol.
-For instance, displaying control flow information, automatic struct tags, complex refactoring...
-
-Each feature will have to be considered carefully, and either propose a change to LSP, or add a way to have gopls specific extensions to the protocol that are still easy to use in all the editor plugins.
-
-To avoid these at the start, only core LSP features will be implemented, as they are sufficient to meet the baseline requirements anyway, but the potential features need to be kept in mind in the core architecture.
-
-### Distribution
-
-Making sure that users are using the right version of gopls is going to be a problem. Each editor plugin is probably going to install the tools in its own way, some will choose to install it system wide, some will keep their own copy.
-
-Because it is a brand new tool, it will be changing rapidly. If users are not informed they are on an old version they will be experiencing problems that have already been fixed, which is worse for them, and then probably reporting them, which wastes time for the gopls team. There needs to be a mechanism for gopls to check if is up to date, and a recommended way to install an up to date version.
-
-### Debugging user problems
-
-gopls is essentially a very stateful long running server on the developer's machine. Its basic operation is affected by many things, from the users environment to the contents of the local build cache. The data it is operating on is often a confidential code base that cannot be shared.
-All of these things make it hard for users to report a bug usefully, or create a minimal reproduction.
-
-There needs to be easy ways for users to report what information they can, and ways to attempt to reproduce problems without their entire state. This is also needed to produce regression tests.
-
-## Basic design decisions
-
-There are some fundamental architecture decisions that affect much of the rest of the design of the tool, making fundamental trade offs that impact the user experience.
-
-### Process lifetime: *managed by the editor*
-
-Processing a large code base to fully type check and then analyze it within the latency requirements is not feasible, and is one of the primary problems with the existing solutions. This remains true even if the computed information was cached on disk, as running analyzers and type checkers ends up requiring the full AST of all files in the dependency graph.
-It is theoretically possible to do better, but only with a major re-write of the existing parsing and type checking libraries, something that is not feasible at this time.
-
-This implies that gopls should be a long running process, that is able to cache and pre-calculate results in memory so that when a request arrives it can produce the answer much faster.
-
-It could run as a daemon on the user's machine, but there are a lot of issues with managing a daemon. It may well be the right choice in the long term, and it should be allowed for in the fundamental architecture design, but to start with it will instead have a process that lasts as long as the editor that starts it, and that can easily be restarted.
-
-### Caching: *in memory*
-
-Persistent disk caches are very expensive to maintain, and require solving a lot of extra problems.
-Although building the information required is expensive compared to the latencies required of the requests, it is fairly minor compared to the startup times of an editor, so it is expected that rebuilding the information when gopls is restarted will be acceptable.
-
-The advantage gained from this is that gopls becomes stateless across restarts which means if it has issues or gets its state confused, a simple restart will often fix the problem.
-It also means that when users report problems, the entire state of the on disk cache is not needed to diagnose and reproduce the issue.
-
-### Communication: *stdin/stdout JSON*
-
-The LSP specification defines the JSON messages that are normally used, but it does not define how those message should be sent, and there are implementations of the LSP that do not use JSON (for instance, Protocol buffers are an option).
-
-The constraints on gopls are that it must be easy to integrate into *every editor* on *all operating systems*, and that it should not have large external dependencies.
-
-JSON is part of the Go standard library, and is also the native language of LSP, so it makes the most sense. By far the best supported communication mechanism is the standard input and output of a process, and the common client implementations all have ways of using [JSON rpc 2] in this mode.  There were no complete and low dependency implementations of this protocol in Go, but it is a fairly small protocol on top of the JSON library that can be implemented with a moderate effort, and would be a generally useful library to have anyway.
-
-In the future it is expected to run in separated client server mode, so writing it in a way that could use sockets instead of stdin/stdout from the start was the best way to make sure it remained possible. It was also a huge debugging aid to be able to run the gopls server by hand and watch/debug it outside the editor.
-
-### Running other tools: *no*
-
-<!--- TODO: subprocess discuss --->
-
-## Features
-
-<!--TODO(rstambler): Generate a file that lists all of the supported features.-->
-
-There is a set of features that gopls needs to expose to be a comprehensive IDE solution.
-The following is the minimum set of features, along with their existing solutions and how they should map to the LSP.
-
-### Introspection
-
-Introspection features tell developers information about their code while they work. They do not make or suggest changes.
-
----
-Diagnostics | Static analysis results of the code, including compilation and lint errors
------------ | ---
-Requires    | Full go/analysis run, which needs full AST, type and SSA information
-LSP         | [`textDocument/publishDiagnostics`]
-Previous    | `go build`, `go vet`, `golint`, [errcheck], [staticcheck] <!-- TODO: and all the rest -->
-|           | This is one of the most important IDE features, allowing fast turn around without having to run compilers and checkers in the shell. Often used to power problem lists, gutter markers and squiggle underlines in the IDE. <br/> There is some complicated design work to do in order to let users customize the set of checks being run, preferably without having to recompile the main LSP binary.
-
----
-Hover    | Information about the code under the cursor.
--------- | ---
-Requires | AST and type information for the file and all dependencies
-LSP      | [`textDocument/hover`]
-Previous | [godoc], [gogetdoc]
-|        | Used when reading code to display information known to the compiler but not always obvious from the code. For instance it may return the types of identifiers, or the documentation.
-
----
-Signature help | Function parameter information and documentation
--------------- | ---
-Requires       | AST and type information for the file and all dependencies
-LSP            | [`textDocument/signatureHelp`]
-Previous       | [gogetdoc]
-|              | As a function call is being typed into code, it is helpful to know the parameters of that call to enable the developer to call it correctly.
-
-### Navigation
-
-Navigation features are designed to make it easier for a developer to find their way round a code base.
-
----
-Definition | Select an identifier, and jump to the code where that identifier was defined.
----------- | ---
-Requires   | Full type information for file and all dependencies
-LSP        | [`textDocument/declaration`]
-|          | [`textDocument/definition`]
-|          | [`textDocument/typeDefinition`]
-Previous   | [godef] |
-|          | Asking the editor to open the place where a symbol was defined is one of the most commonly used code navigation tools inside an IDE when available. It is especially valuable when exploring an unfamiliar code base.<br/>Due to a limitation of the compiler output, it is not possible to use the binary data for this task (specifically it does not know column information) and thus it must parse from source.
-
----
-Implementation | Reports the types that implement an interface
--------------- | ---
-Requires       | Full workspace type knowledge
-LSP            | [`textDocument/implementation`]
-Previous       | [impl]
-|              | This feature is hard to scale up to large code bases, and is going to take thought to get right. It may be feasible to implemented a more limited form in the meantime.
-
----
-Document symbols | Provides the set of top level symbols in the current file.
----------------- | ---
-Requires         | AST of the current file only
-LSP              | [`textDocument/documentSymbol`]
-Previous         | [go-outline], [go-symbols]
-|                | Used to drive things like outline mode.
-
----
-References | Find all references to the symbol under the cursor.
----------- | ---
-Requires   | AST and type information for the **reverse** transitive closure
-LSP        | [`textDocument/references`]
-Previous   | [guru]
-|          | This requires knowledge of every package that could possible depend on any packages the current file is part of. In the past this has been implemented either by global knowledge, which does not scale, or by specifying a "scope" which confused users to the point where they just did not use the tools. gopls is probably going to need a more powerful solution in the long term, but to start with automatically limiting the scope may produce acceptable results. This would probably be the module if known, or some sensible parent directory otherwise.
-
----
-Folding  | Report logical hierarchies of blocks
--------- | ---
-Requires | AST of the current file only
-LSP      | [`textDocument/foldingRange`]
-Previous | [go-outline]
-|        | This is normally used to provide expand and collapse behavior in editors.
-
----
-Selection | Report regions of logical selection around the cursor
---------- | ---
-Requires  | AST of the current file only
-LSP       | [`textDocument/selectionRange`]
-Previous  | [guru]
-|         | Used in editor features like expand selection.
-
-
-### Edit assistance
-
-These features suggest or apply edits to the code for the user, including refactoring features, for which there are many potential use cases.
-Refactoring is one of the places where Go tools could potentially be very strong, but have not been so far, and thus there is huge potential for improvements in the developer experience.
-There is not yet a clear understanding of the kinds of refactoring people need or how they should express them however, and there are weaknesses in the LSP protocol around this.
-This means it may be much more of a research project.
-
-
----
-Format   | Fix the formatting of the file
--------- | ---
-Requires | AST of current file
-LSP      | [`textDocument/formatting`]
-|        | [`textDocument/rangeFormatting`]
-|        | [`textDocument/onTypeFormatting`]
-Previous | [gofmt], [goimports], [goreturns]
-|        | It will use the standard format package. <br/> Current limitations are that it does not work on malformed code. It may need some very careful changes to the formatter to allow for formatting an invalid AST or changes to force the AST to a valid mode. These changes would improve range and file mode as well, but are basically vital to onTypeFormatting
-
----
-Imports  | Rewrite the imports block automatically to match the symbols used.
--------- | ---
-Requires | AST of the current file and full symbol knowledge for all candidate packages.
-LSP      | [`textDocument/codeAction`]
-Previous | [goimports], [goreturns]
-|        | This needs knowledge of packages that are not yet in use, and the ability to find those packages by name. <br/> It also needs exported symbol information for all the packages it discovers. <br/> It should be implemented using the standard imports package, but there may need to be exposed a more fine grained API than just a file rewrite for some of the interactions.
-
----
-Autocompletion | Makes suggestions to complete the entity currently being typed.
--------------- | ---
-Requires       | AST and type information for the file and all dependencies<br/> Also full exported symbol knowledge for all packages.
-LSP            | [`textDocument/completion`]
-|              | [`completionItem/resolve`]
-Previous       | [gocode]
-|              | Autocomplete is one of the most complicated features, and the more it knows the better its suggestions can be. For instance it can autocomplete into packages that are not yet being imported if it has their public symbols. It can make better suggestions of options if it knows what kind of program you are writing. It can suggest better arguments if it knows how you normally call a function. It can suggest entire patterns of code if it knows they are common. Unlike many other features, which have a specific task, and once it is doing that task the feature is done, autocomplete will never be finished. Balancing and improving both the candidates and how they are ranked will be a research problem for a long time to come.
-
----
-Rename   | Rename an identifier
--------- | ---
-Requires | AST and type information for the **reverse** transitive closure
-LSP      | [`textDocument/rename`]
-|        | [`textDocument/prepareRename`]
-Previous | [gorename]
-|        | This uses the same information that find references does, with all the same problems and limitations. It is slightly worse because the changes it suggests make it intolerant of incorrect results. It is also dangerous using it to change the public API of a package.
-
----
-Suggested fixes | Suggestions that can be manually or automatically accepted to change the code
---------------- | ---
-Requires        | Full go/analysis run, which needs full AST, type and SSA information
-LSP             | [`textDocument/codeAction`]
-Previous        | N/A
-|               | This is a brand new feature powered by the new go/analysis engine, and it should allow a huge amount of automated refactoring.
-
-[LSP specification]: https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/
-[talk]: TODO
-[slides]: https://github.com/gophercon/2019-talks/blob/master/RebeccaStambler-GoPleaseStopBreakingMyEditor/slides.pdf "Go, please stop breaking my editor!"
-[JSON rpc 2]: https://www.jsonrpc.org/specification
-
-[errcheck]: https://github.com/kisielk/errcheck
-[go-outline]: https://github.com/lukehoban/go-outline
-[go-symbols]: https://github.com/acroca/go-symbols
-[gocode]: https://github.com/stamblerre/gocode
-[godef]: https://github.com/rogpeppe/godef
-[godoc]: https://golang.org/cmd/godoc
-[gofmt]: https://golang.org/cmd/gofmt
-[gogetdoc]: https://github.com/zmb3/gogetdoc
-[goimports]: https://pkg.go.dev/golang.org/x/tools/cmd/goimports
-[gorename]: https://pkg.go.dev/golang.org/x/tools/cmd/gorename
-[goreturns]: https://github.com/sqs/goreturns
-[gotags]: https://github.com/jstemmer/gotags
-[guru]: https://pkg.go.dev/golang.org/x/tools/cmd/guru
-[impl]: https://github.com/josharian/impl
-[staticcheck]: https://staticcheck.io/docs/
-[go/types]: https://golang.org/pkg/go/types/
-[go/ast]: https://golang.org/pkg/go/ast/
-[go/token]: https://golang.org/pkg/go/token/
-
-[`completionItem/resolve`]:https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#completionItem_resolve
-[`textDocument/codeAction`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_codeAction
-[`textDocument/completion`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_completion
-[`textDocument/declaration`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_declaration
-[`textDocument/definition`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_definition
-[`textDocument/documentLink`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_documentLink
-[`textDocument/documentSymbol`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_documentSymbol
-[`textDocument/foldingRange`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_foldingRange
-[`textDocument/formatting`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_formatting
-[`textDocument/highlight`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_highlight
-[`textDocument/hover`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_hover
-[`textDocument/implementation`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_implementation
-[`textDocument/onTypeFormatting`]:https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_onTypeFormatting
-[`textDocument/prepareRename`]:https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_prepareRename
-[`textDocument/publishDiagnostics`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_publishDiagnostics
-[`textDocument/rangeFormatting`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_rangeFormatting
-[`textDocument/references`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_references
-[`textDocument/rename`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_rename
-[`textDocument/selectionRange`]:https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_selectionRange
-[`textDocument/signatureHelp`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_signatureHelp
-[`textDocument/typeDefinition`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_typeDefinition
-[`workspace/didChangeWatchedFiles`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#workspace_didChangeWatchedFiles
diff -urN a/gopls/doc/design/implementation.md b/gopls/doc/design/implementation.md
--- a/gopls/doc/design/implementation.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/design/implementation.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,48 +0,0 @@
-# gopls implementation documentation
-
-This is not intended as a complete description of the implementation, for the most the part the package godoc, code comments and the code itself hold that.
-Instead this is meant to be a guide into finding parts of the implementation, and understanding some core concepts used throughout the implementation.
-
-## View/Session/Cache
-
-Throughout the code there are references to these three concepts, and they build on each other.
-
-At the base is the *Cache*. This is the level at which we hold information that is global in nature, for instance information about the file system and its contents.
-
-Above that is the *Session*, which holds information for a connection to an editor. This layer hold things like the edited files (referred to as overlays).
-
-The top layer is called the *View*. This holds the configuration, and the mapping to configured packages.
-
-The purpose of this layering is to allow a single editor session to have multiple views active whilst still sharing as much information as possible for efficiency.
-In theory if only the View layer existed, the results would be identical, but slower and using more memory.
-
-## Code location
-
-gopls will be developed in the [x/tools] Go repository; the core packages are in [internal/lsp], and the binary and integration tests are located in [gopls].
-
-Below is a list of the core packages of gopls, and their primary purpose:
-
-Package | Description
---- | ---
-[gopls] | the main binary, plugins and integration tests
-[internal/lsp] | the core message handling package
-[internal/lsp/cache] | the cache layer
-[internal/lsp/cmd] | the gopls command line layer
-[internal/lsp/debug] | features to aid in debugging gopls
-[internal/lsp/protocol] | the lsp protocol layer and wire format
-[internal/lsp/source] | the core feature implementations
-[internal/span] | a package for dealing with source file locations
-[internal/memoize] | a function invocation cache used to reduce the work done
-[internal/jsonrpc2] | an implementation of the JSON RPC2 specification
-
-[gopls]: https://github.com/golang/tools/tree/master/gopls
-[internal/jsonrpc2]: https://github.com/golang/tools/tree/master/internal/jsonrpc2
-[internal/lsp]: https://github.com/golang/tools/tree/master/internal/lsp
-[internal/lsp/cache]: https://github.com/golang/tools/tree/master/internal/lsp/cache
-[internal/lsp/cmd]: https://github.com/golang/tools/tree/master/internal/lsp/cmd
-[internal/lsp/debug]: https://github.com/golang/tools/tree/master/internal/lsp/debug
-[internal/lsp/protocol]: https://github.com/golang/tools/tree/master/internal/lsp/protocol
-[internal/lsp/source]: https://github.com/golang/tools/tree/master/internal/lsp/source
-[internal/memoize]: https://github.com/golang/tools/tree/master/internal/memoize
-[internal/span]: https://github.com/golang/tools/tree/master/internal/span
-[x/tools]: https://github.com/golang/tools
diff -urN a/gopls/doc/design/integrating.md b/gopls/doc/design/integrating.md
--- a/gopls/doc/design/integrating.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/design/integrating.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,91 +0,0 @@
-# Documentation for plugin authors
-
-If you are integrating `gopls` into an editor by writing an editor plugin, there are quite a few semantics of the communication between the editor and `gopls` that are not specified by the [LSP specification].
-
-We attempt to document those details along with any other information that has been helpful to other plugin authors here.
-
-If you are implementing a plugin yourself and have questions this page does not answer, please reach out to us to ask, and then also contribute your findings back to this page.
-
-## Supported features
-
-For the most part you should look at the [list](status.md#supported-features) in the current status document to know if gopls supports a feature.
-For a truly authoritative answer you should check the [result][InitializeResult] of the [initialize] request, where gopls enumerates its support in the [ServerCapabilities].
-
-
-## Positions and ranges
-
-Many LSP requests pass position or range information. This is described in the [LSP specification][lsp-text-documents]:
-
-> A position inside a document (see Position definition below) is expressed as a zero-based line and character offset. The offsets are based on a UTF-16 string representation. So a string of the form a𐐀b the character offset of the character a is 0, the character offset of 𐐀 is 1 and the character offset of b is 3 since 𐐀 is represented using two code units in UTF-16.
-
-This means that integrators will need to calculate UTF-16 based column offsets.
-
-[`golang.org/x/tools/internal/span`] has the code to do this in go.
-[#31080] tracks making `span` and other useful packages non-internal.
-
-## Edits
-
-In order to deliver changes from gopls to the editor, the LSP supports arrays of [`TextEdit`][lsp-textedit]s in responses.
-The spec specifies exactly how these should be applied:
-
-> All text edits ranges refer to positions in the original document. Text edits ranges must never overlap, that means no part of the original document must be manipulated by more than one edit. However, it is possible that multiple edits have the same start position: multiple inserts, or any number of inserts followed by a single remove or replace edit. If multiple inserts have the same position, the order in the array defines the order in which the inserted strings appear in the resulting text.
-
-All `[]TextEdit` are sorted such that applying the array of deltas received in reverse order achieves the desired result that holds with the spec.
-
-## Errors
-
-Various error codes are described in the [LSP specification][lsp-response]. We are still determining what it means for a method to return an error; are errors only for low-level LSP/transport issues or can other conditions cause errors to be returned? See some of this discussion on [#31526].
-
-The method chosen is currently influenced by the exact treatment in the currently popular editor integrations. It may well change, and ideally would become more coherent across requests.
-
-* [`textDocument/codeAction`]: Return error if there was an error computing code actions.
-* [`textDocument/completion`]: Log errors, return empty result list.
-* [`textDocument/definition`]: Return error if there was an error computing the definition for the position.
-* [`textDocument/typeDefinition`]: Return error if there was an error computing the type definition for the position.
-* [`textDocument/formatting`]: Return error if there was an error formatting the file.
-* [`textDocument/highlight`]: Log errors, return empty result.
-* [`textDocument/hover`]: Return empty result.
-* [`textDocument/documentLink`]: Log errors, return nil result.
-* [`textDocument/publishDiagnostics`]: Log errors if there were any while computing diagnostics.
-* [`textDocument/references`]: Log errors, return empty result.
-* [`textDocument/rename`]: Return error if there was an error computing renames.
-* [`textDocument/signatureHelp`]: Log errors, return nil result.
-* [`textDocument/documentSymbols`]: Return error if there was an error computing document symbols.
-
-## Watching files
-
-It is fairly normal for files that affect `gopls` to be modified outside of the editor it is associated with.
-
-For instance, files that are needed to do correct type checking are modified by switching branches in git, or updated by a code generator.
-
-Monitoring files inside gopls directly has a lot of awkward problems, but the [LSP specification] has methods that allow gopls to request that the client notify it of file system changes, specifically [`workspace/didChangeWatchedFiles`].
-This is currently being added to gopls by a community member, and tracked in [#31553]
-
-[InitializeResult]: https://pkg.go.dev/golang.org/x/tools/internal/lsp/protocol#InitializeResult
-[ServerCapabilities]: https://pkg.go.dev/golang.org/x/tools/internal/lsp/protocol#ServerCapabilities
-[`golang.org/x/tools/internal/span`]: https://pkg.go.dev/golang.org/x/tools/internal/span#NewPoint
-
-[LSP specification]: https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/
-[lsp-response]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#response-message
-[initialize]: https://microsoft.github.io/language-server-protocol/specifications/specification-3-14/#initialize
-[lsp-text-documents]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#text-documents
-[lsp-textedit]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textedit
-
-[`textDocument/codeAction`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_codeAction
-[`textDocument/completion`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_completion
-[`textDocument/definition`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_definition
-[`textDocument/typeDefinition`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_typeDefinition
-[`textDocument/formatting`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_formatting
-[`textDocument/highlight`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_highlight
-[`textDocument/hover`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_hover
-[`textDocument/documentLink`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_documentLink
-[`textDocument/publishDiagnostics`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_publishDiagnostics
-[`textDocument/references`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_references
-[`textDocument/rename`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_rename
-[`textDocument/signatureHelp`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_signatureHelp
-[`textDocument/documentSymbols`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#textDocument_documentSymbols
-[`workspace/didChangeWatchedFiles`]: https://github.com/Microsoft/language-server-protocol/blob/gh-pages/_specifications/specification-3-14.md#workspace_didChangeWatchedFiles
-
-[#31080]: https://github.com/golang/go/issues/31080
-[#31553]: https://github.com/golang/go/issues/31553
-[#31526]: https://github.com/golang/go/issues/31526
diff -urN a/gopls/doc/emacs.md b/gopls/doc/emacs.md
--- a/gopls/doc/emacs.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/emacs.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,183 +0,0 @@
-# Emacs
-
-## Installing `gopls`
-
-To use `gopls` with Emacs, you must first
-[install the `gopls` binary](../README.md#installation) and ensure that the directory
-containing the resulting binary (either `$(go env GOBIN)` or `$(go env
-GOPATH)/bin`) is in your `PATH`.
-
-## Choosing an Emacs LSP client
-
-To use `gopls` with Emacs, you will need to choose and install an Emacs LSP
-client package. Two popular client packages are [LSP Mode] and [Eglot].
-
-LSP Mode takes a batteries-included approach, with many integrations enabled
-“out of the box” and several additional behaviors provided by `lsp-mode` itself.
-
-Eglot takes a minimally-intrusive approach, focusing on smooth integration with
-other established packages. It provides a few of its own `eglot-` commands but
-no additional keybindings by default.
-
-Once you have selected which client you want to use, install it per the packages
-instructions: see [Eglot 1-2-3](https://github.com/joaotavora/eglot#1-2-3) or
-[LSP Mode Installation](https://emacs-lsp.github.io/lsp-mode/page/installation/).
-
-## Common configuration
-
-Both Eglot and LSP Mode can integrate with popular packages in the Emacs
-ecosystem:
-
-* The built-in [`xref`] package provides cross-references.
-* The built-in [Flymake] package provides an on-the-fly diagnostic overlay.
-* [Company] mode displays code completion candidates (with a richer UI than
-  the built-in [`completion-at-point`]).
-
-Eglot provides documentation using the built-in [ElDoc] minor mode, while LSP
-Mode by default provides documentation using its own [`lsp-ui`] mode.
-
-Eglot by default locates the project root using the [`project`] package. In LSP
-Mode, this behavior can be configured using the `lsp-auto-guess-root` setting.
-
-## Configuring LSP Mode
-
-### Loading LSP Mode in `.emacs`
-
-```elisp
-(require 'lsp-mode)
-(add-hook 'go-mode-hook #'lsp-deferred)
-
-;; Set up before-save hooks to format buffer and add/delete imports.
-;; Make sure you don't have other gofmt/goimports hooks enabled.
-(defun lsp-go-install-save-hooks ()
-  (add-hook 'before-save-hook #'lsp-format-buffer t t)
-  (add-hook 'before-save-hook #'lsp-organize-imports t t))
-(add-hook 'go-mode-hook #'lsp-go-install-save-hooks)
-```
-
-### Configuring `gopls` via LSP Mode
-
-See [settings] for information about available gopls settings.
-
-Stable gopls settings have corresponding configuration variables in `lsp-mode`.
-For example, `(setq lsp-gopls-use-placeholders nil)` will disable placeholders
-in completion snippets. See [`lsp-go`] for a list of available variables.
-
-Experimental settings can be configured via `lsp-register-custom-settings`:
-
-```lisp
-(lsp-register-custom-settings
- '(("gopls.completeUnimported" t t)
-   ("gopls.staticcheck" t t)))
-```
-
-Note that after changing settings you must restart gopls using e.g. `M-x
-lsp-restart-workspace`.
-
-## Configuring Eglot
-
-### Configuring `project` for Go modules in `.emacs`
-
-Eglot uses the built-in `project` package to identify the LSP workspace for a
-newly-opened buffer. The `project` package does not natively know about `GOPATH`
-or Go modules. Fortunately, you can give it a custom hook to tell it to look for
-the nearest parent `go.mod` file (that is, the root of the Go module) as the
-project root.
-
-```elisp
-(require 'project)
-
-(defun project-find-go-module (dir)
-  (when-let ((root (locate-dominating-file dir "go.mod")))
-    (cons 'go-module root)))
-
-(cl-defmethod project-root ((project (head go-module)))
-  (cdr project))
-
-(add-hook 'project-find-functions #'project-find-go-module)
-```
-
-### Loading Eglot in `.emacs`
-
-```elisp
-;; Optional: load other packages before eglot to enable eglot integrations.
-(require 'company)
-(require 'yasnippet)
-
-(require 'go-mode)
-(require 'eglot)
-(add-hook 'go-mode-hook 'eglot-ensure)
-
-;; Optional: install eglot-format-buffer as a save hook.
-;; The depth of -10 places this before eglot's willSave notification,
-;; so that that notification reports the actual contents that will be saved.
-(defun eglot-format-buffer-on-save ()
-  (add-hook 'before-save-hook #'eglot-format-buffer -10 t))
-(add-hook 'go-mode-hook #'eglot-format-buffer-on-save)
-```
-
-### Configuring `gopls` via Eglot
-
-See [settings] for information about available gopls settings.
-
-LSP server settings are controlled by the `eglot-workspace-configuration`
-variable, which can be set either globally in `.emacs` or in a `.dir-locals.el` file in the project root.
-
-`.emacs`:
-```elisp
-(setq-default eglot-workspace-configuration
-    '((:gopls .
-        ((staticcheck . t)
-         (matcher . "CaseSensitive")))))
-```
-
-`.dir-locals.el`:
-```elisp
-((nil (eglot-workspace-configuration . ((gopls . ((staticcheck . t)
-						  (matcher . "CaseSensitive")))))))
-```
-
-### Organizing imports with Eglot
-
-`gopls` provides the import-organizing functionality of `goimports` as an LSP
-code action, which you can invoke as needed by running `M-x eglot-code-actions`
-(or a key of your choice bound to the `eglot-code-actions` function) and
-selecting `Organize Imports` at the prompt.
-
-Eglot does not currently support a standalone function to execute a specific
-code action (see
-[joaotavora/eglot#411](https://github.com/joaotavora/eglot/issues/411)), nor an
-option to organize imports as a `before-save-hook` (see
-[joaotavora/eglot#574](https://github.com/joaotavora/eglot/issues/574)). In the
-meantime, see those issues for discussion and possible workarounds.
-
-## Troubleshooting
-
-Common errors:
-
-* When prompted by Emacs for your project folder, if you are using modules you
-  must select the module's root folder (i.e. the directory with the "go.mod").
-  If you are using GOPATH, select your $GOPATH as your folder.
-* Emacs must have your environment set properly (PATH, GOPATH, etc). You can
-  run `M-x getenv <RET> PATH <RET>` to see if your PATH is set in Emacs. If
-  not, you can try starting Emacs from your terminal, using [this
-  package][exec-path-from-shell], or moving your shell config from `.bashrc`
-  into `.profile` and logging out and back in.
-* Make sure only one LSP client mode is installed. (For example, if using
-  `lsp-mode`, ensure that you are not _also_ enabling `eglot`.)
-* Look for errors in the `*lsp-log*` buffer or run `M-x eglot-events-buffer`.
-* Ask for help in the `#emacs` channel on the [Gophers slack].
-
-[LSP Mode]: https://emacs-lsp.github.io/lsp-mode/
-[Eglot]: https://github.com/joaotavora/eglot/blob/master/README.md
-[`xref`]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Xref.html
-[Flymake]: https://www.gnu.org/software/emacs/manual/html_node/flymake/Using-Flymake.html#Using-Flymake
-[Company]: https://company-mode.github.io/
-[`completion-at-point`]: https://www.gnu.org/software/emacs/manual/html_node/elisp/Completion-in-Buffers.html
-[ElDoc]: https://elpa.gnu.org/packages/eldoc.html
-[`lsp-ui`]: https://emacs-lsp.github.io/lsp-ui/
-[`lsp-go`]: https://github.com/emacs-lsp/lsp-mode/blob/master/clients/lsp-go.el
-[`use-package`]: https://github.com/jwiegley/use-package
-[`exec-path-from-shell`]: https://github.com/purcell/exec-path-from-shell
-[settings]: settings.md
-[Gophers slack]: https://invite.slack.golangbridge.org/
diff -urN a/gopls/doc/features.md b/gopls/doc/features.md
--- a/gopls/doc/features.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/features.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,55 +0,0 @@
-# Features
-
-This document describes some of the features supported by `gopls`. It is
-currently under construction, so, for a comprehensive list, see the
-[Language Server Protocol](https://microsoft.github.io/language-server-protocol/).
-
-## Special features
-
-Here, only special features outside of the LSP are described.
-
-### Symbol Queries
-
-Gopls supports some extended syntax for `workspace/symbol` requests, when using
-the `fuzzy` symbol matcher (the default). Inspired by the popular fuzzy matcher
-[FZF](https://github.com/junegunn/fzf), the following special characters are
-supported within symbol queries:
-
-| Character | Usage     | Match        |
-| --------- | --------- | ------------ |
-| `'`       | `'abc`    | exact        |
-| `^`       | `^printf` | exact prefix |
-| `$`       | `printf$` | exact suffix |
-
-## Template Files
-
-Gopls provides some support for Go template files, that is, files that
-are parsed by `text/template` or `html/template`.
-Gopls recognizes template files based on their file extension, which may be
-configured by the
-[`templateExtensions`](https://github.com/golang/tools/blob/master/gopls/doc/settings.md#templateextensions-string) setting.
-Making this list empty turns off template support.
-
-In template files, template support works inside
-the default `{{` delimiters. (Go template parsing
-allows the user to specify other delimiters, but
-gopls does not know how to do that.)
-
-Gopls template support includes the following features:
-+ **Diagnostics**: if template parsing returns an error,
-it is presented as a diagnostic. (Missing functions do not produce errors.)
-+ **Syntax Highlighting**: syntax highlighting is provided for template files.
-+  **Definitions**: gopls provides jump-to-definition inside templates, though it does not understand scoping (all templates are considered to be in one global scope).
-+  **References**: gopls provides find-references, with the same scoping limitation as definitions.
-+ **Completions**: gopls will attempt to suggest completions inside templates.
-
-### Configuring your editor
-
-In addition to configuring `templateExtensions`, you may need to configure your
-editor or LSP client to activate `gopls` for template files. For example, in
-`VS Code` you will need to configure both
-[`files.associations`](https://code.visualstudio.com/docs/languages/identifiers)
-and `build.templateExtensions` (the gopls setting).
-
-<!--TODO(rstambler): Automatically generate a list of supported features.-->
-
diff -urN a/gopls/doc/generate.go b/gopls/doc/generate.go
--- a/gopls/doc/generate.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/generate.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,712 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build go1.16
-// +build go1.16
-
-// Command generate creates API (settings, etc) documentation in JSON and
-// Markdown for machine and human consumption.
-package main
-
-import (
-	"bytes"
-	"encoding/json"
-	"fmt"
-	"go/ast"
-	"go/format"
-	"go/token"
-	"go/types"
-	"io"
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"reflect"
-	"regexp"
-	"sort"
-	"strconv"
-	"strings"
-	"time"
-	"unicode"
-
-	"github.com/jba/printsrc"
-	"golang.org/x/tools/go/ast/astutil"
-	"golang.org/x/tools/go/packages"
-	"golang.org/x/tools/internal/lsp/command"
-	"golang.org/x/tools/internal/lsp/command/commandmeta"
-	"golang.org/x/tools/internal/lsp/mod"
-	"golang.org/x/tools/internal/lsp/source"
-)
-
-func main() {
-	if _, err := doMain("..", true); err != nil {
-		fmt.Fprintf(os.Stderr, "Generation failed: %v\n", err)
-		os.Exit(1)
-	}
-}
-
-func doMain(baseDir string, write bool) (bool, error) {
-	api, err := loadAPI()
-	if err != nil {
-		return false, err
-	}
-
-	if ok, err := rewriteFile(filepath.Join(baseDir, "internal/lsp/source/api_json.go"), api, write, rewriteAPI); !ok || err != nil {
-		return ok, err
-	}
-	if ok, err := rewriteFile(filepath.Join(baseDir, "gopls/doc/settings.md"), api, write, rewriteSettings); !ok || err != nil {
-		return ok, err
-	}
-	if ok, err := rewriteFile(filepath.Join(baseDir, "gopls/doc/commands.md"), api, write, rewriteCommands); !ok || err != nil {
-		return ok, err
-	}
-	if ok, err := rewriteFile(filepath.Join(baseDir, "gopls/doc/analyzers.md"), api, write, rewriteAnalyzers); !ok || err != nil {
-		return ok, err
-	}
-
-	return true, nil
-}
-
-func loadAPI() (*source.APIJSON, error) {
-	pkgs, err := packages.Load(
-		&packages.Config{
-			Mode: packages.NeedTypes | packages.NeedTypesInfo | packages.NeedSyntax | packages.NeedDeps,
-		},
-		"golang.org/x/tools/internal/lsp/source",
-	)
-	if err != nil {
-		return nil, err
-	}
-	pkg := pkgs[0]
-
-	api := &source.APIJSON{
-		Options: map[string][]*source.OptionJSON{},
-	}
-	defaults := source.DefaultOptions()
-
-	api.Commands, err = loadCommands(pkg)
-	if err != nil {
-		return nil, err
-	}
-	api.Lenses = loadLenses(api.Commands)
-
-	// Transform the internal command name to the external command name.
-	for _, c := range api.Commands {
-		c.Command = command.ID(c.Command)
-	}
-	for _, m := range []map[string]*source.Analyzer{
-		defaults.DefaultAnalyzers,
-		defaults.TypeErrorAnalyzers,
-		defaults.ConvenienceAnalyzers,
-		// Don't yet add staticcheck analyzers.
-	} {
-		api.Analyzers = append(api.Analyzers, loadAnalyzers(m)...)
-	}
-	for _, category := range []reflect.Value{
-		reflect.ValueOf(defaults.UserOptions),
-	} {
-		// Find the type information and ast.File corresponding to the category.
-		optsType := pkg.Types.Scope().Lookup(category.Type().Name())
-		if optsType == nil {
-			return nil, fmt.Errorf("could not find %v in scope %v", category.Type().Name(), pkg.Types.Scope())
-		}
-		opts, err := loadOptions(category, optsType, pkg, "")
-		if err != nil {
-			return nil, err
-		}
-		catName := strings.TrimSuffix(category.Type().Name(), "Options")
-		api.Options[catName] = opts
-
-		// Hardcode the expected values for the analyses and code lenses
-		// settings, since their keys are not enums.
-		for _, opt := range opts {
-			switch opt.Name {
-			case "analyses":
-				for _, a := range api.Analyzers {
-					opt.EnumKeys.Keys = append(opt.EnumKeys.Keys, source.EnumKey{
-						Name:    fmt.Sprintf("%q", a.Name),
-						Doc:     a.Doc,
-						Default: strconv.FormatBool(a.Default),
-					})
-				}
-			case "codelenses":
-				// Hack: Lenses don't set default values, and we don't want to
-				// pass in the list of expected lenses to loadOptions. Instead,
-				// format the defaults using reflection here. The hackiest part
-				// is reversing lowercasing of the field name.
-				reflectField := category.FieldByName(upperFirst(opt.Name))
-				for _, l := range api.Lenses {
-					def, err := formatDefaultFromEnumBoolMap(reflectField, l.Lens)
-					if err != nil {
-						return nil, err
-					}
-					opt.EnumKeys.Keys = append(opt.EnumKeys.Keys, source.EnumKey{
-						Name:    fmt.Sprintf("%q", l.Lens),
-						Doc:     l.Doc,
-						Default: def,
-					})
-				}
-			}
-		}
-	}
-	return api, nil
-}
-
-func loadOptions(category reflect.Value, optsType types.Object, pkg *packages.Package, hierarchy string) ([]*source.OptionJSON, error) {
-	file, err := fileForPos(pkg, optsType.Pos())
-	if err != nil {
-		return nil, err
-	}
-
-	enums, err := loadEnums(pkg)
-	if err != nil {
-		return nil, err
-	}
-
-	var opts []*source.OptionJSON
-	optsStruct := optsType.Type().Underlying().(*types.Struct)
-	for i := 0; i < optsStruct.NumFields(); i++ {
-		// The types field gives us the type.
-		typesField := optsStruct.Field(i)
-
-		// If the field name ends with "Options", assume it is a struct with
-		// additional options and process it recursively.
-		if h := strings.TrimSuffix(typesField.Name(), "Options"); h != typesField.Name() {
-			// Keep track of the parent structs.
-			if hierarchy != "" {
-				h = hierarchy + "." + h
-			}
-			options, err := loadOptions(category, typesField, pkg, strings.ToLower(h))
-			if err != nil {
-				return nil, err
-			}
-			opts = append(opts, options...)
-			continue
-		}
-		path, _ := astutil.PathEnclosingInterval(file, typesField.Pos(), typesField.Pos())
-		if len(path) < 2 {
-			return nil, fmt.Errorf("could not find AST node for field %v", typesField)
-		}
-		// The AST field gives us the doc.
-		astField, ok := path[1].(*ast.Field)
-		if !ok {
-			return nil, fmt.Errorf("unexpected AST path %v", path)
-		}
-
-		// The reflect field gives us the default value.
-		reflectField := category.FieldByName(typesField.Name())
-		if !reflectField.IsValid() {
-			return nil, fmt.Errorf("could not find reflect field for %v", typesField.Name())
-		}
-
-		def, err := formatDefault(reflectField)
-		if err != nil {
-			return nil, err
-		}
-
-		typ := typesField.Type().String()
-		if _, ok := enums[typesField.Type()]; ok {
-			typ = "enum"
-		}
-		name := lowerFirst(typesField.Name())
-
-		var enumKeys source.EnumKeys
-		if m, ok := typesField.Type().(*types.Map); ok {
-			e, ok := enums[m.Key()]
-			if ok {
-				typ = strings.Replace(typ, m.Key().String(), m.Key().Underlying().String(), 1)
-			}
-			keys, err := collectEnumKeys(name, m, reflectField, e)
-			if err != nil {
-				return nil, err
-			}
-			if keys != nil {
-				enumKeys = *keys
-			}
-		}
-
-		// Get the status of the field by checking its struct tags.
-		reflectStructField, ok := category.Type().FieldByName(typesField.Name())
-		if !ok {
-			return nil, fmt.Errorf("no struct field for %s", typesField.Name())
-		}
-		status := reflectStructField.Tag.Get("status")
-
-		opts = append(opts, &source.OptionJSON{
-			Name:       name,
-			Type:       typ,
-			Doc:        lowerFirst(astField.Doc.Text()),
-			Default:    def,
-			EnumKeys:   enumKeys,
-			EnumValues: enums[typesField.Type()],
-			Status:     status,
-			Hierarchy:  hierarchy,
-		})
-	}
-	return opts, nil
-}
-
-func loadEnums(pkg *packages.Package) (map[types.Type][]source.EnumValue, error) {
-	enums := map[types.Type][]source.EnumValue{}
-	for _, name := range pkg.Types.Scope().Names() {
-		obj := pkg.Types.Scope().Lookup(name)
-		cnst, ok := obj.(*types.Const)
-		if !ok {
-			continue
-		}
-		f, err := fileForPos(pkg, cnst.Pos())
-		if err != nil {
-			return nil, fmt.Errorf("finding file for %q: %v", cnst.Name(), err)
-		}
-		path, _ := astutil.PathEnclosingInterval(f, cnst.Pos(), cnst.Pos())
-		spec := path[1].(*ast.ValueSpec)
-		value := cnst.Val().ExactString()
-		doc := valueDoc(cnst.Name(), value, spec.Doc.Text())
-		v := source.EnumValue{
-			Value: value,
-			Doc:   doc,
-		}
-		enums[obj.Type()] = append(enums[obj.Type()], v)
-	}
-	return enums, nil
-}
-
-func collectEnumKeys(name string, m *types.Map, reflectField reflect.Value, enumValues []source.EnumValue) (*source.EnumKeys, error) {
-	// Make sure the value type gets set for analyses and codelenses
-	// too.
-	if len(enumValues) == 0 && !hardcodedEnumKeys(name) {
-		return nil, nil
-	}
-	keys := &source.EnumKeys{
-		ValueType: m.Elem().String(),
-	}
-	// We can get default values for enum -> bool maps.
-	var isEnumBoolMap bool
-	if basic, ok := m.Elem().(*types.Basic); ok && basic.Kind() == types.Bool {
-		isEnumBoolMap = true
-	}
-	for _, v := range enumValues {
-		var def string
-		if isEnumBoolMap {
-			var err error
-			def, err = formatDefaultFromEnumBoolMap(reflectField, v.Value)
-			if err != nil {
-				return nil, err
-			}
-		}
-		keys.Keys = append(keys.Keys, source.EnumKey{
-			Name:    v.Value,
-			Doc:     v.Doc,
-			Default: def,
-		})
-	}
-	return keys, nil
-}
-
-func formatDefaultFromEnumBoolMap(reflectMap reflect.Value, enumKey string) (string, error) {
-	if reflectMap.Kind() != reflect.Map {
-		return "", nil
-	}
-	name := enumKey
-	if unquoted, err := strconv.Unquote(name); err == nil {
-		name = unquoted
-	}
-	for _, e := range reflectMap.MapKeys() {
-		if e.String() == name {
-			value := reflectMap.MapIndex(e)
-			if value.Type().Kind() == reflect.Bool {
-				return formatDefault(value)
-			}
-		}
-	}
-	// Assume that if the value isn't mentioned in the map, it defaults to
-	// the default value, false.
-	return formatDefault(reflect.ValueOf(false))
-}
-
-// formatDefault formats the default value into a JSON-like string.
-// VS Code exposes settings as JSON, so showing them as JSON is reasonable.
-// TODO(rstambler): Reconsider this approach, as the VS Code Go generator now
-// marshals to JSON.
-func formatDefault(reflectField reflect.Value) (string, error) {
-	def := reflectField.Interface()
-
-	// Durations marshal as nanoseconds, but we want the stringy versions,
-	// e.g. "100ms".
-	if t, ok := def.(time.Duration); ok {
-		def = t.String()
-	}
-	defBytes, err := json.Marshal(def)
-	if err != nil {
-		return "", err
-	}
-
-	// Nil values format as "null" so print them as hardcoded empty values.
-	switch reflectField.Type().Kind() {
-	case reflect.Map:
-		if reflectField.IsNil() {
-			defBytes = []byte("{}")
-		}
-	case reflect.Slice:
-		if reflectField.IsNil() {
-			defBytes = []byte("[]")
-		}
-	}
-	return string(defBytes), err
-}
-
-// valueDoc transforms a docstring documenting an constant identifier to a
-// docstring documenting its value.
-//
-// If doc is of the form "Foo is a bar", it returns '`"fooValue"` is a bar'. If
-// doc is non-standard ("this value is a bar"), it returns '`"fooValue"`: this
-// value is a bar'.
-func valueDoc(name, value, doc string) string {
-	if doc == "" {
-		return ""
-	}
-	if strings.HasPrefix(doc, name) {
-		// docstring in standard form. Replace the subject with value.
-		return fmt.Sprintf("`%s`%s", value, doc[len(name):])
-	}
-	return fmt.Sprintf("`%s`: %s", value, doc)
-}
-
-func loadCommands(pkg *packages.Package) ([]*source.CommandJSON, error) {
-	var commands []*source.CommandJSON
-
-	_, cmds, err := commandmeta.Load()
-	if err != nil {
-		return nil, err
-	}
-	// Parse the objects it contains.
-	for _, cmd := range cmds {
-		cmdjson := &source.CommandJSON{
-			Command: cmd.Name,
-			Title:   cmd.Title,
-			Doc:     cmd.Doc,
-			ArgDoc:  argsDoc(cmd.Args),
-		}
-		if cmd.Result != nil {
-			cmdjson.ResultDoc = typeDoc(cmd.Result, 0)
-		}
-		commands = append(commands, cmdjson)
-	}
-	return commands, nil
-}
-
-func argsDoc(args []*commandmeta.Field) string {
-	var b strings.Builder
-	for i, arg := range args {
-		b.WriteString(typeDoc(arg, 0))
-		if i != len(args)-1 {
-			b.WriteString(",\n")
-		}
-	}
-	return b.String()
-}
-
-func typeDoc(arg *commandmeta.Field, level int) string {
-	// Max level to expand struct fields.
-	const maxLevel = 3
-	if len(arg.Fields) > 0 {
-		if level < maxLevel {
-			return arg.FieldMod + structDoc(arg.Fields, level)
-		}
-		return "{ ... }"
-	}
-	under := arg.Type.Underlying()
-	switch u := under.(type) {
-	case *types.Slice:
-		return fmt.Sprintf("[]%s", u.Elem().Underlying().String())
-	}
-	return types.TypeString(under, nil)
-}
-
-func structDoc(fields []*commandmeta.Field, level int) string {
-	var b strings.Builder
-	b.WriteString("{\n")
-	indent := strings.Repeat("\t", level)
-	for _, fld := range fields {
-		if fld.Doc != "" && level == 0 {
-			doclines := strings.Split(fld.Doc, "\n")
-			for _, line := range doclines {
-				fmt.Fprintf(&b, "%s\t// %s\n", indent, line)
-			}
-		}
-		tag := fld.JSONTag
-		if tag == "" {
-			tag = fld.Name
-		}
-		fmt.Fprintf(&b, "%s\t%q: %s,\n", indent, tag, typeDoc(fld, level+1))
-	}
-	fmt.Fprintf(&b, "%s}", indent)
-	return b.String()
-}
-
-func loadLenses(commands []*source.CommandJSON) []*source.LensJSON {
-	all := map[command.Command]struct{}{}
-	for k := range source.LensFuncs() {
-		all[k] = struct{}{}
-	}
-	for k := range mod.LensFuncs() {
-		if _, ok := all[k]; ok {
-			panic(fmt.Sprintf("duplicate lens %q", string(k)))
-		}
-		all[k] = struct{}{}
-	}
-
-	var lenses []*source.LensJSON
-
-	for _, cmd := range commands {
-		if _, ok := all[command.Command(cmd.Command)]; ok {
-			lenses = append(lenses, &source.LensJSON{
-				Lens:  cmd.Command,
-				Title: cmd.Title,
-				Doc:   cmd.Doc,
-			})
-		}
-	}
-	return lenses
-}
-
-func loadAnalyzers(m map[string]*source.Analyzer) []*source.AnalyzerJSON {
-	var sorted []string
-	for _, a := range m {
-		sorted = append(sorted, a.Analyzer.Name)
-	}
-	sort.Strings(sorted)
-	var json []*source.AnalyzerJSON
-	for _, name := range sorted {
-		a := m[name]
-		json = append(json, &source.AnalyzerJSON{
-			Name:    a.Analyzer.Name,
-			Doc:     a.Analyzer.Doc,
-			Default: a.Enabled,
-		})
-	}
-	return json
-}
-
-func lowerFirst(x string) string {
-	if x == "" {
-		return x
-	}
-	return strings.ToLower(x[:1]) + x[1:]
-}
-
-func upperFirst(x string) string {
-	if x == "" {
-		return x
-	}
-	return strings.ToUpper(x[:1]) + x[1:]
-}
-
-func fileForPos(pkg *packages.Package, pos token.Pos) (*ast.File, error) {
-	fset := pkg.Fset
-	for _, f := range pkg.Syntax {
-		if fset.Position(f.Pos()).Filename == fset.Position(pos).Filename {
-			return f, nil
-		}
-	}
-	return nil, fmt.Errorf("no file for pos %v", pos)
-}
-
-func rewriteFile(file string, api *source.APIJSON, write bool, rewrite func([]byte, *source.APIJSON) ([]byte, error)) (bool, error) {
-	old, err := ioutil.ReadFile(file)
-	if err != nil {
-		return false, err
-	}
-
-	new, err := rewrite(old, api)
-	if err != nil {
-		return false, fmt.Errorf("rewriting %q: %v", file, err)
-	}
-
-	if !write {
-		return bytes.Equal(old, new), nil
-	}
-
-	if err := ioutil.WriteFile(file, new, 0); err != nil {
-		return false, err
-	}
-
-	return true, nil
-}
-
-func rewriteAPI(_ []byte, api *source.APIJSON) ([]byte, error) {
-	var buf bytes.Buffer
-	fmt.Fprintf(&buf, "// Code generated by \"golang.org/x/tools/gopls/doc/generate\"; DO NOT EDIT.\n\npackage source\n\nvar GeneratedAPIJSON = ")
-	if err := printsrc.NewPrinter("golang.org/x/tools/internal/lsp/source").Fprint(&buf, api); err != nil {
-		return nil, err
-	}
-	return format.Source(buf.Bytes())
-}
-
-type optionsGroup struct {
-	title   string
-	final   string
-	level   int
-	options []*source.OptionJSON
-}
-
-func rewriteSettings(doc []byte, api *source.APIJSON) ([]byte, error) {
-	result := doc
-	for category, opts := range api.Options {
-		groups := collectGroups(opts)
-
-		// First, print a table of contents.
-		section := bytes.NewBuffer(nil)
-		fmt.Fprintln(section, "")
-		for _, h := range groups {
-			writeBullet(section, h.final, h.level)
-		}
-		fmt.Fprintln(section, "")
-
-		// Currently, the settings document has a title and a subtitle, so
-		// start at level 3 for a header beginning with "###".
-		baseLevel := 3
-		for _, h := range groups {
-			level := baseLevel + h.level
-			writeTitle(section, h.final, level)
-			for _, opt := range h.options {
-				header := strMultiply("#", level+1)
-				section.Write([]byte(fmt.Sprintf("%s ", header)))
-				opt.Write(section)
-			}
-		}
-		var err error
-		result, err = replaceSection(result, category, section.Bytes())
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	section := bytes.NewBuffer(nil)
-	for _, lens := range api.Lenses {
-		fmt.Fprintf(section, "### **%v**\n\nIdentifier: `%v`\n\n%v\n", lens.Title, lens.Lens, lens.Doc)
-	}
-	return replaceSection(result, "Lenses", section.Bytes())
-}
-
-func collectGroups(opts []*source.OptionJSON) []optionsGroup {
-	optsByHierarchy := map[string][]*source.OptionJSON{}
-	for _, opt := range opts {
-		optsByHierarchy[opt.Hierarchy] = append(optsByHierarchy[opt.Hierarchy], opt)
-	}
-
-	// As a hack, assume that uncategorized items are less important to
-	// users and force the empty string to the end of the list.
-	var containsEmpty bool
-	var sorted []string
-	for h := range optsByHierarchy {
-		if h == "" {
-			containsEmpty = true
-			continue
-		}
-		sorted = append(sorted, h)
-	}
-	sort.Strings(sorted)
-	if containsEmpty {
-		sorted = append(sorted, "")
-	}
-	var groups []optionsGroup
-	baseLevel := 0
-	for _, h := range sorted {
-		split := strings.SplitAfter(h, ".")
-		last := split[len(split)-1]
-		// Hack to capitalize all of UI.
-		if last == "ui" {
-			last = "UI"
-		}
-		// A hierarchy may look like "ui.formatting". If "ui" has no
-		// options of its own, it may not be added to the map, but it
-		// still needs a heading.
-		components := strings.Split(h, ".")
-		for i := 1; i < len(components); i++ {
-			parent := strings.Join(components[0:i], ".")
-			if _, ok := optsByHierarchy[parent]; !ok {
-				groups = append(groups, optionsGroup{
-					title: parent,
-					final: last,
-					level: baseLevel + i,
-				})
-			}
-		}
-		groups = append(groups, optionsGroup{
-			title:   h,
-			final:   last,
-			level:   baseLevel + strings.Count(h, "."),
-			options: optsByHierarchy[h],
-		})
-	}
-	return groups
-}
-
-func hardcodedEnumKeys(name string) bool {
-	return name == "analyses" || name == "codelenses"
-}
-
-func writeBullet(w io.Writer, title string, level int) {
-	if title == "" {
-		return
-	}
-	// Capitalize the first letter of each title.
-	prefix := strMultiply("  ", level)
-	fmt.Fprintf(w, "%s* [%s](#%s)\n", prefix, capitalize(title), strings.ToLower(title))
-}
-
-func writeTitle(w io.Writer, title string, level int) {
-	if title == "" {
-		return
-	}
-	// Capitalize the first letter of each title.
-	fmt.Fprintf(w, "%s %s\n\n", strMultiply("#", level), capitalize(title))
-}
-
-func capitalize(s string) string {
-	return string(unicode.ToUpper(rune(s[0]))) + s[1:]
-}
-
-func strMultiply(str string, count int) string {
-	var result string
-	for i := 0; i < count; i++ {
-		result += string(str)
-	}
-	return result
-}
-
-func rewriteCommands(doc []byte, api *source.APIJSON) ([]byte, error) {
-	section := bytes.NewBuffer(nil)
-	for _, command := range api.Commands {
-		command.Write(section)
-	}
-	return replaceSection(doc, "Commands", section.Bytes())
-}
-
-func rewriteAnalyzers(doc []byte, api *source.APIJSON) ([]byte, error) {
-	section := bytes.NewBuffer(nil)
-	for _, analyzer := range api.Analyzers {
-		fmt.Fprintf(section, "## **%v**\n\n", analyzer.Name)
-		fmt.Fprintf(section, "%s\n\n", analyzer.Doc)
-		switch analyzer.Default {
-		case true:
-			fmt.Fprintf(section, "**Enabled by default.**\n\n")
-		case false:
-			fmt.Fprintf(section, "**Disabled by default. Enable it by setting `\"analyses\": {\"%s\": true}`.**\n\n", analyzer.Name)
-		}
-	}
-	return replaceSection(doc, "Analyzers", section.Bytes())
-}
-
-func replaceSection(doc []byte, sectionName string, replacement []byte) ([]byte, error) {
-	re := regexp.MustCompile(fmt.Sprintf(`(?s)<!-- BEGIN %v.* -->\n(.*?)<!-- END %v.* -->`, sectionName, sectionName))
-	idx := re.FindSubmatchIndex(doc)
-	if idx == nil {
-		return nil, fmt.Errorf("could not find section %q", sectionName)
-	}
-	result := append([]byte(nil), doc[:idx[2]]...)
-	result = append(result, replacement...)
-	result = append(result, doc[idx[3]:]...)
-	return result, nil
-}
diff -urN a/gopls/doc/generate_test.go b/gopls/doc/generate_test.go
--- a/gopls/doc/generate_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/generate_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,26 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build go1.16
-// +build go1.16
-
-package main
-
-import (
-	"testing"
-
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestGenerated(t *testing.T) {
-	testenv.NeedsGoBuild(t) // This is a lie. We actually need the source code.
-
-	ok, err := doMain("../..", false)
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !ok {
-		t.Error("documentation needs updating. run: `go run doc/generate.go` from the gopls module.")
-	}
-}
diff -urN a/gopls/doc/semantictokens.md b/gopls/doc/semantictokens.md
--- a/gopls/doc/semantictokens.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/semantictokens.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,121 +0,0 @@
-# Semantic Tokens
-
-The [LSP](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#textDocument_semanticTokens)
-specifies semantic tokens as a way of telling clients about language-specific
-properties of pieces of code in a file being edited.
-
-The client asks for a set of semantic tokens and modifiers. This note describe which ones
-gopls will return, and under what circumstances. Gopls has no control over how the client
-converts semantic tokens into colors (or some other visible indication). In vscode it
-is possible to modify the color a theme uses by setting the `editor.semanticTokenColorCustomizations`
-object. We provide a little [guidance](#Colors) later.
-
-There are 22 semantic tokens, with 10 possible modifiers. The protocol allows each semantic
-token to be used with any of the 1024 subsets of possible modifiers, but most combinations
-don't make intuitive sense (although `async documentation` has a certain appeal).
-
-The 22 semantic tokens are `namespace`, `type`, `class`, `enum`, `interface`,
-		`struct`, `typeParameter`, `parameter`, `variable`, `property`, `enumMember`,
-		`event`, `function`, `method`, `macro`, `keyword`, `modifier`, `comment`,
-		`string`, `number`, `regexp`, `operator`.
-
-The 10 modifiers are `declaration`, `definition`, `readonly`, `static`,
-		`deprecated`, `abstract`, `async`, `modification`, `documentation`, `defaultLibrary`.
-
-The authoritative lists are in the [specification](https://microsoft.github.io/language-server-protocol/specifications/specification-3-17/#semanticTokenTypes)
-
-For the implementation to work correctly the client and server have to agree on the ordering
-of the tokens and of the modifiers. Gopls, therefore, will only send tokens and modifiers
-that the client has asked for. This document says what gopls would send if the client
-asked for everything. By default, vscode asks for everything.
-
-Gopls sends 11 token types for `.go` files and 1 for `.*tmpl` files.
-Nothing is sent for any other kind of file.
-This all could change. (When Go has generics, gopls will return `typeParameter`.)
-
-For `.*tmpl` files gopls sends `macro`, and no modifiers, for each `{{`...`}}` scope.
-
-## Semantic tokens for Go files
-
-There are two contrasting guiding principles that might be used to decide what to mark
-with semantic tokens. All clients already do some kind of syntax marking. E.g., vscode
-uses a TextMate grammar. The minimal principle would send semantic tokens only for those
-language features that cannot be reliably found without parsing Go and looking at types.
-The maximal principle would attempt to convey as much as possible about the Go code,
-using all available parsing and type information.
-
-There is much to be said for returning minimal information, but the minimal principle is
-not well-specified. Gopls has no way of knowing what the clients know about the Go program
-being edited. Even in vscode the TextMate grammars can be more or less elaborate
-and change over time. (Nonetheless, a minimal implementation would not return `keyword`,
-`number`, `comment`, or `string`.)
-
-The maximal position isn't particularly well-specified either. To chose one example, a
-format string might have formatting codes (`%[4]-3.6f`), escape sequences (`\U00010604`), and regular
-characters. Should these all be distinguished? One could even imagine distinguishing
-different runes by their Unicode language assignment, or some other Unicode property, such as
-being [confusable](http://www.unicode.org/Public/security/10.0.0/confusables.txt).
-
-Gopls does not come close to either of these principles.  Semantic tokens are returned for
-identifiers, keywords, operators, comments, and literals. (Sematic tokens do not
-cover the file. They are not returned for
-white space or punctuation, and there is no semantic token for labels.)
-The following describes more precisely what gopls
-does, with a few notes on possible alternative choices.
-The references to *object* refer to the
-```types.Object``` returned by the type checker. The references to *nodes* refer to the
-```ast.Node``` from the parser.
-
-1. __`keyword`__ All Go [keywords](https://golang.org/ref/spec#Keywords) are marked `keyword`.
-1. __`namespace`__ All package names are marked `namespace`. In an import, if there is an
-alias, it would be marked. Otherwise the last component of the import path is marked.
-1. __`type`__ Objects of type ```types.TypeName``` are marked `type`.
-If they are also ```types.Basic```
-the modifier is `defaultLibrary`. (And in ```type B struct{C}```, ```B``` has modifier `definition`.)
-1. __`parameter`__ The formal arguments in ```ast.FuncDecl``` and ```ast.FuncType``` nodes are marked `parameter`.
-1. __`variable`__  Identifiers in the
-scope of ```const``` are modified with `readonly`. ```nil``` is usually a `variable` modified with both
-`readonly` and `defaultLibrary`. (```nil``` is a predefined identifier; the user can redefine it,
-in which case it would just be a variable, or whatever.) Identifiers of type ```types.Variable``` are,
-not surprisingly, marked `variable`. Identifiers being defined (node ```ast.GenDecl```) are modified
-by `definition` and, if appropriate, `readonly`. Receivers (in method declarations) are
-`variable`.
-1. __`method`__ Methods are marked at their definition (```func (x foo) bar() {}```) or declaration
-in an ```interface```. Methods are not marked where they are used.
-In ```x.bar()```, ```x``` will be marked
-either as a `namespace` if it is a package name, or as a `variable` if it is an interface value,
-so distinguishing ```bar``` seemed superfluous.
-1. __`function`__ Bultins (```types.Builtin```) are modified with `defaultLibrary`
-(e.g., ```make```, ```len```, ```copy```). Identifiers whose
-object is ```types.Func``` or whose node is ```ast.FuncDecl``` are `function`.
-1. __`comment`__ Comments and struct tags. (Perhaps struct tags should be `property`?)
-1. __`string`__ Strings. Could add modifiers for e.g., escapes or format codes.
-1. __`number`__ Numbers. Should the ```i``` in ```23i``` be handled specially?
-1. __`operator`__ Assignment operators, binary operators, ellipses (```...```), increment/decrement
-operators, sends (```<-```), and unary operators.
-
-Gopls will send the modifier `deprecated` if it finds a comment
-```// deprecated``` in the godoc.
-
-The unused tokens for Go code are `class`, `enum`, `interface`,
-		`struct`, `typeParameter`, `property`, `enumMember`,
-		`event`, `macro`, `modifier`,
-		`regexp`
-
-## Colors
-
-These comments are about vscode.
-
-The documentation has a [helpful](https://code.visualstudio.com/api/language-extensions/semantic-highlight-guide#custom-textmate-scope-mappings)
-description of which semantic tokens correspond to scopes in TextMate grammars. Themes seem
-to use the TextMate scopes to decide on colors.
-
-Some examples of color customizations are [here](https://medium.com/@danromans/how-to-customize-semantic-token-colorization-with-visual-studio-code-ac3eab96141b).
-
-## Note
-
-While a file is being edited it may temporarily contain either
-parsing errors or type errors. In this case gopls cannot determine some (or maybe any)
-of the semantic tokens. To avoid weird flickering it is the responsibility
-of clients to maintain the semantic token information
-in the unedited part of the file, and they do.
\ No newline at end of file
diff -urN a/gopls/doc/settings.md b/gopls/doc/settings.md
--- a/gopls/doc/settings.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/settings.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,484 +0,0 @@
-# Settings
-
-<!--TODO: Generate this file from the documentation in golang/org/x/tools/internal/lsp/source/options.go.-->
-
-This document describes the global settings for `gopls` inside the editor.
-The settings block will be called `"gopls"` and contains a collection of
-controls for `gopls` that the editor is not expected to understand or control.
-These settings can also be configured differently per workspace folder.
-
-In VSCode, this would be a section in your `settings.json` file that might look
-like this:
-
-```json5
-  "gopls": {
-    "ui.completion.usePlaceholders": true,
-     ...
-  },
-```
-
-## Officially supported
-
-Below is the list of settings that are officially supported for `gopls`.
-
-Any settings that are experimental or for debugging purposes are marked as
-such.
-
-To enable all experimental features, use **allExperiments: `true`**. You will
-still be able to independently override specific experimental features.
-
-<!-- BEGIN User: DO NOT MANUALLY EDIT THIS SECTION -->
-
-* [Build](#build)
-* [Formatting](#formatting)
-* [UI](#ui)
-  * [Completion](#completion)
-  * [Diagnostic](#diagnostic)
-  * [Documentation](#documentation)
-  * [Navigation](#navigation)
-
-### Build
-
-#### **buildFlags** *[]string*
-
-buildFlags is the set of flags passed on to the build system when invoked.
-It is applied to queries like `go list`, which is used when discovering files.
-The most common use is to set `-tags`.
-
-Default: `[]`.
-
-#### **env** *map[string]string*
-
-env adds environment variables to external commands run by `gopls`, most notably `go list`.
-
-Default: `{}`.
-
-#### **directoryFilters** *[]string*
-
-directoryFilters can be used to exclude unwanted directories from the
-workspace. By default, all directories are included. Filters are an
-operator, `+` to include and `-` to exclude, followed by a path prefix
-relative to the workspace folder. They are evaluated in order, and
-the last filter that applies to a path controls whether it is included.
-The path prefix can be empty, so an initial `-` excludes everything.
-
-Examples:
-
-Exclude node_modules: `-node_modules`
-
-Include only project_a: `-` (exclude everything), `+project_a`
-
-Include only project_a, but not node_modules inside it: `-`, `+project_a`, `-project_a/node_modules`
-
-Default: `["-node_modules"]`.
-
-#### **templateExtensions** *[]string*
-
-templateExtensions gives the extensions of file names that are treateed
-as template files. (The extension
-is the part of the file name after the final dot.)
-
-Default: `[]`.
-
-#### **memoryMode** *enum*
-
-**This setting is experimental and may be deleted.**
-
-memoryMode controls the tradeoff `gopls` makes between memory usage and
-correctness.
-
-Values other than `Normal` are untested and may break in surprising ways.
-
-Must be one of:
-
-* `"DegradeClosed"`: In DegradeClosed mode, `gopls` will collect less information about
-packages without open files. As a result, features like Find
-References and Rename will miss results in such packages.
-* `"Normal"`
-
-Default: `"Normal"`.
-
-#### **expandWorkspaceToModule** *bool*
-
-**This setting is experimental and may be deleted.**
-
-expandWorkspaceToModule instructs `gopls` to adjust the scope of the
-workspace to find the best available module root. `gopls` first looks for
-a go.mod file in any parent directory of the workspace folder, expanding
-the scope to that directory if it exists. If no viable parent directory is
-found, gopls will check if there is exactly one child directory containing
-a go.mod file, narrowing the scope to that directory if it exists.
-
-Default: `true`.
-
-#### **experimentalWorkspaceModule** *bool*
-
-**This setting is experimental and may be deleted.**
-
-experimentalWorkspaceModule opts a user into the experimental support
-for multi-module workspaces.
-
-Default: `false`.
-
-#### **experimentalPackageCacheKey** *bool*
-
-**This setting is experimental and may be deleted.**
-
-experimentalPackageCacheKey controls whether to use a coarser cache key
-for package type information to increase cache hits. This setting removes
-the user's environment, build flags, and working directory from the cache
-key, which should be a safe change as all relevant inputs into the type
-checking pass are already hashed into the key. This is temporarily guarded
-by an experiment because caching behavior is subtle and difficult to
-comprehensively test.
-
-Default: `true`.
-
-#### **allowModfileModifications** *bool*
-
-**This setting is experimental and may be deleted.**
-
-allowModfileModifications disables -mod=readonly, allowing imports from
-out-of-scope modules. This option will eventually be removed.
-
-Default: `false`.
-
-#### **allowImplicitNetworkAccess** *bool*
-
-**This setting is experimental and may be deleted.**
-
-allowImplicitNetworkAccess disables GOPROXY=off, allowing implicit module
-downloads rather than requiring user action. This option will eventually
-be removed.
-
-Default: `false`.
-
-#### **experimentalUseInvalidMetadata** *bool*
-
-**This setting is experimental and may be deleted.**
-
-experimentalUseInvalidMetadata enables gopls to fall back on outdated
-package metadata to provide editor features if the go command fails to
-load packages for some reason (like an invalid go.mod file). This will
-eventually be the default behavior, and this setting will be removed.
-
-Default: `false`.
-
-### Formatting
-
-#### **local** *string*
-
-local is the equivalent of the `goimports -local` flag, which puts
-imports beginning with this string after third-party packages. It should
-be the prefix of the import path whose imports should be grouped
-separately.
-
-Default: `""`.
-
-#### **gofumpt** *bool*
-
-gofumpt indicates if we should run gofumpt formatting.
-
-Default: `false`.
-
-### UI
-
-#### **codelenses** *map[string]bool*
-
-codelenses overrides the enabled/disabled state of code lenses. See the
-"Code Lenses" section of the
-[Settings page](https://github.com/golang/tools/blob/master/gopls/doc/settings.md)
-for the list of supported lenses.
-
-Example Usage:
-
-```json5
-"gopls": {
-...
-  "codelenses": {
-    "generate": false,  // Don't show the `go generate` lens.
-    "gc_details": true  // Show a code lens toggling the display of gc's choices.
-  }
-...
-}
-```
-
-Default: `{"gc_details":false,"generate":true,"regenerate_cgo":true,"tidy":true,"upgrade_dependency":true,"vendor":true}`.
-
-#### **semanticTokens** *bool*
-
-**This setting is experimental and may be deleted.**
-
-semanticTokens controls whether the LSP server will send
-semantic tokens to the client.
-
-Default: `false`.
-
-#### Completion
-
-##### **usePlaceholders** *bool*
-
-placeholders enables placeholders for function parameters or struct
-fields in completion responses.
-
-Default: `false`.
-
-##### **completionBudget** *time.Duration*
-
-**This setting is for debugging purposes only.**
-
-completionBudget is the soft latency goal for completion requests. Most
-requests finish in a couple milliseconds, but in some cases deep
-completions can take much longer. As we use up our budget we
-dynamically reduce the search scope to ensure we return timely
-results. Zero means unlimited.
-
-Default: `"100ms"`.
-
-##### **matcher** *enum*
-
-**This is an advanced setting and should not be configured by most `gopls` users.**
-
-matcher sets the algorithm that is used when calculating completion
-candidates.
-
-Must be one of:
-
-* `"CaseInsensitive"`
-* `"CaseSensitive"`
-* `"Fuzzy"`
-
-Default: `"Fuzzy"`.
-
-##### **experimentalPostfixCompletions** *bool*
-
-**This setting is experimental and may be deleted.**
-
-experimentalPostfixCompletions enables artifical method snippets
-such as "someSlice.sort!".
-
-Default: `true`.
-
-#### Diagnostic
-
-##### **analyses** *map[string]bool*
-
-analyses specify analyses that the user would like to enable or disable.
-A map of the names of analysis passes that should be enabled/disabled.
-A full list of analyzers that gopls uses can be found
-[here](https://github.com/golang/tools/blob/master/gopls/doc/analyzers.md).
-
-Example Usage:
-
-```json5
-...
-"analyses": {
-  "unreachable": false, // Disable the unreachable analyzer.
-  "unusedparams": true  // Enable the unusedparams analyzer.
-}
-...
-```
-
-Default: `{}`.
-
-##### **staticcheck** *bool*
-
-**This setting is experimental and may be deleted.**
-
-staticcheck enables additional analyses from staticcheck.io.
-
-Default: `false`.
-
-##### **annotations** *map[string]bool*
-
-**This setting is experimental and may be deleted.**
-
-annotations specifies the various kinds of optimization diagnostics
-that should be reported by the gc_details command.
-
-Can contain any of:
-
-* `"bounds"` controls bounds checking diagnostics.
-* `"escape"` controls diagnostics about escape choices.
-* `"inline"` controls diagnostics about inlining choices.
-* `"nil"` controls nil checks.
-
-Default: `{"bounds":true,"escape":true,"inline":true,"nil":true}`.
-
-##### **diagnosticsDelay** *time.Duration*
-
-**This is an advanced setting and should not be configured by most `gopls` users.**
-
-diagnosticsDelay controls the amount of time that gopls waits
-after the most recent file modification before computing deep diagnostics.
-Simple diagnostics (parsing and type-checking) are always run immediately
-on recently modified packages.
-
-This option must be set to a valid duration string, for example `"250ms"`.
-
-Default: `"250ms"`.
-
-##### **experimentalWatchedFileDelay** *time.Duration*
-
-**This setting is experimental and may be deleted.**
-
-experimentalWatchedFileDelay controls the amount of time that gopls waits
-for additional workspace/didChangeWatchedFiles notifications to arrive,
-before processing all such notifications in a single batch. This is
-intended for use by LSP clients that don't support their own batching of
-file system notifications.
-
-This option must be set to a valid duration string, for example `"100ms"`.
-
-Default: `"0s"`.
-
-#### Documentation
-
-##### **hoverKind** *enum*
-
-hoverKind controls the information that appears in the hover text.
-SingleLine and Structured are intended for use only by authors of editor plugins.
-
-Must be one of:
-
-* `"FullDocumentation"`
-* `"NoDocumentation"`
-* `"SingleLine"`
-* `"Structured"` is an experimental setting that returns a structured hover format.
-This format separates the signature from the documentation, so that the client
-can do more manipulation of these fields.\
-This should only be used by clients that support this behavior.
-* `"SynopsisDocumentation"`
-
-Default: `"FullDocumentation"`.
-
-##### **linkTarget** *string*
-
-linkTarget controls where documentation links go.
-It might be one of:
-
-* `"godoc.org"`
-* `"pkg.go.dev"`
-
-If company chooses to use its own `godoc.org`, its address can be used as well.
-
-Default: `"pkg.go.dev"`.
-
-##### **linksInHover** *bool*
-
-linksInHover toggles the presence of links to documentation in hover.
-
-Default: `true`.
-
-#### Navigation
-
-##### **importShortcut** *enum*
-
-importShortcut specifies whether import statements should link to
-documentation or go to definitions.
-
-Must be one of:
-
-* `"Both"`
-* `"Definition"`
-* `"Link"`
-
-Default: `"Both"`.
-
-##### **symbolMatcher** *enum*
-
-**This is an advanced setting and should not be configured by most `gopls` users.**
-
-symbolMatcher sets the algorithm that is used when finding workspace symbols.
-
-Must be one of:
-
-* `"CaseInsensitive"`
-* `"CaseSensitive"`
-* `"FastFuzzy"`
-* `"Fuzzy"`
-
-Default: `"Fuzzy"`.
-
-##### **symbolStyle** *enum*
-
-**This is an advanced setting and should not be configured by most `gopls` users.**
-
-symbolStyle controls how symbols are qualified in symbol responses.
-
-Example Usage:
-
-```json5
-"gopls": {
-...
-  "symbolStyle": "Dynamic",
-...
-}
-```
-
-Must be one of:
-
-* `"Dynamic"` uses whichever qualifier results in the highest scoring
-match for the given symbol query. Here a "qualifier" is any "/" or "."
-delimited suffix of the fully qualified symbol. i.e. "to/pkg.Foo.Field" or
-just "Foo.Field".
-* `"Full"` is fully qualified symbols, i.e.
-"path/to/pkg.Foo.Field".
-* `"Package"` is package qualified symbols i.e.
-"pkg.Foo.Field".
-
-Default: `"Dynamic"`.
-
-#### **verboseOutput** *bool*
-
-**This setting is for debugging purposes only.**
-
-verboseOutput enables additional debug logging.
-
-Default: `false`.
-
-<!-- END User: DO NOT MANUALLY EDIT THIS SECTION -->
-
-## Code Lenses
-
-These are the code lenses that `gopls` currently supports. They can be enabled
-and disabled using the `codelenses` setting, documented above. Their names and
-features are subject to change.
-
-<!-- BEGIN Lenses: DO NOT MANUALLY EDIT THIS SECTION -->
-### **Toggle gc_details**
-
-Identifier: `gc_details`
-
-Toggle the calculation of gc annotations.
-### **Run go generate**
-
-Identifier: `generate`
-
-Runs `go generate` for a given directory.
-### **Regenerate cgo**
-
-Identifier: `regenerate_cgo`
-
-Regenerates cgo definitions.
-### **Run test(s) (legacy)**
-
-Identifier: `test`
-
-Runs `go test` for a specific set of test or benchmark functions.
-### **Run go mod tidy**
-
-Identifier: `tidy`
-
-Runs `go mod tidy` for a module.
-### **Upgrade a dependency**
-
-Identifier: `upgrade_dependency`
-
-Upgrades a dependency in the go.mod file for a module.
-### **Run go mod vendor**
-
-Identifier: `vendor`
-
-Runs `go mod vendor` for a module.
-<!-- END Lenses: DO NOT MANUALLY EDIT THIS SECTION -->
diff -urN a/gopls/doc/subl.md b/gopls/doc/subl.md
--- a/gopls/doc/subl.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/subl.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,77 +0,0 @@
-# Sublime Text
-
-Use the [LSP] package. After installing it using Package Control, do the following:
-
-* Open the **Command Palette**
-* Find and run the command **LSP: Enable Language Server Globally**
-* Select the **gopls** item. Be careful not to select the similarly named *golsp* by mistake.
-
-Finally, you should familiarise yourself with the LSP package's *Settings* and *Key Bindings*. Find them under the menu item **Preferences > Package Settings > LSP**.
-
-## Examples
-Minimal global LSP settings, that assume **gopls** and **go** appear on the PATH seen by Sublime Text:<br>
-```
-{
-    "clients": {
-        "gopls": {
-             "enabled": true,
-         }
-    }
-}
-```
-
-Global LSP settings that supply a specific PATH for finding **gopls** and **go**, as well as some settings for Sublime LSP itself:
-```
-{
-    "clients": {
-        "gopls": {
-            "enabled": true,
-            "env": {
-                "PATH": "/path/to/your/go/bin",
-            }
-        }
-    },
-    // Recommended by https://agniva.me/gopls/2021/01/02/setting-up-gopls-sublime.html
-    // except log_stderr mentioned there is no longer recognized.
-    "show_references_in_quick_panel": true,
-    "log_debug": true,
-    // These two are recommended by LSP-json as replacement for deprecated only_show_lsp_completions
-    "inhibit_snippet_completions": true,
-    "inhibit_word_completions": true,
- }
- ```
-
-LSP and gopls settings can also be adjusted on a per-project basis to override global settings.
-```
-{
-    "folders": [
-        {
-            "path": "/path/to/a/folder/one"
-        },
-        {
-            // If you happen to be working on Go itself, this can be helpful; go-dev/bin should be on PATH.
-            "path": "/path/to/your/go-dev/src/cmd"
-        }
-     ],
-    "settings": {
-        "LSP": {
-            "gopls": {
-                "env": {
-                    "PATH": "/path/to/your/go-dev/bin:/path/to/your/go/bin",
-                    "GOPATH": "",
-                },
-                "settings": {
-                    "experimentalWorkspaceModule": true
-                }
-            }
-        },
-        // This will apply for all languages in this project that have
-        // LSP servers, not just Go, however cannot enable just for Go.
-        "lsp_format_on_save": true,
-    }
-}
-```
-
-Usually changes to these settings are recognized after saving the project file, but it may sometimes be necessary to either restart the server(s) (**Tools > LSP > Restart Servers**) or quit and restart Sublime Text itself.
-
-[LSP]: https://packagecontrol.io/packages/LSP
diff -urN a/gopls/doc/troubleshooting.md b/gopls/doc/troubleshooting.md
--- a/gopls/doc/troubleshooting.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/troubleshooting.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,48 +0,0 @@
-# Troubleshooting
-
-If you suspect that `gopls` is crashing or not working correctly, please follow the troubleshooting steps below.
-
-If `gopls` is using too much memory, please follow the steps under [Memory usage](#debug-memory-usage).
-
-## Steps
-
-VS Code users should follow [their troubleshooting guide](https://github.com/golang/vscode-go/blob/master/docs/troubleshooting.md), which has more a more specific version of these instructions.
-
-1. Verify that your project is in good shape by working with it outside of your editor. Running a command like `go build ./...` in the workspace directory will compile everything. For modules, `go mod tidy` is another good check, though it may modify your `go.mod`.
-1. Check that your editor isn't showing any diagnostics that indicate a problem with your workspace. They may appear as diagnostics on a Go file's package declaration, diagnostics in a go.mod file, or as a status or progress message. Problems in the workspace configuration can cause many different symptoms. See the [workspace setup instructions](workspace.md) for help.
-1. Make sure `gopls` is up to date by following the [installation instructions](../README.md#installation), then [restarting gopls](#restart-gopls).
-1. Optionally, [ask for help](#ask-for-help) on Gophers Slack.
-1. Finally, [report the issue](#file-an-issue) to the `gopls` developers.
-
-## Restart `gopls`
-
-`gopls` has no persistent state, so restarting it will fix transient problems. This is good and bad: good, because you can keep working, and bad, because you won't be able to debug the issue until it recurs.
-
-In most cases, closing all your open editors will guarantee that `gopls` is killed and restarted. If you don't want to do that, there may be an editor command you can use to restart only `gopls`. Note that some `vim` configurations keep the server alive for a while after the editor exits; you may need to explicitly kill `gopls` if you use `vim`.
-
-## Ask for help
-
-Gophers Slack has active editor-specific channels like [#emacs](https://gophers.slack.com/archives/C0HKHULEM), [#vim](https://gophers.slack.com/archives/C07GBR52P), and [#vscode](https://gophers.slack.com/archives/C2B4L99RS) that can help debug further. If you're confident the problem is with `gopls`, you can go straight to [#gopls](https://gophers.slack.com/archives/CJZH85XCZ). Invites are [available to everyone](https://invite.slack.golangbridge.org). Come prepared with a short description of the issue, and try to be available to answer questions for a while afterward.
-
-## File an issue
-
-We can't diagnose a problem from just a description. When filing an issue, please include as much as possible of the following information:
-
-1. Your editor and any settings you have configured (for example, your VSCode `settings.json` file).
-1. A sample program that reproduces the issue, if possible.
-1. The output of `gopls version` on the command line.
-1. A complete gopls log file from a session where the issue occurred. It should have a `go env for <workspace folder>` log line near the beginning. It's also helpful to tell us the timestamp the problem occurred, so we can find it the log. See the [instructions](#capture-logs) for information on how to capture gopls logs.
-
-Your editor may have a command that fills out some of the necessary information, such as `:GoReportGitHubIssue` in `vim-go`. Otherwise, you can use `gopls bug` on the command line. If neither of those work you can start from scratch directly on the [Go issue tracker](https://github.com/golang/go/issues/new?title=x%2Ftools%2Fgopls%3A%20%3Cfill%20this%20in%3E).
-
-## Capture logs
-
-You may have to change your editor's configuration to pass a `-logfile` flag to gopls.
-
-To increase the level of detail in your logs, start `gopls` with the `-rpc.trace` flag. To start a debug server that will allow you to see profiles and memory usage, start `gopls` with `serve --debug=localhost:6060`. You will then be able to view debug information by navigating to `localhost:6060`.
-
-If you are unsure of how to pass a flag to `gopls` through your editor, please see the [documentation for your editor](../README.md#editors).
-
-## Debug memory usage
-
-`gopls` automatically writes out memory debug information when your usage exceeds 1GB. This information can be found in your temporary directory with names like `gopls.1234-5GiB-withnames.zip`. On Windows, your temporary directory will be located at `%TMP%`, and on Unixes, it will be `$TMPDIR`, which is usually `/tmp`. Please [file an issue](#file-an-issue) with this memory debug information attached. If you are uncomfortable sharing the package names of your code, you can share the `-nonames` zip instead, but it's much less useful.
diff -urN a/gopls/doc/vim.md b/gopls/doc/vim.md
--- a/gopls/doc/vim.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/vim.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,229 +0,0 @@
-# Vim / Neovim
-
-* [vim-go](#vimgo)
-* [LanguageClient-neovim](#lcneovim)
-* [Ale](#ale)
-* [vim-lsp](#vimlsp)
-* [vim-lsc](#vimlsc)
-* [coc.nvim](#cocnvim)
-* [govim](#govim)
-* [Neovim v0.5.0+](#neovim)
-  * [Installation](#neovim-install)
-  * [Custom Configuration](#neovim-config)
-  * [Imports](#neovim-imports)
-  * [Omnifunc](#neovim-omnifunc)
-  * [Additional Links](#neovim-links)
-
-## <a href="#vimgo" id="vimgo">vim-go</a>
-
-Use [vim-go] ver 1.20+, with the following configuration:
-
-```vim
-let g:go_def_mode='gopls'
-let g:go_info_mode='gopls'
-```
-
-## <a href="#lcneovim" id="lcneovim">LanguageClient-neovim</a>
-
-Use [LanguageClient-neovim], with the following configuration:
-
-```vim
-" Launch gopls when Go files are in use
-let g:LanguageClient_serverCommands = {
-       \ 'go': ['gopls']
-       \ }
-" Run gofmt on save
-autocmd BufWritePre *.go :call LanguageClient#textDocument_formatting_sync()
-```
-
-## <a href="#ale" id="ale">Ale</a>
-
-Use [ale]:
-
-```vim
-let g:ale_linters = {
-  \ 'go': ['gopls'],
-  \}
-```
-
-see [this issue][ale-issue-2179]
-
-## <a href="#vimlsp" id="vimlsp">vim-lsp</a>
-
-Use [prabirshrestha/vim-lsp], with the following configuration:
-
-```vim
-augroup LspGo
-  au!
-  autocmd User lsp_setup call lsp#register_server({
-      \ 'name': 'go-lang',
-      \ 'cmd': {server_info->['gopls']},
-      \ 'whitelist': ['go'],
-      \ })
-  autocmd FileType go setlocal omnifunc=lsp#complete
-  "autocmd FileType go nmap <buffer> gd <plug>(lsp-definition)
-  "autocmd FileType go nmap <buffer> ,n <plug>(lsp-next-error)
-  "autocmd FileType go nmap <buffer> ,p <plug>(lsp-previous-error)
-augroup END
-```
-
-## <a href="#vimlsc" id="vimlsc">vim-lsc</a>
-
-Use [natebosch/vim-lsc], with the following configuration:
-
-```vim
-let g:lsc_server_commands = {
-\  "go": {
-\    "command": "gopls serve",
-\    "log_level": -1,
-\    "suppress_stderr": v:true,
-\  },
-\}
-```
-
-The `log_level` and `suppress_stderr` parts are needed to prevent breakage from logging. See
-issues [#180](https://github.com/natebosch/vim-lsc/issues/180) and
-[#213](https://github.com/natebosch/vim-lsc/issues/213).
-
-## <a href="#cocnvim" id="cocnvim">coc.nvim</a>
-
-Use [coc.nvim], with the following `coc-settings.json` configuration:
-
-```json
-  "languageserver": {
-    "golang": {
-      "command": "gopls",
-      "rootPatterns": ["go.mod", ".vim/", ".git/", ".hg/"],
-      "filetypes": ["go"],
-      "initializationOptions": {
-        "usePlaceholders": true
-      }
-    }
-  }
-```
-
-Other [settings](settings.md) can be added in `initializationOptions` too.
-
-The `editor.action.organizeImport` code action will auto-format code and add missing imports. To run this automatically on save, add the following line to your `init.vim`:
-
-```vim
-autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport')
-```
-
-## <a href="#govim" id="govim">govim</a>
-
-In vim classic only, use the experimental [`govim`], simply follow the [install steps][govim-install].
-
-## <a href="#neovim" id="neovim">Neovim v0.5.0+</a>
-
-To use the new native LSP client in Neovim, make sure you
-[install][nvim-install] Neovim v.0.5.0+,
-the `nvim-lspconfig` configuration helper plugin, and check the
-[`gopls` configuration section][nvim-lspconfig] there.
-
-### <a href="#neovim-install" id="neovim-install">Installation</a>
-
-You can use Neovim's native plugin system.  On a Unix system, you can do that by
-cloning the `nvim-lspconfig` repository into the correct directory:
-
-```sh
-dir="${HOME}/.local/share/nvim/site/pack/nvim-lspconfig/opt/nvim-lspconfig/"
-mkdir -p "$dir"
-cd "$dir"
-git clone 'https://github.com/neovim/nvim-lspconfig.git' .
-```
-
-### <a href="#neovim-config" id="neovim-config">Custom Configuration</a>
-
-You can add custom configuration using Lua.  Here is an example of enabling the
-`unusedparams` check as well as `staticcheck`:
-
-```vim
-lua <<EOF
-  lspconfig = require "lspconfig"
-  lspconfig.gopls.setup {
-    cmd = {"gopls", "serve"},
-    settings = {
-      gopls = {
-        analyses = {
-          unusedparams = true,
-        },
-        staticcheck = true,
-      },
-    },
-  }
-EOF
-```
-
-### <a href="#neovim-imports" id="neovim-imports">Imports</a>
-
-To get your imports ordered on save, like `goimports` does, you can define
-a helper function in Lua:
-
-```vim
-lua <<EOF
-  -- …
-
-  function goimports(timeout_ms)
-    local context = { only = { "source.organizeImports" } }
-    vim.validate { context = { context, "t", true } }
-
-    local params = vim.lsp.util.make_range_params()
-    params.context = context
-
-    -- See the implementation of the textDocument/codeAction callback
-    -- (lua/vim/lsp/handler.lua) for how to do this properly.
-    local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, timeout_ms)
-    if not result or next(result) == nil then return end
-    local actions = result[1].result
-    if not actions then return end
-    local action = actions[1]
-
-    -- textDocument/codeAction can return either Command[] or CodeAction[]. If it
-    -- is a CodeAction, it can have either an edit, a command or both. Edits
-    -- should be executed first.
-    if action.edit or type(action.command) == "table" then
-      if action.edit then
-        vim.lsp.util.apply_workspace_edit(action.edit)
-      end
-      if type(action.command) == "table" then
-        vim.lsp.buf.execute_command(action.command)
-      end
-    else
-      vim.lsp.buf.execute_command(action)
-    end
-  end
-EOF
-
-autocmd BufWritePre *.go lua goimports(1000)
-```
-
-(Taken from the [discussion][nvim-lspconfig-imports] on Neovim issue tracker.)
-
-### <a href="#neovim-omnifunc" id="neovim-omnifunc">Omnifunc</a>
-
-To make your <kbd>Ctrl</kbd>+<kbd>x</kbd>,<kbd>Ctrl</kbd>+<kbd>o</kbd> work, add
-this to your `init.vim`:
-
-```vim
-autocmd FileType go setlocal omnifunc=v:lua.vim.lsp.omnifunc
-```
-
-### <a href="#neovim-links" id="neovim-links">Additional Links</a>
-
-* [Neovim's official LSP documentation][nvim-docs].
-
-[vim-go]: https://github.com/fatih/vim-go
-[LanguageClient-neovim]: https://github.com/autozimu/LanguageClient-neovim
-[ale]: https://github.com/w0rp/ale
-[ale-issue-2179]: https://github.com/w0rp/ale/issues/2179
-[prabirshrestha/vim-lsp]: https://github.com/prabirshrestha/vim-lsp/
-[natebosch/vim-lsc]: https://github.com/natebosch/vim-lsc/
-[natebosch/vim-lsc#180]: https://github.com/natebosch/vim-lsc/issues/180
-[coc.nvim]: https://github.com/neoclide/coc.nvim/
-[`govim`]: https://github.com/myitcv/govim
-[govim-install]: https://github.com/myitcv/govim/blob/master/README.md#govim---go-development-plugin-for-vim8
-[nvim-docs]: https://neovim.io/doc/user/lsp.html
-[nvim-install]: https://github.com/neovim/neovim/wiki/Installing-Neovim
-[nvim-lspconfig]: https://github.com/neovim/nvim-lspconfig/blob/master/doc/server_configurations.md#gopls
-[nvim-lspconfig-imports]: https://github.com/neovim/nvim-lspconfig/issues/115
diff -urN a/gopls/doc/workspace.md b/gopls/doc/workspace.md
--- a/gopls/doc/workspace.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/doc/workspace.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,75 +0,0 @@
-# Setting up your workspace
-
-`gopls` supports both Go module and GOPATH modes. However, it needs a defined
-scope in which language features like references, rename, and implementation
-should operate.
-
-The following options are available for configuring this scope:
-
-## Module mode
-
-### One module
-
-If you are working with a single module, you can open the module root (the
-directory containing the `go.mod` file), a subdirectory within the module,
-or a parent directory containing the module.
-
-**Note**: If you open a parent directory containing a module, it must **only**
-contain that single module. Otherwise, you are working with multiple modules.
-
-### Multiple modules
-
-As of Jan 2021, if you are working with multiple modules or nested modules, you
-will need to create a "workspace folder" for each module. This means that each
-module has its own scope, and features will not work across modules. We are
-currently working on addressing this limitation--see details about
-[experimental workspace module mode](#workspace-module-experimental)
-below.
-
-In VS Code, you can create a workspace folder by setting up a
-[multi-root workspace](https://code.visualstudio.com/docs/editor/multi-root-workspaces).
-View the [documentation for your editor plugin](../README.md#editor) to learn how to
-configure a workspace folder in your editor.
-
-#### Workspace module (experimental)
-
-Many `gopls` users would like to work with multiple modules at the same time
-([golang/go#32394](https://github.com/golang/go/issues/32394)), and
-specifically, have features that work across modules. We plan to add support
-for this via a concept called the "workspace module", which is described in
-[this design document](https://github.com/golang/proposal/blob/master/design/37720-gopls-workspaces.md).
-This feature works by creating a temporary module that requires all of your
-workspace modules, meaning all of their dependencies must be compatible.
-
-The workspace module feature is currently available as an opt-in experiment,
-and it will allow you to work with multiple modules without creating workspace
-folders for each module. You can try it out by configuring the
-[experimentalWorkspaceModule](settings.md#experimentalworkspacemodule-bool)
-setting. If you try it and encounter issues, please
-[report them](https://github.com/golang/go/issues/new) so we can address them
-before the feature is enabled by default.
-
-You can follow our progress on the workspace module work by looking at the
-open issues in the
-[gopls/workspace-module milestone](https://github.com/golang/go/milestone/179).
-
-### GOPATH mode
-
-When opening a directory within your GOPATH, the workspace scope will be just
-that directory.
-
-### At your own risk
-
-Some users or companies may have projects that encompass one `$GOPATH`. If you
-open your entire `$GOPATH` or `$GOPATH/src` folder, the workspace scope will be
-your entire `GOPATH`. If your GOPATH is large, `gopls` to be very slow to start
-because it will try to find all of the Go files in the directory you have
-opened. It will then load all of the files it has found.
-
-To work around this case, you can create a new `$GOPATH` that contains only the
-packages you want to work on.
-
----
-
-If you have additional use cases that are not mentioned above, please
-[file a new issue](https://github.com/golang/go/issues/new).
diff -urN a/gopls/go.mod b/gopls/go.mod
--- a/gopls/go.mod	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/go.mod	1969-12-31 16:00:00.000000000 -0800
@@ -1,26 +0,0 @@
-module golang.org/x/tools/gopls
-
-go 1.18
-
-require (
-	github.com/google/go-cmp v0.5.6
-	github.com/jba/printsrc v0.2.2
-	github.com/jba/templatecheck v0.6.0
-	github.com/sergi/go-diff v1.1.0
-	golang.org/x/mod v0.5.1
-	golang.org/x/sys v0.0.0-20211019181941-9d821ace8654
-	golang.org/x/tools v0.1.7
-	honnef.co/go/tools v0.2.1
-	mvdan.cc/gofumpt v0.1.1
-	mvdan.cc/xurls/v2 v2.3.0
-)
-
-require (
-	github.com/BurntSushi/toml v0.4.1 // indirect
-	github.com/google/safehtml v0.0.2 // indirect
-	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
-	golang.org/x/text v0.3.7 // indirect
-	golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
-)
-
-replace golang.org/x/tools => ../
diff -urN a/gopls/go.sum b/gopls/go.sum
--- a/gopls/go.sum	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/go.sum	1969-12-31 16:00:00.000000000 -0800
@@ -1,67 +0,0 @@
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
-github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
-github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/safehtml v0.0.2 h1:ZOt2VXg4x24bW0m2jtzAOkhoXV0iM8vNKc0paByCZqM=
-github.com/google/safehtml v0.0.2/go.mod h1:L4KWwDsUJdECRAEpZoBn3O64bQaywRscowZjJAzjHnU=
-github.com/jba/printsrc v0.2.2 h1:9OHK51UT+/iMAEBlQIIXW04qvKyF3/vvLuwW/hL8tDU=
-github.com/jba/printsrc v0.2.2/go.mod h1:1xULjw59sL0dPdWpDoVU06TIEO/Wnfv6AHRpiElTwYM=
-github.com/jba/templatecheck v0.6.0 h1:SwM8C4hlK/YNLsdcXStfnHWE2HKkuTVwy5FKQHt5ro8=
-github.com/jba/templatecheck v0.6.0/go.mod h1:/1k7EajoSErFI9GLHAsiIJEaNLt3ALKNw2TV7z2SYv4=
-github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
-github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
-github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
-github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
-github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/rogpeppe/go-internal v1.6.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
-github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
-github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
-github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
-github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
-golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
-golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
-golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
-golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
-golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
-golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
-golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
-golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
-gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I=
-gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-honnef.co/go/tools v0.2.1 h1:/EPr//+UMMXwMTkXvCCoaJDq8cpjMO80Ou+L4PDo2mY=
-honnef.co/go/tools v0.2.1/go.mod h1:lPVVZ2BS5TfnjLyizF7o7hv7j9/L+8cZY2hLyjP9cGY=
-mvdan.cc/gofumpt v0.1.1 h1:bi/1aS/5W00E2ny5q65w9SnKpWEF/UIOqDYBILpo9rA=
-mvdan.cc/gofumpt v0.1.1/go.mod h1:yXG1r1WqZVKWbVRtBWKWX9+CxGYfA51nSomhM0woR48=
-mvdan.cc/xurls/v2 v2.3.0 h1:59Olnbt67UKpxF1EwVBopJvkSUBmgtb468E4GVWIZ1I=
-mvdan.cc/xurls/v2 v2.3.0/go.mod h1:AjuTy7gEiUArFMjgBBDU4SMxlfUYsRokpJQgNWOt3e4=
diff -urN a/gopls/integration/govim/Dockerfile b/gopls/integration/govim/Dockerfile
--- a/gopls/integration/govim/Dockerfile	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/integration/govim/Dockerfile	1969-12-31 16:00:00.000000000 -0800
@@ -1,16 +0,0 @@
-# Copyright 2019 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# govim requires a more recent version of vim than is available in most
-# distros, so we build from their base image.
-FROM govim/govim:latest-vim
-ARG GOVIM_REF
-
-ENV GOPROXY=https://proxy.golang.org GOPATH=/go VIM_FLAVOR=vim
-WORKDIR /src
-
-# Clone govim. In order to use the go command for resolving latest, we download
-# a redundant copy of govim to the build cache using `go mod download`.
-RUN git clone https://github.com/govim/govim /src/govim && cd /src/govim && \
-    git checkout $GOVIM_REF
diff -urN a/gopls/integration/govim/README.md b/gopls/integration/govim/README.md
--- a/gopls/integration/govim/README.md	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/integration/govim/README.md	1969-12-31 16:00:00.000000000 -0800
@@ -1,47 +0,0 @@
-# govim integration tests
-
-Files in this directory configure Cloud Build to run [govim] integration tests
-against a gopls binary built from source.
-
-## Running on GCP
-
-To run these integration tests in Cloud Build, use the following steps.  Here
-we assume that `$PROJECT_ID` is a valid GCP project and `$BUCKET` is a cloud
-storage bucket owned by that project.
-
-- `cd` to the root directory of the tools project.
-- (at least once per GCP project) Build the test harness:
-```
-$ gcloud builds submit \
-	--project="${PROJECT_ID}" \
-	--config=gopls/integration/govim/cloudbuild.harness.yaml
-```
-- Run the integration tests:
-```
-$ gcloud builds submit \
-	--project="${PROJECT_ID}" \
-	--config=gopls/integration/govim/cloudbuild.yaml \
-	--substitutions=_RESULT_BUCKET="${BUCKET}"
-```
-
-## Fetching Artifacts
-
-Assuming the artifacts bucket is world readable, you can fetch integration from
-GCS. They are located at:
-
-- logs: `https://storage.googleapis.com/${BUCKET}/log-${EVALUATION_ID}.txt`
-- artifact tarball: `https://storage.googleapis.com/${BUCKET}/govim/${EVALUATION_ID}/artifacts.tar.gz`
-
-The `artifacts.go` command can be used to fetch both artifacts using an
-evaluation id.
-
-## Running locally
-
-Run `gopls/integration/govim/run_local.sh`. This may take a while the first
-time it is run, as it will require building the test harness. This script
-accepts two flags to modify its behavior:
-
-**--sudo**: run docker with `sudo`
-**--short**: run `go test -short`
-
-[govim]: https://github.com/govim/govim
diff -urN a/gopls/integration/govim/artifacts.go b/gopls/integration/govim/artifacts.go
--- a/gopls/integration/govim/artifacts.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/integration/govim/artifacts.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,67 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package main
-
-import (
-	"flag"
-	"fmt"
-	"io/ioutil"
-	"net/http"
-	"os"
-	"path"
-)
-
-var bucket = flag.String("bucket", "golang-gopls_integration_tests", "GCS bucket holding test artifacts.")
-
-const usage = `
-artifacts [--bucket=<bucket ID>] <cloud build evaluation ID>
-
-Fetch artifacts from an integration test run. Evaluation ID should be extracted
-from the cloud build notification.
-
-In order for this to work, the GCS bucket that artifacts were written to must
-be publicly readable. By default, this fetches from the
-golang-gopls_integration_tests bucket.
-`
-
-func main() {
-	flag.Usage = func() {
-		fmt.Fprint(flag.CommandLine.Output(), usage)
-	}
-	flag.Parse()
-	if flag.NArg() != 1 {
-		flag.Usage()
-		os.Exit(2)
-	}
-	evalID := flag.Arg(0)
-	logURL := fmt.Sprintf("https://storage.googleapis.com/%s/log-%s.txt", *bucket, evalID)
-	if err := download(logURL); err != nil {
-		fmt.Fprintf(os.Stderr, "downloading logs: %v", err)
-	}
-	tarURL := fmt.Sprintf("https://storage.googleapis.com/%s/govim/%s/artifacts.tar.gz", *bucket, evalID)
-	if err := download(tarURL); err != nil {
-		fmt.Fprintf(os.Stderr, "downloading artifact tarball: %v", err)
-	}
-}
-
-func download(artifactURL string) error {
-	name := path.Base(artifactURL)
-	resp, err := http.Get(artifactURL)
-	if err != nil {
-		return fmt.Errorf("fetching from GCS: %v", err)
-	}
-	defer resp.Body.Close()
-	if resp.StatusCode != http.StatusOK {
-		return fmt.Errorf("got status code %d from GCS", resp.StatusCode)
-	}
-	data, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		return fmt.Errorf("reading result: %v", err)
-	}
-	if err := ioutil.WriteFile(name, data, 0644); err != nil {
-		return fmt.Errorf("writing artifact: %v", err)
-	}
-	return nil
-}
diff -urN a/gopls/integration/govim/cloudbuild.harness.yaml b/gopls/integration/govim/cloudbuild.harness.yaml
--- a/gopls/integration/govim/cloudbuild.harness.yaml	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/integration/govim/cloudbuild.harness.yaml	1969-12-31 16:00:00.000000000 -0800
@@ -1,21 +0,0 @@
-# Copyright 2019 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Build the govim test harness that will be used to run govim integration tests
-# for gopls. See README.md for instructions on how to use this.
-steps:
-  - name: 'gcr.io/cloud-builders/docker'
-    args: ['build',
-      # To allow for breaking changes to this test harness, tag with a major
-      # version number.
-      '-t', 'gcr.io/$PROJECT_ID/govim-harness:latest',
-      '-t', 'gcr.io/$PROJECT_ID/govim-harness:3',
-      # It is assumed that this build is running from the root directory of the
-      # tools repository.
-      '-f', 'gopls/integration/govim/Dockerfile',
-      # Use the integration test directory as build context: the test harness
-      # doesn't actually require any local files.
-      'gopls/integration/govim']
-images:
-  - gcr.io/$PROJECT_ID/govim-harness
diff -urN a/gopls/integration/govim/cloudbuild.yaml b/gopls/integration/govim/cloudbuild.yaml
--- a/gopls/integration/govim/cloudbuild.yaml	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/integration/govim/cloudbuild.yaml	1969-12-31 16:00:00.000000000 -0800
@@ -1,51 +0,0 @@
-# Copyright 2019 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Build gopls, and run the govim integration tests.  See README.md for
-# instructions on how to use this.
-
-substitutions:
-  # This bucket must be owned by the GCP project executing the build. If
-  # you are running this from your own project, override using --substitutions.
-  _RESULT_BUCKET: 'golang-gopls_integration_tests'
-
-steps:
-  # Build gopls from source, to use with the govim integration tests.
-  - name: 'golang:1.14'
-    env: ['GOPROXY=https://proxy.golang.org']
-    dir: 'gopls'
-    args: ['go', 'build']
-
-  # Run the tests. Note that the script in this step does not return the exit
-  # code from `go test`, but rather saves it for use in the final step after
-  # uploading artifacts.
-  - name: 'gcr.io/$PROJECT_ID/govim-harness:3'
-    dir: '/src/govim'
-    volumes:
-      - name: artifacts
-        path: /artifacts
-    env:
-      - GOVIM_TESTSCRIPT_WORKDIR_ROOT=/artifacts
-      - VIM_FLAVOR=vim
-    args: ['/workspace/gopls/integration/govim/run_tests_for_cloudbuild.sh']
-
-  # The govim tests produce a large number of artifacts; tarball/gzip to reduce
-  # roundtrips and save space.
-  - name: 'ubuntu'
-    volumes:
-      - name: artifacts
-        path: /artifacts
-    args: ['tar', '-czf', 'artifacts.tar.gz', '/artifacts']
-
-  # Upload artifacts to GCS.
-  - name: 'gcr.io/cloud-builders/gsutil'
-    args: ['cp', 'artifacts.tar.gz', 'gs://${_RESULT_BUCKET}/govim/${BUILD_ID}/artifacts.tar.gz']
-
-  # Exit with the actual exit code of the integration tests.
-  - name: 'ubuntu'
-    args: ['bash', 'govim_test_result.sh']
-
-# Write build logs to the same bucket as artifacts, so they can be more easily
-# shared.
-logsBucket: 'gs://${_RESULT_BUCKET}'
diff -urN a/gopls/integration/govim/run_local.sh b/gopls/integration/govim/run_local.sh
--- a/gopls/integration/govim/run_local.sh	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/integration/govim/run_local.sh	1969-12-31 16:00:00.000000000 -0800
@@ -1,96 +0,0 @@
-#!/bin/bash -e
-
-# Copyright 2019 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# Run govim integration tests against a local gopls.
-
-usage() {
-  cat <<EOUSAGE
-Usage: $0 [--sudo] [--short] [--version (semver|latest)]
-
-Args:
-  --sudo     run docker with sudo
-  --short    run `go test` with `-short`
-  --version  run on the specific tagged Go version (or latest) rather
-             than the default branch
-
-Run govim tests against HEAD using local docker.
-EOUSAGE
-}
-
-SUDO_IF_NEEDED=
-TEST_SHORT=
-DOCKERFILE=gopls/integration/govim/Dockerfile
-GOVIM_REF=main
-while [[ $# -gt 0 ]]; do
-  case "$1" in
-    "-h" | "--help" | "help")
-      usage
-      exit 0
-      ;;
-    "--sudo")
-      SUDO_IF_NEEDED="sudo "
-      shift
-      ;;
-    "--short")
-      TEST_SHORT="-short"
-      shift
-      ;;
-    "--version")
-      if [[ -z "$2" ]]; then
-        usage
-        exit 1
-      fi
-      GOVIM_REF=$2
-      if [[ "${GOVIM_REF}" == "latest" ]]; then
-        TMPGOPATH=$(mktemp -d)
-        trap "GOPATH=${TMPGOPATH} go clean -modcache && rm -r ${TMPGOPATH}" EXIT
-        GOVIM_REF=$(GOPATH=${TMPGOPATH} go mod download -json \
-          github.com/govim/govim@latest | jq -r .Version)
-      fi
-      shift 2
-      ;;
-    *)
-      usage
-      exit 1
-  esac
-done
-
-# Find the tools root, so that this script can be run from any directory.
-script_dir=$(dirname "$(readlink -f "$0")")
-tools_dir=$(readlink -f "${script_dir}/../../..")
-
-# Build gopls.
-cd "${tools_dir}/gopls"
-temp_gopls=$(mktemp -p "$PWD")
-trap "rm -f \"${temp_gopls}\"" EXIT
-# For consistency across environments, use golang docker to build rather than
-# the local go command.
-${SUDO_IF_NEEDED}docker run --rm -t \
-  -v "${tools_dir}:/src/tools" \
-  -w "/src/tools/gopls" \
-  golang:latest \
-  go build -o $(basename ${temp_gopls})
-
-# Build the test harness. Here we are careful to pass in a very limited build
-# context so as to optimize caching.
-echo "Checking out govim@${GOVIM_REF}"
-cd "${tools_dir}"
-${SUDO_IF_NEEDED}docker build \
-  --build-arg GOVIM_REF="${GOVIM_REF}" \
-  -t gopls-govim-harness:${GOVIM_REF} \
-  -f gopls/integration/govim/Dockerfile \
-  gopls/integration/govim
-
-# Run govim integration tests.
-echo "running govim integration tests using ${temp_gopls}"
-temp_gopls_name=$(basename "${temp_gopls}")
-${SUDO_IF_NEEDED}docker run --rm -t \
-  -v "${tools_dir}:/src/tools" \
-  -w "/src/govim" \
-  --ulimit memlock=-1:-1 \
-  gopls-govim-harness:${GOVIM_REF} \
-  go test ${TEST_SHORT} ./cmd/govim \
-    -gopls "/src/tools/gopls/${temp_gopls_name}"
diff -urN a/gopls/integration/govim/run_tests_for_cloudbuild.sh b/gopls/integration/govim/run_tests_for_cloudbuild.sh
--- a/gopls/integration/govim/run_tests_for_cloudbuild.sh	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/integration/govim/run_tests_for_cloudbuild.sh	1969-12-31 16:00:00.000000000 -0800
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-# Copyright 2020 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-# This script runs govim integration tests but always succeeds, instead writing
-# their result to a file so that any test failure can be deferred to a later
-# build step. We do this so that we can capture govim test artifacts regardless
-# of the test results.
-
-# Substitute the locally built gopls binary for use in govim integration tests.
-go test -short ./cmd/govim -gopls /workspace/gopls/gopls
-
-# Stash the error, for use in a later build step.
-echo "exit $?" > /workspace/govim_test_result.sh
-
-# Clean up unnecessary artifacts. This is based on govim/_scripts/tidyUp.bash.
-# Since we're fetching govim using the go command, we won't have this non-go
-# source directory available to us.
-if [[ -n "$GOVIM_TESTSCRIPT_WORKDIR_ROOT" ]]; then
-  echo "Cleaning up build artifacts..."
-  # Make artifacts writable so that rm -rf doesn't complain.
-  chmod -R u+w "$GOVIM_TESTSCRIPT_WORKDIR_ROOT"
-
-  # Remove directories we don't care about.
-  find "$GOVIM_TESTSCRIPT_WORKDIR_ROOT" -type d \( -name .vim -o -name gopath \) -prune -exec rm -rf '{}' \;
-fi
diff -urN a/gopls/internal/coverage/coverage.go b/gopls/internal/coverage/coverage.go
--- a/gopls/internal/coverage/coverage.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/coverage/coverage.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,261 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build go.1.16
-// +build go.1.16
-
-// Running this program in the tools directory will produce a coverage file /tmp/cover.out
-// and a coverage report for all the packages under internal/lsp, accumulated by all the tests
-// under gopls.
-//
-// -o controls where the coverage file is written, defaulting to /tmp/cover.out
-// -i coverage-file will generate the report from an existing coverage file
-// -v controls verbosity (0: only report coverage, 1: report as each directory is finished,
-//      2: report on each test, 3: more details, 4: too much)
-// -t tests only tests packages in the given comma-separated list of directories in gopls.
-//      The names should start with ., as in ./internal/regtest/bench
-// -run tests. If set, -run tests is passed on to the go test command.
-//
-// Despite gopls' use of goroutines, the counts are almost deterministic.
-package main
-
-import (
-	"bytes"
-	"encoding/json"
-	"flag"
-	"fmt"
-	"log"
-	"os"
-	"os/exec"
-	"path/filepath"
-	"sort"
-	"strings"
-	"time"
-
-	"golang.org/x/tools/cover"
-)
-
-var (
-	proFile = flag.String("i", "", "existing profile file")
-	outFile = flag.String("o", "/tmp/cover.out", "where to write the coverage file")
-	verbose = flag.Int("v", 0, "how much detail to print as tests are running")
-	tests   = flag.String("t", "", "list of tests to run")
-	run     = flag.String("run", "", "value of -run to pass to go test")
-)
-
-func main() {
-	log.SetFlags(log.Lshortfile)
-	flag.Parse()
-
-	if *proFile != "" {
-		report(*proFile)
-		return
-	}
-
-	checkCwd()
-	// find the packages under gopls containing tests
-	tests := listDirs("gopls")
-	tests = onlyTests(tests)
-	tests = realTestName(tests)
-
-	// report coverage for packages under internal/lsp
-	parg := "golang.org/x/tools/internal/lsp/..."
-
-	accum := []string{}
-	seen := make(map[string]bool)
-	now := time.Now()
-	for _, toRun := range tests {
-		if excluded(toRun) {
-			continue
-		}
-		x := runTest(toRun, parg)
-		if *verbose > 0 {
-			fmt.Printf("finished %s %.1fs\n", toRun, time.Since(now).Seconds())
-		}
-		lines := bytes.Split(x, []byte{'\n'})
-		for _, l := range lines {
-			if len(l) == 0 {
-				continue
-			}
-			if !seen[string(l)] {
-				// not accumulating counts, so only works for mode:set
-				seen[string(l)] = true
-				accum = append(accum, string(l))
-			}
-		}
-	}
-	sort.Strings(accum[1:])
-	if err := os.WriteFile(*outFile, []byte(strings.Join(accum, "\n")), 0644); err != nil {
-		log.Print(err)
-	}
-	report(*outFile)
-}
-
-type result struct {
-	Time    time.Time
-	Test    string
-	Action  string
-	Package string
-	Output  string
-	Elapsed float64
-}
-
-func runTest(tName, parg string) []byte {
-	args := []string{"test", "-short", "-coverpkg", parg, "-coverprofile", *outFile,
-		"-json"}
-	if *run != "" {
-		args = append(args, fmt.Sprintf("-run=%s", *run))
-	}
-	args = append(args, tName)
-	cmd := exec.Command("go", args...)
-	cmd.Dir = "./gopls"
-	ans, err := cmd.Output()
-	if *verbose > 1 {
-		got := strings.Split(string(ans), "\n")
-		for _, g := range got {
-			if g == "" {
-				continue
-			}
-			var m result
-			if err := json.Unmarshal([]byte(g), &m); err != nil {
-				log.Printf("%T/%v", err, err) // shouldn't happen
-				continue
-			}
-			maybePrint(m)
-		}
-	}
-	if err != nil {
-		log.Printf("%s: %q, cmd=%s", tName, ans, cmd.String())
-	}
-	buf, err := os.ReadFile(*outFile)
-	if err != nil {
-		log.Fatal(err)
-	}
-	return buf
-}
-
-func report(fn string) {
-	profs, err := cover.ParseProfiles(fn)
-	if err != nil {
-		log.Fatal(err)
-	}
-	for _, p := range profs {
-		statements, counts := 0, 0
-		for _, x := range p.Blocks {
-			statements += x.NumStmt
-			if x.Count != 0 {
-				counts += x.NumStmt // sic: if any were executed, all were
-			}
-		}
-		pc := 100 * float64(counts) / float64(statements)
-		fmt.Printf("%3.0f%% %3d/%3d %s\n", pc, counts, statements, p.FileName)
-	}
-}
-
-var todo []string // tests to run
-
-func excluded(tname string) bool {
-	if *tests == "" { // run all tests
-		return false
-	}
-	if todo == nil {
-		todo = strings.Split(*tests, ",")
-	}
-	for _, nm := range todo {
-		if tname == nm { // run this test
-			return false
-		}
-	}
-	// not in list, skip it
-	return true
-}
-
-// should m.Package be printed sometime?
-func maybePrint(m result) {
-	switch m.Action {
-	case "pass", "fail", "skip":
-		fmt.Printf("%s %s %.3f\n", m.Action, m.Test, m.Elapsed)
-	case "run":
-		if *verbose > 2 {
-			fmt.Printf("%s %s %.3f\n", m.Action, m.Test, m.Elapsed)
-		}
-	case "output":
-		if *verbose > 3 {
-			fmt.Printf("%s %s %q %.3f\n", m.Action, m.Test, m.Output, m.Elapsed)
-		}
-	default:
-		log.Fatalf("unknown action %s\n", m.Action)
-	}
-}
-
-// return only the directories that contain tests
-func onlyTests(s []string) []string {
-	ans := []string{}
-outer:
-	for _, d := range s {
-		files, err := os.ReadDir(d)
-		if err != nil {
-			log.Fatalf("%s: %v", d, err)
-		}
-		for _, de := range files {
-			if strings.Contains(de.Name(), "_test.go") {
-				ans = append(ans, d)
-				continue outer
-			}
-		}
-	}
-	return ans
-}
-
-// replace the prefix gopls/ with ./ as the tests are run in the gopls directory
-func realTestName(p []string) []string {
-	ans := []string{}
-	for _, x := range p {
-		x = x[len("gopls/"):]
-		ans = append(ans, "./"+x)
-	}
-	return ans
-}
-
-// make sure we start in a tools directory
-func checkCwd() {
-	dir, err := os.Getwd()
-	if err != nil {
-		log.Fatal(err)
-	}
-	// we expect to be a the root of golang.org/x/tools
-	cmd := exec.Command("go", "list", "-m", "-f", "{{.Dir}}", "golang.org/x/tools")
-	buf, err := cmd.Output()
-	buf = bytes.Trim(buf, "\n \t") // remove \n at end
-	if err != nil {
-		log.Fatal(err)
-	}
-	if string(buf) != dir {
-		log.Fatalf("wrong directory: in %q, should be in %q", dir, string(buf))
-	}
-	// and we expect gopls and internal/lsp as subdirectories
-	_, err = os.Stat("gopls")
-	if err != nil {
-		log.Fatalf("expected a gopls directory, %v", err)
-	}
-	_, err = os.Stat("internal/lsp")
-	if err != nil {
-		log.Fatalf("expected to see internal/lsp, %v", err)
-	}
-}
-
-func listDirs(dir string) []string {
-	ans := []string{}
-	f := func(path string, dirEntry os.DirEntry, err error) error {
-		if strings.HasSuffix(path, "/testdata") || strings.HasSuffix(path, "/typescript") {
-			return filepath.SkipDir
-		}
-		if dirEntry.IsDir() {
-			ans = append(ans, path)
-		}
-		return nil
-	}
-	filepath.WalkDir(dir, f)
-	return ans
-}
diff -urN a/gopls/internal/hooks/analysis.go b/gopls/internal/hooks/analysis.go
--- a/gopls/internal/hooks/analysis.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/analysis.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,60 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build go1.15
-// +build go1.15
-
-package hooks
-
-import (
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/lsp/source"
-	"honnef.co/go/tools/analysis/lint"
-	"honnef.co/go/tools/quickfix"
-	"honnef.co/go/tools/simple"
-	"honnef.co/go/tools/staticcheck"
-	"honnef.co/go/tools/stylecheck"
-)
-
-func updateAnalyzers(options *source.Options) {
-	mapSeverity := func(severity lint.Severity) protocol.DiagnosticSeverity {
-		switch severity {
-		case lint.SeverityError:
-			return protocol.SeverityError
-		case lint.SeverityDeprecated:
-			// TODO(dh): in LSP, deprecated is a tag, not a severity.
-			//   We'll want to support this once we enable SA5011.
-			return protocol.SeverityWarning
-		case lint.SeverityWarning:
-			return protocol.SeverityWarning
-		case lint.SeverityInfo:
-			return protocol.SeverityInformation
-		case lint.SeverityHint:
-			return protocol.SeverityHint
-		default:
-			return protocol.SeverityWarning
-		}
-	}
-	add := func(analyzers []*lint.Analyzer, skip map[string]struct{}) {
-		for _, a := range analyzers {
-			if _, ok := skip[a.Analyzer.Name]; ok {
-				continue
-			}
-
-			enabled := !a.Doc.NonDefault
-			options.AddStaticcheckAnalyzer(a.Analyzer, enabled, mapSeverity(a.Doc.Severity))
-		}
-	}
-
-	add(simple.Analyzers, nil)
-	add(staticcheck.Analyzers, map[string]struct{}{
-		// This check conflicts with the vet printf check (golang/go#34494).
-		"SA5009": {},
-		// This check relies on facts from dependencies, which
-		// we don't currently compute.
-		"SA5011": {},
-	})
-	add(stylecheck.Analyzers, nil)
-	add(quickfix.Analyzers, nil)
-}
diff -urN a/gopls/internal/hooks/analysis_115.go b/gopls/internal/hooks/analysis_115.go
--- a/gopls/internal/hooks/analysis_115.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/analysis_115.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,12 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:build !go1.15
-// +build !go1.15
-
-package hooks
-
-import "golang.org/x/tools/internal/lsp/source"
-
-func updateAnalyzers(_ *source.Options) {}
diff -urN a/gopls/internal/hooks/diff.go b/gopls/internal/hooks/diff.go
--- a/gopls/internal/hooks/diff.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/diff.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,41 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hooks
-
-import (
-	"fmt"
-
-	"github.com/sergi/go-diff/diffmatchpatch"
-	"golang.org/x/tools/internal/lsp/diff"
-	"golang.org/x/tools/internal/span"
-)
-
-func ComputeEdits(uri span.URI, before, after string) (edits []diff.TextEdit, err error) {
-	// The go-diff library has an unresolved panic (see golang/go#278774).
-	// TODO(rstambler): Remove the recover once the issue has been fixed
-	// upstream.
-	defer func() {
-		if r := recover(); r != nil {
-			edits = nil
-			err = fmt.Errorf("unable to compute edits for %s: %s", uri.Filename(), r)
-		}
-	}()
-	diffs := diffmatchpatch.New().DiffMain(before, after, true)
-	edits = make([]diff.TextEdit, 0, len(diffs))
-	offset := 0
-	for _, d := range diffs {
-		start := span.NewPoint(0, 0, offset)
-		switch d.Type {
-		case diffmatchpatch.DiffDelete:
-			offset += len(d.Text)
-			edits = append(edits, diff.TextEdit{Span: span.New(uri, start, span.NewPoint(0, 0, offset))})
-		case diffmatchpatch.DiffEqual:
-			offset += len(d.Text)
-		case diffmatchpatch.DiffInsert:
-			edits = append(edits, diff.TextEdit{Span: span.New(uri, start, span.Point{}), NewText: d.Text})
-		}
-	}
-	return edits, nil
-}
diff -urN a/gopls/internal/hooks/diff_test.go b/gopls/internal/hooks/diff_test.go
--- a/gopls/internal/hooks/diff_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/diff_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,16 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hooks_test
-
-import (
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	"golang.org/x/tools/internal/lsp/diff/difftest"
-)
-
-func TestDiff(t *testing.T) {
-	difftest.DiffTest(t, hooks.ComputeEdits)
-}
diff -urN a/gopls/internal/hooks/gen-licenses.sh b/gopls/internal/hooks/gen-licenses.sh
--- a/gopls/internal/hooks/gen-licenses.sh	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/gen-licenses.sh	1969-12-31 16:00:00.000000000 -0800
@@ -1,38 +0,0 @@
-#!/bin/bash -eu
-
-# Copyright 2020 The Go Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style
-# license that can be found in the LICENSE file.
-
-set -o pipefail
-
-output=$1
-tempfile=$(mktemp)
-cd $(dirname $0)
-
-cat > $tempfile <<END
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate ./gen-licenses.sh licenses.go
-package hooks
-
-const licensesText = \`
-END
-
-# List all the modules gopls depends on, except other golang.org modules, which
-# are known to have the same license.
-mods=$(go list -deps -f '{{with .Module}}{{.Path}}{{end}}' golang.org/x/tools/gopls | sort -u | grep -v golang.org)
-for mod in $mods; do
-  # Find the license file, either LICENSE or COPYING, and add it to the result.
-  dir=$(go list -m -f {{.Dir}} $mod)
-  license=$(ls -1 $dir | egrep -i '^(LICENSE|COPYING)$')
-  echo "-- $mod $license --" >> $tempfile
-  echo >> $tempfile
-  sed 's/^-- / &/' $dir/$license >> $tempfile
-  echo >> $tempfile
-done
-
-echo "\`" >> $tempfile
-mv $tempfile $output
\ No newline at end of file
diff -urN a/gopls/internal/hooks/hooks.go b/gopls/internal/hooks/hooks.go
--- a/gopls/internal/hooks/hooks.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/hooks.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,37 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Package hooks adds all the standard gopls implementations.
-// This can be used in tests without needing to use the gopls main, and is
-// also the place to edit for custom builds of gopls.
-package hooks // import "golang.org/x/tools/gopls/internal/hooks"
-
-import (
-	"context"
-	"regexp"
-
-	"golang.org/x/tools/internal/lsp/source"
-	"mvdan.cc/gofumpt/format"
-	"mvdan.cc/xurls/v2"
-)
-
-func Options(options *source.Options) {
-	options.LicensesText = licensesText
-	if options.GoDiff {
-		options.ComputeEdits = ComputeEdits
-	}
-	options.URLRegexp = relaxedFullWord
-	options.GofumptFormat = func(ctx context.Context, src []byte) ([]byte, error) {
-		return format.Source(src, format.Options{})
-	}
-	updateAnalyzers(options)
-}
-
-var relaxedFullWord *regexp.Regexp
-
-// Ensure links are matched as full words, not anywhere.
-func init() {
-	relaxedFullWord = regexp.MustCompile(`\b(` + xurls.Relaxed().String() + `)\b`)
-	relaxedFullWord.Longest()
-}
diff -urN a/gopls/internal/hooks/licenses.go b/gopls/internal/hooks/licenses.go
--- a/gopls/internal/hooks/licenses.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/licenses.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,169 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-//go:generate ./gen-licenses.sh licenses.go
-package hooks
-
-const licensesText = `
--- github.com/BurntSushi/toml COPYING --
-
-The MIT License (MIT)
-
-Copyright (c) 2013 TOML authors
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
--- github.com/google/go-cmp LICENSE --
-
-Copyright (c) 2017 The Go Authors. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-   * Neither the name of Google Inc. nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--- github.com/sergi/go-diff LICENSE --
-
-Copyright (c) 2012-2016 The go-diff Authors. All rights reserved.
-
-Permission is hereby granted, free of charge, to any person obtaining a
-copy of this software and associated documentation files (the "Software"),
-to deal in the Software without restriction, including without limitation
-the rights to use, copy, modify, merge, publish, distribute, sublicense,
-and/or sell copies of the Software, and to permit persons to whom the
-Software is furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-DEALINGS IN THE SOFTWARE.
-
-
--- honnef.co/go/tools LICENSE --
-
-Copyright (c) 2016 Dominik Honnef
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
--- mvdan.cc/gofumpt LICENSE --
-
-Copyright (c) 2019, Daniel Martí. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-   * Neither the name of the copyright holder nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
--- mvdan.cc/xurls/v2 LICENSE --
-
-Copyright (c) 2015, Daniel Martí. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions are
-met:
-
-   * Redistributions of source code must retain the above copyright
-notice, this list of conditions and the following disclaimer.
-   * Redistributions in binary form must reproduce the above
-copyright notice, this list of conditions and the following disclaimer
-in the documentation and/or other materials provided with the
-distribution.
-   * Neither the name of the copyright holder nor the names of its
-contributors may be used to endorse or promote products derived from
-this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-`
diff -urN a/gopls/internal/hooks/licenses_test.go b/gopls/internal/hooks/licenses_test.go
--- a/gopls/internal/hooks/licenses_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/hooks/licenses_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,46 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package hooks
-
-import (
-	"bytes"
-	"io/ioutil"
-	"os/exec"
-	"runtime"
-	"testing"
-
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestLicenses(t *testing.T) {
-	// License text differs for older Go versions because staticcheck isn't
-	// supported for those versions.
-	testenv.NeedsGo1Point(t, 15)
-
-	if runtime.GOOS != "linux" && runtime.GOOS != "darwin" {
-		t.Skip("generating licenses only works on Unixes")
-	}
-	tmp, err := ioutil.TempFile("", "")
-	if err != nil {
-		t.Fatal(err)
-	}
-	tmp.Close()
-
-	if out, err := exec.Command("./gen-licenses.sh", tmp.Name()).CombinedOutput(); err != nil {
-		t.Fatalf("generating licenses failed: %q, %v", out, err)
-	}
-
-	got, err := ioutil.ReadFile(tmp.Name())
-	if err != nil {
-		t.Fatal(err)
-	}
-	want, err := ioutil.ReadFile("licenses.go")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !bytes.Equal(got, want) {
-		t.Error("combined license text needs updating. Run: `go generate ./internal/hooks` from the gopls module.")
-	}
-}
diff -urN a/gopls/internal/regtest/bench/bench_test.go b/gopls/internal/regtest/bench/bench_test.go
--- a/gopls/internal/regtest/bench/bench_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/bench/bench_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,190 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bench
-
-import (
-	"flag"
-	"fmt"
-	"os"
-	"runtime/pprof"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	"golang.org/x/tools/internal/lsp/fake"
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-func benchmarkOptions(dir string) []RunOption {
-	return []RunOption{
-		// Run in an existing directory, since we're trying to simulate known cases
-		// that cause gopls memory problems.
-		InExistingDir(dir),
-		// Skip logs as they buffer up memory unnaturally.
-		SkipLogs(),
-		// The Debug server only makes sense if running in singleton mode.
-		Modes(Singleton),
-		// Remove the default timeout. Individual tests should control their
-		// own graceful termination.
-		NoDefaultTimeout(),
-
-		// Use the actual proxy, since we want our builds to succeed.
-		GOPROXY("https://proxy.golang.org"),
-	}
-}
-
-func printBenchmarkResults(result testing.BenchmarkResult) {
-	fmt.Printf("BenchmarkStatistics\t%s\t%s\n", result.String(), result.MemString())
-}
-
-var iwlOptions struct {
-	workdir string
-}
-
-func init() {
-	flag.StringVar(&iwlOptions.workdir, "iwl_workdir", "", "if set, run IWL benchmark in this directory")
-}
-
-func TestBenchmarkIWL(t *testing.T) {
-	if iwlOptions.workdir == "" {
-		t.Skip("-iwl_workdir not configured")
-	}
-
-	opts := stressTestOptions(iwlOptions.workdir)
-	// Don't skip hooks, so that we can wait for IWL.
-	opts = append(opts, SkipHooks(false))
-
-	results := testing.Benchmark(func(b *testing.B) {
-		for i := 0; i < b.N; i++ {
-			WithOptions(opts...).Run(t, "", func(t *testing.T, env *Env) {})
-		}
-	})
-
-	printBenchmarkResults(results)
-}
-
-var symbolOptions struct {
-	workdir, query, matcher, style string
-	printResults                   bool
-}
-
-func init() {
-	flag.StringVar(&symbolOptions.workdir, "symbol_workdir", "", "if set, run symbol benchmark in this directory")
-	flag.StringVar(&symbolOptions.query, "symbol_query", "test", "symbol query to use in benchmark")
-	flag.StringVar(&symbolOptions.matcher, "symbol_matcher", "", "symbol matcher to use in benchmark")
-	flag.StringVar(&symbolOptions.style, "symbol_style", "", "symbol style to use in benchmark")
-	flag.BoolVar(&symbolOptions.printResults, "symbol_print_results", false, "whether to print symbol query results")
-}
-
-func TestBenchmarkSymbols(t *testing.T) {
-	if symbolOptions.workdir == "" {
-		t.Skip("-symbol_workdir not configured")
-	}
-
-	opts := benchmarkOptions(symbolOptions.workdir)
-	conf := EditorConfig{}
-	if symbolOptions.matcher != "" {
-		conf.SymbolMatcher = &symbolOptions.matcher
-	}
-	if symbolOptions.style != "" {
-		conf.SymbolStyle = &symbolOptions.style
-	}
-	opts = append(opts, conf)
-
-	WithOptions(opts...).Run(t, "", func(t *testing.T, env *Env) {
-		// We can't Await in this test, since we have disabled hooks. Instead, run
-		// one symbol request to completion to ensure all necessary cache entries
-		// are populated.
-		symbols, err := env.Editor.Server.Symbol(env.Ctx, &protocol.WorkspaceSymbolParams{
-			Query: symbolOptions.query,
-		})
-		if err != nil {
-			t.Fatal(err)
-		}
-
-		if symbolOptions.printResults {
-			fmt.Println("Results:")
-			for i := 0; i < len(symbols); i++ {
-				fmt.Printf("\t%d. %s (%s)\n", i, symbols[i].Name, symbols[i].ContainerName)
-			}
-		}
-
-		results := testing.Benchmark(func(b *testing.B) {
-			for i := 0; i < b.N; i++ {
-				if _, err := env.Editor.Server.Symbol(env.Ctx, &protocol.WorkspaceSymbolParams{
-					Query: symbolOptions.query,
-				}); err != nil {
-					t.Fatal(err)
-				}
-			}
-		})
-		printBenchmarkResults(results)
-	})
-}
-
-var (
-	benchDir     = flag.String("didchange_dir", "", "If set, run benchmarks in this dir. Must also set regtest_bench_file.")
-	benchFile    = flag.String("didchange_file", "", "The file to modify")
-	benchProfile = flag.String("didchange_cpuprof", "", "file to write cpu profiling data to")
-)
-
-// TestBenchmarkDidChange benchmarks modifications of a single file by making
-// synthetic modifications in a comment. It controls pacing by waiting for the
-// server to actually start processing the didChange notification before
-// proceeding. Notably it does not wait for diagnostics to complete.
-//
-// Run it by passing -didchange_dir and -didchange_file, where -didchange_dir
-// is the path to a workspace root, and -didchange_file is the
-// workspace-relative path to a file to modify. e.g.:
-//
-//  go test -run=TestBenchmarkDidChange \
-//   -didchange_dir=path/to/kubernetes \
-//   -didchange_file=pkg/util/hash/hash.go
-func TestBenchmarkDidChange(t *testing.T) {
-	if *benchDir == "" {
-		t.Skip("-didchange_dir is not set")
-	}
-	if *benchFile == "" {
-		t.Fatal("-didchange_file must be set if -didchange_dir is set")
-	}
-
-	opts := benchmarkOptions(*benchDir)
-	WithOptions(opts...).Run(t, "", func(_ *testing.T, env *Env) {
-		env.OpenFile(*benchFile)
-		env.Await(env.DoneWithOpen())
-		// Insert the text we'll be modifying at the top of the file.
-		env.EditBuffer(*benchFile, fake.Edit{Text: "// __REGTEST_PLACEHOLDER_0__\n"})
-		result := testing.Benchmark(func(b *testing.B) {
-			if *benchProfile != "" {
-				profile, err := os.Create(*benchProfile)
-				if err != nil {
-					t.Fatal(err)
-				}
-				defer profile.Close()
-				if err := pprof.StartCPUProfile(profile); err != nil {
-					t.Fatal(err)
-				}
-				defer pprof.StopCPUProfile()
-			}
-			b.ResetTimer()
-			for i := 0; i < b.N; i++ {
-				env.EditBuffer(*benchFile, fake.Edit{
-					Start: fake.Pos{Line: 0, Column: 0},
-					End:   fake.Pos{Line: 1, Column: 0},
-					// Increment
-					Text: fmt.Sprintf("// __REGTEST_PLACEHOLDER_%d__\n", i+1),
-				})
-				env.Await(StartedChange(uint64(i + 1)))
-			}
-			b.StopTimer()
-		})
-		printBenchmarkResults(result)
-	})
-}
diff -urN a/gopls/internal/regtest/bench/completion_bench_test.go b/gopls/internal/regtest/bench/completion_bench_test.go
--- a/gopls/internal/regtest/bench/completion_bench_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/bench/completion_bench_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,186 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bench
-
-import (
-	"flag"
-	"fmt"
-	"strings"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/fake"
-)
-
-// dummyCompletionFunction to test manually configured completion using CLI.
-func dummyCompletionFunction() { const s = "placeholder"; fmt.Printf("%s", s) }
-
-type completionBenchOptions struct {
-	workdir, file, locationRegexp string
-	printResults                  bool
-	// hook to run edits before initial completion, not supported for manually
-	// configured completions.
-	preCompletionEdits func(*Env)
-}
-
-var completionOptions = completionBenchOptions{}
-
-func init() {
-	flag.StringVar(&completionOptions.workdir, "completion_workdir", "", "directory to run completion benchmarks in")
-	flag.StringVar(&completionOptions.file, "completion_file", "", "relative path to the file to complete in")
-	flag.StringVar(&completionOptions.locationRegexp, "completion_regexp", "", "regexp location to complete at")
-	flag.BoolVar(&completionOptions.printResults, "completion_print_results", false, "whether to print completion results")
-}
-
-func benchmarkCompletion(options completionBenchOptions, t *testing.T) {
-	if completionOptions.workdir == "" {
-		t.Skip("-completion_workdir not configured, skipping benchmark")
-	}
-
-	opts := stressTestOptions(options.workdir)
-
-	// Completion gives bad results if IWL is not yet complete, so we must await
-	// it first (and therefore need hooks).
-	opts = append(opts, SkipHooks(false))
-
-	WithOptions(opts...).Run(t, "", func(t *testing.T, env *Env) {
-		env.OpenFile(options.file)
-
-		// Run edits required for this completion.
-		if options.preCompletionEdits != nil {
-			options.preCompletionEdits(env)
-		}
-
-		// Run a completion to make sure the system is warm.
-		pos := env.RegexpSearch(options.file, options.locationRegexp)
-		completions := env.Completion(options.file, pos)
-
-		if options.printResults {
-			fmt.Println("Results:")
-			for i := 0; i < len(completions.Items); i++ {
-				fmt.Printf("\t%d. %v\n", i, completions.Items[i])
-			}
-		}
-
-		results := testing.Benchmark(func(b *testing.B) {
-			for i := 0; i < b.N; i++ {
-				env.Completion(options.file, pos)
-			}
-		})
-
-		printBenchmarkResults(results)
-	})
-}
-
-// endPosInBuffer returns the position for last character in the buffer for
-// the given file.
-func endPosInBuffer(env *Env, name string) fake.Pos {
-	buffer := env.Editor.BufferText(name)
-	lines := strings.Split(buffer, "\n")
-	numLines := len(lines)
-
-	return fake.Pos{
-		Line:   numLines - 1,
-		Column: len([]rune(lines[numLines-1])),
-	}
-}
-
-// Benchmark completion at a specified file and location. When no CLI options
-// are specified, this test is skipped.
-// To Run (from x/tools/gopls) against the dummy function above:
-// 	go test -v ./internal/regtest/bench -run=TestBenchmarkConfiguredCompletion
-// 	-completion_workdir="$HOME/Developer/tools"
-// 	-completion_file="gopls/internal/regtest/completion_bench_test.go"
-// 	-completion_regexp="dummyCompletionFunction.*fmt\.Printf\(\"%s\", s(\))"
-func TestBenchmarkConfiguredCompletion(t *testing.T) {
-	benchmarkCompletion(completionOptions, t)
-}
-
-// To run (from x/tools/gopls):
-// 	go test -v ./internal/regtest/bench -run TestBenchmark<>Completion
-//	-completion_workdir="$HOME/Developer/tools"
-// where <> is one of the tests below. completion_workdir should be path to
-// x/tools on your system.
-
-// Benchmark struct completion in tools codebase.
-func TestBenchmarkStructCompletion(t *testing.T) {
-	file := "internal/lsp/cache/session.go"
-
-	preCompletionEdits := func(env *Env) {
-		env.OpenFile(file)
-		originalBuffer := env.Editor.BufferText(file)
-		env.EditBuffer(file, fake.Edit{
-			End:  endPosInBuffer(env, file),
-			Text: originalBuffer + "\nvar testVariable map[string]bool = Session{}.\n",
-		})
-	}
-
-	benchmarkCompletion(completionBenchOptions{
-		workdir:            completionOptions.workdir,
-		file:               file,
-		locationRegexp:     `var testVariable map\[string\]bool = Session{}(\.)`,
-		preCompletionEdits: preCompletionEdits,
-		printResults:       completionOptions.printResults,
-	}, t)
-}
-
-// Benchmark import completion in tools codebase.
-func TestBenchmarkImportCompletion(t *testing.T) {
-	benchmarkCompletion(completionBenchOptions{
-		workdir:        completionOptions.workdir,
-		file:           "internal/lsp/source/completion/completion.go",
-		locationRegexp: `go\/()`,
-		printResults:   completionOptions.printResults,
-	}, t)
-}
-
-// Benchmark slice completion in tools codebase.
-func TestBenchmarkSliceCompletion(t *testing.T) {
-	file := "internal/lsp/cache/session.go"
-
-	preCompletionEdits := func(env *Env) {
-		env.OpenFile(file)
-		originalBuffer := env.Editor.BufferText(file)
-		env.EditBuffer(file, fake.Edit{
-			End:  endPosInBuffer(env, file),
-			Text: originalBuffer + "\nvar testVariable []byte = \n",
-		})
-	}
-
-	benchmarkCompletion(completionBenchOptions{
-		workdir:            completionOptions.workdir,
-		file:               file,
-		locationRegexp:     `var testVariable \[\]byte (=)`,
-		preCompletionEdits: preCompletionEdits,
-		printResults:       completionOptions.printResults,
-	}, t)
-}
-
-// Benchmark deep completion in function call in tools codebase.
-func TestBenchmarkFuncDeepCompletion(t *testing.T) {
-	file := "internal/lsp/source/completion/completion.go"
-	fileContent := `
-func (c *completer) _() {
-	c.inference.kindMatches(c.)
-}
-`
-	preCompletionEdits := func(env *Env) {
-		env.OpenFile(file)
-		originalBuffer := env.Editor.BufferText(file)
-		env.EditBuffer(file, fake.Edit{
-			End:  endPosInBuffer(env, file),
-			Text: originalBuffer + fileContent,
-		})
-	}
-
-	benchmarkCompletion(completionBenchOptions{
-		workdir:            completionOptions.workdir,
-		file:               file,
-		locationRegexp:     `func \(c \*completer\) _\(\) {\n\tc\.inference\.kindMatches\((c)`,
-		preCompletionEdits: preCompletionEdits,
-		printResults:       completionOptions.printResults,
-	}, t)
-}
diff -urN a/gopls/internal/regtest/bench/stress_test.go b/gopls/internal/regtest/bench/stress_test.go
--- a/gopls/internal/regtest/bench/stress_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/bench/stress_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,66 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package bench
-
-import (
-	"context"
-	"flag"
-	"fmt"
-	"testing"
-	"time"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-// Pilosa is a repository that has historically caused significant memory
-// problems for Gopls. We use it for a simple stress test that types
-// arbitrarily in a file with lots of dependents.
-
-var pilosaPath = flag.String("pilosa_path", "", "Path to a directory containing "+
-	"github.com/pilosa/pilosa, for stress testing. Do not set this unless you "+
-	"know what you're doing!")
-
-func stressTestOptions(dir string) []RunOption {
-	opts := benchmarkOptions(dir)
-	opts = append(opts, SkipHooks(true), DebugAddress(":8087"))
-	return opts
-}
-
-func TestPilosaStress(t *testing.T) {
-	if *pilosaPath == "" {
-		t.Skip("-pilosa_path not configured")
-	}
-	opts := stressTestOptions(*pilosaPath)
-
-	WithOptions(opts...).Run(t, "", func(_ *testing.T, env *Env) {
-		files := []string{
-			"cmd.go",
-			"internal/private.pb.go",
-			"roaring/roaring.go",
-			"roaring/roaring_internal_test.go",
-			"server/handler_test.go",
-		}
-		for _, file := range files {
-			env.OpenFile(file)
-		}
-		ctx, cancel := context.WithTimeout(env.Ctx, 10*time.Minute)
-		defer cancel()
-
-		i := 1
-		// MagicNumber is an identifier that occurs in roaring.go. Just change it
-		// arbitrarily.
-		env.RegexpReplace("roaring/roaring.go", "MagicNumber", fmt.Sprintf("MagicNumber%d", 1))
-		for {
-			select {
-			case <-ctx.Done():
-				return
-			default:
-			}
-			env.RegexpReplace("roaring/roaring.go", fmt.Sprintf("MagicNumber%d", i), fmt.Sprintf("MagicNumber%d", i+1))
-			time.Sleep(20 * time.Millisecond)
-			i++
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/codelens/codelens_test.go b/gopls/internal/regtest/codelens/codelens_test.go
--- a/gopls/internal/regtest/codelens/codelens_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/codelens/codelens_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,353 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package codelens
-
-import (
-	"fmt"
-	"runtime"
-	"strings"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/command"
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/lsp/tests"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-func TestDisablingCodeLens(t *testing.T) {
-	const workspace = `
--- go.mod --
-module codelens.test
-
-go 1.12
--- lib.go --
-package lib
-
-type Number int
-
-const (
-	Zero Number = iota
-	One
-	Two
-)
-
-//go:generate stringer -type=Number
-`
-	tests := []struct {
-		label        string
-		enabled      map[string]bool
-		wantCodeLens bool
-	}{
-		{
-			label:        "default",
-			wantCodeLens: true,
-		},
-		{
-			label:        "generate disabled",
-			enabled:      map[string]bool{string(command.Generate): false},
-			wantCodeLens: false,
-		},
-	}
-	for _, test := range tests {
-		t.Run(test.label, func(t *testing.T) {
-			WithOptions(
-				EditorConfig{
-					CodeLenses: test.enabled,
-				},
-			).Run(t, workspace, func(t *testing.T, env *Env) {
-				env.OpenFile("lib.go")
-				lens := env.CodeLens("lib.go")
-				if gotCodeLens := len(lens) > 0; gotCodeLens != test.wantCodeLens {
-					t.Errorf("got codeLens: %t, want %t", gotCodeLens, test.wantCodeLens)
-				}
-			})
-		})
-	}
-}
-
-// This test confirms the full functionality of the code lenses for updating
-// dependencies in a go.mod file. It checks for the code lens that suggests
-// an update and then executes the command associated with that code lens. A
-// regression test for golang/go#39446.
-func TestUpgradeCodelens(t *testing.T) {
-	const proxyWithLatest = `
--- golang.org/x/hello@v1.3.3/go.mod --
-module golang.org/x/hello
-
-go 1.12
--- golang.org/x/hello@v1.3.3/hi/hi.go --
-package hi
-
-var Goodbye error
--- golang.org/x/hello@v1.2.3/go.mod --
-module golang.org/x/hello
-
-go 1.12
--- golang.org/x/hello@v1.2.3/hi/hi.go --
-package hi
-
-var Goodbye error
-`
-
-	const shouldUpdateDep = `
--- go.mod --
-module mod.com
-
-go 1.14
-
-require golang.org/x/hello v1.2.3
--- go.sum --
-golang.org/x/hello v1.2.3 h1:7Wesfkx/uBd+eFgPrq0irYj/1XfmbvLV8jZ/W7C2Dwg=
-golang.org/x/hello v1.2.3/go.mod h1:OgtlzsxVMUUdsdQCIDYgaauCTH47B8T8vofouNJfzgY=
--- main.go --
-package main
-
-import "golang.org/x/hello/hi"
-
-func main() {
-	_ = hi.Goodbye
-}
-`
-
-	const wantGoMod = `module mod.com
-
-go 1.14
-
-require golang.org/x/hello v1.3.3
-`
-
-	for _, commandTitle := range []string{
-		"Upgrade transitive dependencies",
-		"Upgrade direct dependencies",
-	} {
-		t.Run(commandTitle, func(t *testing.T) {
-			WithOptions(
-				ProxyFiles(proxyWithLatest),
-			).Run(t, shouldUpdateDep, func(t *testing.T, env *Env) {
-				env.OpenFile("go.mod")
-				var lens protocol.CodeLens
-				var found bool
-				for _, l := range env.CodeLens("go.mod") {
-					if l.Command.Title == commandTitle {
-						lens = l
-						found = true
-					}
-				}
-				if !found {
-					t.Fatalf("found no command with the title %s", commandTitle)
-				}
-				if _, err := env.Editor.ExecuteCommand(env.Ctx, &protocol.ExecuteCommandParams{
-					Command:   lens.Command.Command,
-					Arguments: lens.Command.Arguments,
-				}); err != nil {
-					t.Fatal(err)
-				}
-				env.Await(env.DoneWithChangeWatchedFiles())
-				if got := env.Editor.BufferText("go.mod"); got != wantGoMod {
-					t.Fatalf("go.mod upgrade failed:\n%s", tests.Diff(t, wantGoMod, got))
-				}
-			})
-		})
-	}
-	for _, vendoring := range []bool{false, true} {
-		t.Run(fmt.Sprintf("Upgrade individual dependency vendoring=%v", vendoring), func(t *testing.T) {
-			WithOptions(ProxyFiles(proxyWithLatest)).Run(t, shouldUpdateDep, func(t *testing.T, env *Env) {
-				if vendoring {
-					env.RunGoCommand("mod", "vendor")
-				}
-				env.Await(env.DoneWithChangeWatchedFiles())
-				env.OpenFile("go.mod")
-				env.ExecuteCodeLensCommand("go.mod", command.CheckUpgrades)
-				d := &protocol.PublishDiagnosticsParams{}
-				env.Await(
-					OnceMet(
-						env.DiagnosticAtRegexpWithMessage("go.mod", `require`, "can be upgraded"),
-						ReadDiagnostics("go.mod", d),
-					),
-				)
-				env.ApplyQuickFixes("go.mod", d.Diagnostics)
-				env.Await(env.DoneWithChangeWatchedFiles())
-				if got := env.Editor.BufferText("go.mod"); got != wantGoMod {
-					t.Fatalf("go.mod upgrade failed:\n%s", tests.Diff(t, wantGoMod, got))
-				}
-			})
-		})
-	}
-}
-
-func TestUnusedDependenciesCodelens(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	const proxy = `
--- golang.org/x/hello@v1.0.0/go.mod --
-module golang.org/x/hello
-
-go 1.14
--- golang.org/x/hello@v1.0.0/hi/hi.go --
-package hi
-
-var Goodbye error
--- golang.org/x/unused@v1.0.0/go.mod --
-module golang.org/x/unused
-
-go 1.14
--- golang.org/x/unused@v1.0.0/nouse/nouse.go --
-package nouse
-
-var NotUsed error
-`
-
-	const shouldRemoveDep = `
--- go.mod --
-module mod.com
-
-go 1.14
-
-require golang.org/x/hello v1.0.0
-require golang.org/x/unused v1.0.0
--- go.sum --
-golang.org/x/hello v1.0.0 h1:qbzE1/qT0/zojAMd/JcPsO2Vb9K4Bkeyq0vB2JGMmsw=
-golang.org/x/hello v1.0.0/go.mod h1:WW7ER2MRNXWA6c8/4bDIek4Hc/+DofTrMaQQitGXcco=
-golang.org/x/unused v1.0.0 h1:LecSbCn5P3vTcxubungSt1Pn4D/WocCaiWOPDC0y0rw=
-golang.org/x/unused v1.0.0/go.mod h1:ihoW8SgWzugwwj0N2SfLfPZCxTB1QOVfhMfB5PWTQ8U=
--- main.go --
-package main
-
-import "golang.org/x/hello/hi"
-
-func main() {
-	_ = hi.Goodbye
-}
-`
-	WithOptions(ProxyFiles(proxy)).Run(t, shouldRemoveDep, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		env.ExecuteCodeLensCommand("go.mod", command.Tidy)
-		env.Await(env.DoneWithChangeWatchedFiles())
-		got := env.Editor.BufferText("go.mod")
-		const wantGoMod = `module mod.com
-
-go 1.14
-
-require golang.org/x/hello v1.0.0
-`
-		if got != wantGoMod {
-			t.Fatalf("go.mod tidy failed:\n%s", tests.Diff(t, wantGoMod, got))
-		}
-	})
-}
-
-func TestRegenerateCgo(t *testing.T) {
-	testenv.NeedsTool(t, "cgo")
-	testenv.NeedsGo1Point(t, 15)
-
-	const workspace = `
--- go.mod --
-module example.com
-
-go 1.12
--- cgo.go --
-package x
-
-/*
-int fortythree() { return 42; }
-*/
-import "C"
-
-func Foo() {
-	print(C.fortytwo())
-}
-`
-	Run(t, workspace, func(t *testing.T, env *Env) {
-		// Open the file. We have a nonexistant symbol that will break cgo processing.
-		env.OpenFile("cgo.go")
-		env.Await(env.DiagnosticAtRegexpWithMessage("cgo.go", ``, "go list failed to return CompiledGoFiles"))
-
-		// 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(OnceMet(
-			env.DoneWithSave(),
-			env.DiagnosticAtRegexpWithMessage("cgo.go", ``, "go list failed to return CompiledGoFiles"),
-		))
-
-		// Regenerate cgo, fixing the diagnostic.
-		env.ExecuteCodeLensCommand("cgo.go", command.RegenerateCgo)
-		env.Await(EmptyDiagnostics("cgo.go"))
-	})
-}
-
-func TestGCDetails(t *testing.T) {
-	testenv.NeedsGo1Point(t, 15)
-	if runtime.GOOS == "android" {
-		t.Skipf("the gc details code lens doesn't work on Android")
-	}
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.15
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Println(42)
-}
-`
-	WithOptions(
-		EditorConfig{
-			CodeLenses: map[string]bool{
-				"gc_details": true,
-			}},
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.ExecuteCodeLensCommand("main.go", command.GCDetails)
-		d := &protocol.PublishDiagnosticsParams{}
-		env.Await(
-			OnceMet(
-				DiagnosticAt("main.go", 5, 13),
-				ReadDiagnostics("main.go", d),
-			),
-		)
-		// Confirm that the diagnostics come from the gc details code lens.
-		var found bool
-		for _, d := range d.Diagnostics {
-			if d.Severity != protocol.SeverityInformation {
-				t.Fatalf("unexpected diagnostic severity %v, wanted Information", d.Severity)
-			}
-			if strings.Contains(d.Message, "42 escapes") {
-				found = true
-			}
-		}
-		if !found {
-			t.Fatalf(`expected to find diagnostic with message "escape(42 escapes to heap)", found none`)
-		}
-
-		// Editing a buffer should cause gc_details diagnostics to disappear, since
-		// they only apply to saved buffers.
-		env.EditBuffer("main.go", fake.NewEdit(0, 0, 0, 0, "\n\n"))
-		env.Await(EmptyDiagnostics("main.go"))
-
-		// Saving a buffer should re-format back to the original state, and
-		// re-enable the gc_details diagnostics.
-		env.SaveBuffer("main.go")
-		env.Await(DiagnosticAt("main.go", 5, 13))
-
-		// Toggle the GC details code lens again so now it should be off.
-		env.ExecuteCodeLensCommand("main.go", command.GCDetails)
-		env.Await(
-			EmptyDiagnostics("main.go"),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/completion/completion_test.go b/gopls/internal/regtest/completion/completion_test.go
--- a/gopls/internal/regtest/completion/completion_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/completion/completion_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,544 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package completion
-
-import (
-	"fmt"
-	"strings"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-const proxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-const Name = "Blah"
--- random.org@v1.2.3/go.mod --
-module random.org
-
-go 1.12
--- random.org@v1.2.3/blah/blah.go --
-package hello
-
-const Name = "Hello"
-`
-
-func TestPackageCompletion(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- fruits/apple.go --
-package apple
-
-fun apple() int {
-	return 0
-}
-
--- fruits/testfile.go --
-// this is a comment
-
-/*
- this is a multiline comment
-*/
-
-import "fmt"
-
-func test() {}
-
--- fruits/testfile2.go --
-package
-
--- fruits/testfile3.go --
-pac
--- 123f_r.u~its-123/testfile.go --
-package
-
--- .invalid-dir@-name/testfile.go --
-package
-`
-	var (
-		testfile4 = ""
-		testfile5 = "/*a comment*/ "
-		testfile6 = "/*a comment*/\n"
-	)
-	for _, tc := range []struct {
-		name          string
-		filename      string
-		content       *string
-		triggerRegexp string
-		want          []string
-		editRegexp    string
-	}{
-		{
-			name:          "package completion at valid position",
-			filename:      "fruits/testfile.go",
-			triggerRegexp: "\n()",
-			want:          []string{"package apple", "package apple_test", "package fruits", "package fruits_test", "package main"},
-			editRegexp:    "\n()",
-		},
-		{
-			name:          "package completion in a comment",
-			filename:      "fruits/testfile.go",
-			triggerRegexp: "th(i)s",
-			want:          nil,
-		},
-		{
-			name:          "package completion in a multiline comment",
-			filename:      "fruits/testfile.go",
-			triggerRegexp: `\/\*\n()`,
-			want:          nil,
-		},
-		{
-			name:          "package completion at invalid position",
-			filename:      "fruits/testfile.go",
-			triggerRegexp: "import \"fmt\"\n()",
-			want:          nil,
-		},
-		{
-			name:          "package completion after keyword 'package'",
-			filename:      "fruits/testfile2.go",
-			triggerRegexp: "package()",
-			want:          []string{"package apple", "package apple_test", "package fruits", "package fruits_test", "package main"},
-			editRegexp:    "package\n",
-		},
-		{
-			name:          "package completion with 'pac' prefix",
-			filename:      "fruits/testfile3.go",
-			triggerRegexp: "pac()",
-			want:          []string{"package apple", "package apple_test", "package fruits", "package fruits_test", "package main"},
-			editRegexp:    "pac",
-		},
-		{
-			name:          "package completion for empty file",
-			filename:      "fruits/testfile4.go",
-			triggerRegexp: "^$",
-			content:       &testfile4,
-			want:          []string{"package apple", "package apple_test", "package fruits", "package fruits_test", "package main"},
-			editRegexp:    "^$",
-		},
-		{
-			name:          "package completion without terminal newline",
-			filename:      "fruits/testfile5.go",
-			triggerRegexp: `\*\/ ()`,
-			content:       &testfile5,
-			want:          []string{"package apple", "package apple_test", "package fruits", "package fruits_test", "package main"},
-			editRegexp:    `\*\/ ()`,
-		},
-		{
-			name:          "package completion on terminal newline",
-			filename:      "fruits/testfile6.go",
-			triggerRegexp: `\*\/\n()`,
-			content:       &testfile6,
-			want:          []string{"package apple", "package apple_test", "package fruits", "package fruits_test", "package main"},
-			editRegexp:    `\*\/\n()`,
-		},
-		// Issue golang/go#44680
-		{
-			name:          "package completion for dir name with punctuation",
-			filename:      "123f_r.u~its-123/testfile.go",
-			triggerRegexp: "package()",
-			want:          []string{"package fruits123", "package fruits123_test", "package main"},
-			editRegexp:    "package\n",
-		},
-		{
-			name:          "package completion for invalid dir name",
-			filename:      ".invalid-dir@-name/testfile.go",
-			triggerRegexp: "package()",
-			want:          []string{"package main"},
-			editRegexp:    "package\n",
-		},
-	} {
-		t.Run(tc.name, func(t *testing.T) {
-			Run(t, files, func(t *testing.T, env *Env) {
-				if tc.content != nil {
-					env.WriteWorkspaceFile(tc.filename, *tc.content)
-					env.Await(
-						env.DoneWithChangeWatchedFiles(),
-					)
-				}
-				env.OpenFile(tc.filename)
-				completions := env.Completion(tc.filename, env.RegexpSearch(tc.filename, tc.triggerRegexp))
-
-				// Check that the completion item suggestions are in the range
-				// of the file.
-				lineCount := len(strings.Split(env.Editor.BufferText(tc.filename), "\n"))
-				for _, item := range completions.Items {
-					if start := int(item.TextEdit.Range.Start.Line); start >= lineCount {
-						t.Fatalf("unexpected text edit range start line number: got %d, want less than %d", start, lineCount)
-					}
-					if end := int(item.TextEdit.Range.End.Line); end >= lineCount {
-						t.Fatalf("unexpected text edit range end line number: got %d, want less than %d", end, lineCount)
-					}
-				}
-
-				if tc.want != nil {
-					start, end := env.RegexpRange(tc.filename, tc.editRegexp)
-					expectedRng := protocol.Range{
-						Start: fake.Pos.ToProtocolPosition(start),
-						End:   fake.Pos.ToProtocolPosition(end),
-					}
-					for _, item := range completions.Items {
-						gotRng := item.TextEdit.Range
-						if expectedRng != gotRng {
-							t.Errorf("unexpected completion range for completion item %s: got %v, want %v",
-								item.Label, gotRng, expectedRng)
-						}
-					}
-				}
-
-				diff := compareCompletionResults(tc.want, completions.Items)
-				if diff != "" {
-					t.Error(diff)
-				}
-			})
-		})
-	}
-}
-
-func TestPackageNameCompletion(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- math/add.go --
-package ma
-`
-
-	want := []string{"ma", "ma_test", "main", "math", "math_test"}
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("math/add.go")
-		completions := env.Completion("math/add.go", fake.Pos{
-			Line:   0,
-			Column: 10,
-		})
-
-		diff := compareCompletionResults(want, completions.Items)
-		if diff != "" {
-			t.Fatal(diff)
-		}
-	})
-}
-
-func compareCompletionResults(want []string, gotItems []protocol.CompletionItem) string {
-	if len(gotItems) != len(want) {
-		return fmt.Sprintf("got %v completion(s), want %v", len(gotItems), len(want))
-	}
-
-	var got []string
-	for _, item := range gotItems {
-		got = append(got, item.Label)
-	}
-
-	for i, v := range got {
-		if v != want[i] {
-			return fmt.Sprintf("completion results are not the same: got %v, want %v", got, want)
-		}
-	}
-
-	return ""
-}
-
-func TestUnimportedCompletion(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.14
-
-require example.com v1.2.3
--- go.sum --
-example.com v1.2.3 h1:ihBTGWGjTU3V4ZJ9OmHITkU9WQ4lGdQkMjgyLFk0FaY=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- main.go --
-package main
-
-func main() {
-	_ = blah
-}
--- main2.go --
-package main
-
-import "example.com/blah"
-
-func _() {
-	_ = blah.Hello
-}
-`
-	WithOptions(
-		ProxyFiles(proxy),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		// Make sure the dependency is in the module cache and accessible for
-		// unimported completions, and then remove it before proceeding.
-		env.RemoveWorkspaceFile("main2.go")
-		env.RunGoCommand("mod", "tidy")
-		env.Await(env.DoneWithChangeWatchedFiles())
-
-		// Trigger unimported completions for the example.com/blah package.
-		env.OpenFile("main.go")
-		env.Await(env.DoneWithOpen())
-		pos := env.RegexpSearch("main.go", "ah")
-		completions := env.Completion("main.go", pos)
-		if len(completions.Items) == 0 {
-			t.Fatalf("no completion items")
-		}
-		env.AcceptCompletion("main.go", pos, completions.Items[0])
-		env.Await(env.DoneWithChange())
-
-		// Trigger completions once again for the blah.<> selector.
-		env.RegexpReplace("main.go", "_ = blah", "_ = blah.")
-		env.Await(env.DoneWithChange())
-		pos = env.RegexpSearch("main.go", "\n}")
-		completions = env.Completion("main.go", pos)
-		if len(completions.Items) != 1 {
-			t.Fatalf("expected 1 completion item, got %v", len(completions.Items))
-		}
-		item := completions.Items[0]
-		if item.Label != "Name" {
-			t.Fatalf("expected completion item blah.Name, got %v", item.Label)
-		}
-		env.AcceptCompletion("main.go", pos, item)
-
-		// Await the diagnostics to add example.com/blah to the go.mod file.
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", `"example.com/blah"`),
-		)
-	})
-}
-
-// Test that completions still work with an undownloaded module, golang/go#43333.
-func TestUndownloadedModule(t *testing.T) {
-	// mod.com depends on example.com, but only in a file that's hidden by a
-	// build tag, so the IWL won't download example.com. That will cause errors
-	// in the go list -m call performed by the imports package.
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.14
-
-require example.com v1.2.3
--- go.sum --
-example.com v1.2.3 h1:ihBTGWGjTU3V4ZJ9OmHITkU9WQ4lGdQkMjgyLFk0FaY=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- useblah.go --
-// +build hidden
-
-package pkg
-import "example.com/blah"
-var _ = blah.Name
--- mainmod/mainmod.go --
-package mainmod
-
-const Name = "mainmod"
-`
-	WithOptions(ProxyFiles(proxy)).Run(t, files, func(t *testing.T, env *Env) {
-		env.CreateBuffer("import.go", "package pkg\nvar _ = mainmod.Name\n")
-		env.SaveBuffer("import.go")
-		content := env.ReadWorkspaceFile("import.go")
-		if !strings.Contains(content, `import "mod.com/mainmod`) {
-			t.Errorf("expected import of mod.com/mainmod in %q", content)
-		}
-	})
-}
-
-// Test that we can doctor the source code enough so the file is
-// parseable and completion works as expected.
-func TestSourceFixup(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- foo.go --
-package foo
-
-func _() {
-	var s S
-	if s.
-}
-
-type S struct {
-	i int
-}
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("foo.go")
-		completions := env.Completion("foo.go", env.RegexpSearch("foo.go", `if s\.()`))
-		diff := compareCompletionResults([]string{"i"}, completions.Items)
-		if diff != "" {
-			t.Fatal(diff)
-		}
-	})
-}
-
-func TestCompletion_Issue45510(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func _() {
-	type a *a
-	var aaaa1, aaaa2 a
-	var _ a = aaaa
-
-	type b a
-	var bbbb1, bbbb2 b
-	var _ b = bbbb
-}
-
-type (
-	c *d
-	d *e
-	e **c
-)
-
-func _() {
-	var (
-		xxxxc c
-		xxxxd d
-		xxxxe e
-	)
-
-	var _ c = xxxx
-	var _ d = xxxx
-	var _ e = xxxx
-}
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-
-		tests := []struct {
-			re   string
-			want []string
-		}{
-			{`var _ a = aaaa()`, []string{"aaaa1", "aaaa2"}},
-			{`var _ b = bbbb()`, []string{"bbbb1", "bbbb2"}},
-			{`var _ c = xxxx()`, []string{"xxxxc", "xxxxd", "xxxxe"}},
-			{`var _ d = xxxx()`, []string{"xxxxc", "xxxxd", "xxxxe"}},
-			{`var _ e = xxxx()`, []string{"xxxxc", "xxxxd", "xxxxe"}},
-		}
-		for _, tt := range tests {
-			completions := env.Completion("main.go", env.RegexpSearch("main.go", tt.re))
-			diff := compareCompletionResults(tt.want, completions.Items)
-			if diff != "" {
-				t.Errorf("%s: %s", tt.re, diff)
-			}
-		}
-	})
-}
-
-func TestCompletionDeprecation(t *testing.T) {
-	const files = `
--- go.mod --
-module test.com
-
-go 1.16
--- prog.go --
-package waste
-// Deprecated, use newFoof
-func fooFunc() bool {
-	return false
-}
-
-// Deprecated
-const badPi = 3.14
-
-func doit() {
-	if fooF
-	panic()
-	x := badP
-}
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("prog.go")
-		pos := env.RegexpSearch("prog.go", "if fooF")
-		pos.Column += len("if fooF")
-		completions := env.Completion("prog.go", pos)
-		diff := compareCompletionResults([]string{"fooFunc"}, completions.Items)
-		if diff != "" {
-			t.Error(diff)
-		}
-		if completions.Items[0].Tags == nil {
-			t.Errorf("expected Tags to show deprecation %#v", diff[0])
-		}
-		pos = env.RegexpSearch("prog.go", "= badP")
-		pos.Column += len("= badP")
-		completions = env.Completion("prog.go", pos)
-		diff = compareCompletionResults([]string{"badPi"}, completions.Items)
-		if diff != "" {
-			t.Error(diff)
-		}
-		if completions.Items[0].Tags == nil {
-			t.Errorf("expected Tags to show deprecation %#v", diff[0])
-		}
-	})
-}
-
-func TestUnimportedCompletion_VSCodeIssue1489(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const src = `
--- go.mod --
-module mod.com
-
-go 1.14
-
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("a")
-	math.Sqr
-}
-`
-	WithOptions(
-		EditorConfig{WindowsLineEndings: true},
-	).Run(t, src, func(t *testing.T, env *Env) {
-		// Trigger unimported completions for the example.com/blah package.
-		env.OpenFile("main.go")
-		env.Await(env.DoneWithOpen())
-		pos := env.RegexpSearch("main.go", "Sqr()")
-		completions := env.Completion("main.go", pos)
-		if len(completions.Items) == 0 {
-			t.Fatalf("no completion items")
-		}
-		env.AcceptCompletion("main.go", pos, completions.Items[0])
-		env.Await(env.DoneWithChange())
-		got := env.Editor.BufferText("main.go")
-		want := "package main\r\n\r\nimport (\r\n\t\"fmt\"\r\n\t\"math\"\r\n)\r\n\r\nfunc main() {\r\n\tfmt.Println(\"a\")\r\n\tmath.Sqrt(${1:})\r\n}\r\n"
-		if got != want {
-			t.Errorf("unimported completion: got %q, want %q", got, want)
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/completion/postfix_snippet_test.go b/gopls/internal/regtest/completion/postfix_snippet_test.go
--- a/gopls/internal/regtest/completion/postfix_snippet_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/completion/postfix_snippet_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,442 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package completion
-
-import (
-	"strings"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-	"golang.org/x/tools/internal/lsp/source"
-)
-
-func TestPostfixSnippetCompletion(t *testing.T) {
-	t.Skipf("skipping test due to suspected synchronization bug; see https://go.dev/issue/50707")
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-`
-
-	cases := []struct {
-		name          string
-		before, after string
-	}{
-		{
-			name: "sort",
-			before: `
-package foo
-
-func _() {
-	var foo []int
-	foo.sort
-}
-`,
-			after: `
-package foo
-
-import "sort"
-
-func _() {
-	var foo []int
-	sort.Slice(foo, func(i, j int) bool {
-	$0
-})
-}
-`,
-		},
-		{
-			name: "sort_renamed_sort_package",
-			before: `
-package foo
-
-import blahsort "sort"
-
-var j int
-
-func _() {
-	var foo []int
-	foo.sort
-}
-`,
-			after: `
-package foo
-
-import blahsort "sort"
-
-var j int
-
-func _() {
-	var foo []int
-	blahsort.Slice(foo, func(i, j2 int) bool {
-	$0
-})
-}
-`,
-		},
-		{
-			name: "last",
-			before: `
-package foo
-
-func _() {
-	var s struct { i []int }
-	s.i.last
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var s struct { i []int }
-	s.i[len(s.i)-1]
-}
-`,
-		},
-		{
-			name: "reverse",
-			before: `
-package foo
-
-func _() {
-	var foo []int
-	foo.reverse
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var foo []int
-	for i, j := 0, len(foo)-1; i < j; i, j = i+1, j-1 {
-	foo[i], foo[j] = foo[j], foo[i]
-}
-
-}
-`,
-		},
-		{
-			name: "slice_range",
-			before: `
-package foo
-
-func _() {
-	type myThing struct{}
-	var foo []myThing
-	foo.range
-}
-`,
-			after: `
-package foo
-
-func _() {
-	type myThing struct{}
-	var foo []myThing
-	for i, mt := range foo {
-	$0
-}
-}
-`,
-		},
-		{
-			name: "append_stmt",
-			before: `
-package foo
-
-func _() {
-	var foo []int
-	foo.append
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var foo []int
-	foo = append(foo, $0)
-}
-`,
-		},
-		{
-			name: "append_expr",
-			before: `
-package foo
-
-func _() {
-	var foo []int
-	var _ []int = foo.append
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var foo []int
-	var _ []int = append(foo, $0)
-}
-`,
-		},
-		{
-			name: "slice_copy",
-			before: `
-package foo
-
-func _() {
-	var foo []int
-	foo.copy
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var foo []int
-	fooCopy := make([]int, len(foo))
-copy(fooCopy, foo)
-
-}
-`,
-		},
-		{
-			name: "map_range",
-			before: `
-package foo
-
-func _() {
-	var foo map[string]int
-	foo.range
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var foo map[string]int
-	for k, v := range foo {
-	$0
-}
-}
-`,
-		},
-		{
-			name: "map_clear",
-			before: `
-package foo
-
-func _() {
-	var foo map[string]int
-	foo.clear
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var foo map[string]int
-	for k := range foo {
-	delete(foo, k)
-}
-
-}
-`,
-		},
-		{
-			name: "map_keys",
-			before: `
-package foo
-
-func _() {
-	var foo map[string]int
-	foo.keys
-}
-`,
-			after: `
-package foo
-
-func _() {
-	var foo map[string]int
-	keys := make([]string, 0, len(foo))
-for k := range foo {
-	keys = append(keys, k)
-}
-
-}
-`,
-		},
-		{
-			name: "var",
-			before: `
-package foo
-
-func foo() (int, error) { return 0, nil }
-
-func _() {
-	foo().var
-}
-`,
-			after: `
-package foo
-
-func foo() (int, error) { return 0, nil }
-
-func _() {
-	i, err := foo()
-}
-`,
-		},
-		{
-			name: "var_single_value",
-			before: `
-package foo
-
-func foo() error { return nil }
-
-func _() {
-	foo().var
-}
-`,
-			after: `
-package foo
-
-func foo() error { return nil }
-
-func _() {
-	err := foo()
-}
-`,
-		},
-		{
-			name: "var_same_type",
-			before: `
-package foo
-
-func foo() (int, int) { return 0, 0 }
-
-func _() {
-	foo().var
-}
-`,
-			after: `
-package foo
-
-func foo() (int, int) { return 0, 0 }
-
-func _() {
-	i, i2 := foo()
-}
-`,
-		},
-		{
-			name: "print_scalar",
-			before: `
-package foo
-
-func _() {
-	var foo int
-	foo.print
-}
-`,
-			after: `
-package foo
-
-import "fmt"
-
-func _() {
-	var foo int
-	fmt.Printf("foo: %v\n", foo)
-}
-`,
-		},
-		{
-			name: "print_multi",
-			before: `
-package foo
-
-func foo() (int, error) { return 0, nil }
-
-func _() {
-	foo().print
-}
-`,
-			after: `
-package foo
-
-import "fmt"
-
-func foo() (int, error) { return 0, nil }
-
-func _() {
-	fmt.Println(foo())
-}
-`,
-		},
-		{
-			name: "string split",
-			before: `
-package foo
-
-func foo() []string { 
-	x := "test"
-	return x.split
-}`,
-			after: `
-package foo
-
-import "strings"
-
-func foo() []string { 
-	x := "test"
-	return strings.Split(x, "$0")
-}`,
-		},
-		{
-			name: "string slice join",
-			before: `
-package foo
-
-func foo() string {
-	x := []string{"a", "test"}
-	return x.join
-}`,
-			after: `
-package foo
-
-import "strings"
-
-func foo() string {
-	x := []string{"a", "test"}
-	return strings.Join(x, "$0")
-}`,
-		},
-	}
-
-	r := WithOptions(Options(func(o *source.Options) {
-		o.ExperimentalPostfixCompletions = true
-	}))
-	r.Run(t, mod, func(t *testing.T, env *Env) {
-		for _, c := range cases {
-			t.Run(c.name, func(t *testing.T) {
-				c.before = strings.Trim(c.before, "\n")
-				c.after = strings.Trim(c.after, "\n")
-
-				env.CreateBuffer("foo.go", c.before)
-
-				pos := env.RegexpSearch("foo.go", "\n}")
-				completions := env.Completion("foo.go", pos)
-				if len(completions.Items) != 1 {
-					t.Fatalf("expected one completion, got %v", completions.Items)
-				}
-
-				env.AcceptCompletion("foo.go", pos, completions.Items[0])
-
-				if buf := env.Editor.BufferText("foo.go"); buf != c.after {
-					t.Errorf("\nGOT:\n%s\nEXPECTED:\n%s", buf, c.after)
-				}
-			})
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/diagnostics/builtin_test.go b/gopls/internal/regtest/diagnostics/builtin_test.go
--- a/gopls/internal/regtest/diagnostics/builtin_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/diagnostics/builtin_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,38 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package diagnostics
-
-import (
-	"strings"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestIssue44866(t *testing.T) {
-	src := `
--- go.mod --
-module mod.com
-
-go 1.12
--- a.go --
-package a
-
-const (
-	c = iota
-)
-`
-	Run(t, src, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		name, _ := env.GoToDefinition("a.go", env.RegexpSearch("a.go", "iota"))
-		if !strings.HasSuffix(name, "builtin.go") {
-			t.Fatalf("jumped to %q, want builtin.go", name)
-		}
-		env.Await(OnceMet(
-			env.DoneWithOpen(),
-			NoDiagnostics("builtin.go"),
-		))
-	})
-}
diff -urN a/gopls/internal/regtest/diagnostics/diagnostics_test.go b/gopls/internal/regtest/diagnostics/diagnostics_test.go
--- a/gopls/internal/regtest/diagnostics/diagnostics_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/diagnostics/diagnostics_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,2140 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package diagnostics
-
-import (
-	"context"
-	"fmt"
-	"os/exec"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp"
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-// Use mod.com for all go.mod files due to golang/go#35230.
-const exampleProgram = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("Hello World.")
-}`
-
-func TestDiagnosticErrorInEditedFile(t *testing.T) {
-	// This test is very basic: start with a clean Go program, make an error, and
-	// get a diagnostic for that error. However, it also demonstrates how to
-	// combine Expectations to await more complex state in the editor.
-	Run(t, exampleProgram, func(t *testing.T, env *Env) {
-		// Deleting the 'n' at the end of Println should generate a single error
-		// diagnostic.
-		env.OpenFile("main.go")
-		env.RegexpReplace("main.go", "Printl(n)", "")
-		env.Await(
-			// Once we have gotten diagnostics for the change above, we should
-			// satisfy the DiagnosticAtRegexp assertion.
-			OnceMet(
-				env.DoneWithChange(),
-				env.DiagnosticAtRegexp("main.go", "Printl"),
-			),
-			// Assert that this test has sent no error logs to the client. This is not
-			// strictly necessary for testing this regression, but is included here
-			// as an example of using the NoErrorLogs() expectation. Feel free to
-			// delete.
-			NoErrorLogs(),
-		)
-	})
-}
-
-func TestMissingImportDiagsClearOnFirstFile(t *testing.T) {
-	const onlyMod = `
--- go.mod --
-module mod.com
-
-go 1.12
-`
-	Run(t, onlyMod, func(t *testing.T, env *Env) {
-		env.CreateBuffer("main.go", `package main
-
-func m() {
-	log.Println()
-}
-`)
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", "log"),
-		)
-		env.SaveBuffer("main.go")
-		env.Await(
-			EmptyDiagnostics("main.go"),
-		)
-	})
-}
-
-func TestDiagnosticErrorInNewFile(t *testing.T) {
-	const brokenFile = `package main
-
-const Foo = "abc
-`
-	Run(t, brokenFile, func(t *testing.T, env *Env) {
-		env.CreateBuffer("broken.go", brokenFile)
-		env.Await(env.DiagnosticAtRegexp("broken.go", "\"abc"))
-	})
-}
-
-// badPackage contains a duplicate definition of the 'a' const.
-const badPackage = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a.go --
-package consts
-
-const a = 1
--- b.go --
-package consts
-
-const a = 2
-`
-
-func TestDiagnosticClearingOnEdit(t *testing.T) {
-	Run(t, badPackage, func(t *testing.T, env *Env) {
-		env.OpenFile("b.go")
-		env.Await(env.DiagnosticAtRegexp("a.go", "a = 1"), env.DiagnosticAtRegexp("b.go", "a = 2"))
-
-		// Fix the error by editing the const name in b.go to `b`.
-		env.RegexpReplace("b.go", "(a) = 2", "b")
-		env.Await(
-			EmptyDiagnostics("a.go"),
-			EmptyDiagnostics("b.go"),
-		)
-	})
-}
-
-func TestDiagnosticClearingOnDelete_Issue37049(t *testing.T) {
-	Run(t, badPackage, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		env.Await(env.DiagnosticAtRegexp("a.go", "a = 1"), env.DiagnosticAtRegexp("b.go", "a = 2"))
-		env.RemoveWorkspaceFile("b.go")
-
-		env.Await(EmptyDiagnostics("a.go"), EmptyDiagnostics("b.go"))
-	})
-}
-
-func TestDiagnosticClearingOnClose(t *testing.T) {
-	Run(t, badPackage, func(t *testing.T, env *Env) {
-		env.CreateBuffer("c.go", `package consts
-
-const a = 3`)
-		env.Await(
-			env.DiagnosticAtRegexp("a.go", "a = 1"),
-			env.DiagnosticAtRegexp("b.go", "a = 2"),
-			env.DiagnosticAtRegexp("c.go", "a = 3"),
-		)
-		env.CloseBuffer("c.go")
-		env.Await(
-			env.DiagnosticAtRegexp("a.go", "a = 1"),
-			env.DiagnosticAtRegexp("b.go", "a = 2"),
-			EmptyDiagnostics("c.go"),
-		)
-	})
-}
-
-// Tests golang/go#37978.
-func TestIssue37978(t *testing.T) {
-	Run(t, exampleProgram, func(t *testing.T, env *Env) {
-		// Create a new workspace-level directory and empty file.
-		env.CreateBuffer("c/c.go", "")
-
-		// Write the file contents with a missing import.
-		env.EditBuffer("c/c.go", fake.Edit{
-			Text: `package c
-
-const a = http.MethodGet
-`,
-		})
-		env.Await(
-			env.DiagnosticAtRegexp("c/c.go", "http.MethodGet"),
-		)
-		// Save file, which will organize imports, adding the expected import.
-		// Expect the diagnostics to clear.
-		env.SaveBuffer("c/c.go")
-		env.Await(
-			EmptyDiagnostics("c/c.go"),
-		)
-	})
-}
-
-// Tests golang/go#38878: good a.go, bad a_test.go, remove a_test.go but its errors remain
-// If the file is open in the editor, this is working as intended
-// If the file is not open in the editor, the errors go away
-const test38878 = `
--- go.mod --
-module foo
-
-go 1.12
--- a.go --
-package x
-
-// import "fmt"
-
-func f() {}
-
--- a_test.go --
-package x
-
-import "testing"
-
-func TestA(t *testing.T) {
-	f(3)
-}
-`
-
-// Tests golang/go#38878: deleting a test file should clear its errors, and
-// not break the workspace.
-func TestDeleteTestVariant(t *testing.T) {
-	Run(t, test38878, func(t *testing.T, env *Env) {
-		env.Await(env.DiagnosticAtRegexp("a_test.go", `f\((3)\)`))
-		env.RemoveWorkspaceFile("a_test.go")
-		env.Await(EmptyDiagnostics("a_test.go"))
-
-		// Make sure the test variant has been removed from the workspace by
-		// triggering a metadata load.
-		env.OpenFile("a.go")
-		env.RegexpReplace("a.go", `// import`, "import")
-		env.Await(env.DiagnosticAtRegexp("a.go", `"fmt"`))
-	})
-}
-
-// Tests golang/go#38878: deleting a test file on disk while it's still open
-// should not clear its errors.
-func TestDeleteTestVariant_DiskOnly(t *testing.T) {
-	Run(t, test38878, func(t *testing.T, env *Env) {
-		env.OpenFile("a_test.go")
-		env.Await(DiagnosticAt("a_test.go", 5, 3))
-		env.Sandbox.Workdir.RemoveFile(context.Background(), "a_test.go")
-		env.Await(OnceMet(
-			env.DoneWithChangeWatchedFiles(),
-			DiagnosticAt("a_test.go", 5, 3)))
-	})
-}
-
-// TestNoMod confirms that gopls continues to work when a user adds a go.mod
-// file to their workspace.
-func TestNoMod(t *testing.T) {
-	const noMod = `
--- main.go --
-package main
-
-import "mod.com/bob"
-
-func main() {
-	bob.Hello()
-}
--- bob/bob.go --
-package bob
-
-func Hello() {
-	var x int
-}
-`
-
-	t.Run("manual", func(t *testing.T) {
-		Run(t, noMod, func(t *testing.T, env *Env) {
-			env.Await(
-				env.DiagnosticAtRegexp("main.go", `"mod.com/bob"`),
-			)
-			env.CreateBuffer("go.mod", `module mod.com
-
-	go 1.12
-`)
-			env.SaveBuffer("go.mod")
-			env.Await(
-				EmptyDiagnostics("main.go"),
-			)
-			var d protocol.PublishDiagnosticsParams
-			env.Await(
-				OnceMet(
-					env.DiagnosticAtRegexp("bob/bob.go", "x"),
-					ReadDiagnostics("bob/bob.go", &d),
-				),
-			)
-			if len(d.Diagnostics) != 1 {
-				t.Fatalf("expected 1 diagnostic, got %v", len(d.Diagnostics))
-			}
-		})
-	})
-	t.Run("initialized", func(t *testing.T) {
-		Run(t, noMod, func(t *testing.T, env *Env) {
-			env.Await(
-				env.DiagnosticAtRegexp("main.go", `"mod.com/bob"`),
-			)
-			env.RunGoCommand("mod", "init", "mod.com")
-			env.Await(
-				EmptyDiagnostics("main.go"),
-				env.DiagnosticAtRegexp("bob/bob.go", "x"),
-			)
-		})
-	})
-
-	t.Run("without workspace module", func(t *testing.T) {
-		WithOptions(
-			Modes(Singleton),
-		).Run(t, noMod, func(t *testing.T, env *Env) {
-			env.Await(
-				env.DiagnosticAtRegexp("main.go", `"mod.com/bob"`),
-			)
-			if err := env.Sandbox.RunGoCommand(env.Ctx, "", "mod", []string{"init", "mod.com"}, true); err != nil {
-				t.Fatal(err)
-			}
-			env.Await(
-				EmptyDiagnostics("main.go"),
-				env.DiagnosticAtRegexp("bob/bob.go", "x"),
-			)
-		})
-	})
-}
-
-// Tests golang/go#38267.
-func TestIssue38267(t *testing.T) {
-	const testPackage = `
--- go.mod --
-module mod.com
-
-go 1.12
--- lib.go --
-package lib
-
-func Hello(x string) {
-	_ = x
-}
--- lib_test.go --
-package lib
-
-import "testing"
-
-type testStruct struct{
-	name string
-}
-
-func TestHello(t *testing.T) {
-	testStructs := []*testStruct{
-		&testStruct{"hello"},
-		&testStruct{"goodbye"},
-	}
-	for y := range testStructs {
-		_ = y
-	}
-}
-`
-
-	Run(t, testPackage, func(t *testing.T, env *Env) {
-		env.OpenFile("lib_test.go")
-		env.Await(
-			DiagnosticAt("lib_test.go", 10, 2),
-			DiagnosticAt("lib_test.go", 11, 2),
-		)
-		env.OpenFile("lib.go")
-		env.RegexpReplace("lib.go", "_ = x", "var y int")
-		env.Await(
-			env.DiagnosticAtRegexp("lib.go", "y int"),
-			EmptyDiagnostics("lib_test.go"),
-		)
-	})
-}
-
-// Tests golang/go#38328.
-func TestPackageChange_Issue38328(t *testing.T) {
-	const packageChange = `
--- go.mod --
-module fake
-
-go 1.12
--- a.go --
-package foo
-func main() {}
-`
-	Run(t, packageChange, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		env.RegexpReplace("a.go", "foo", "foox")
-		env.Await(
-			// When the bug reported in #38328 was present, we didn't get erroneous
-			// file diagnostics until after the didChange message generated by the
-			// package renaming was fully processed. Therefore, in order for this
-			// test to actually exercise the bug, we must wait until that work has
-			// completed.
-			OnceMet(
-				env.DoneWithChange(),
-				NoDiagnostics("a.go"),
-			),
-		)
-	})
-}
-
-const testPackageWithRequire = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require foo.test v1.2.3
--- go.sum --
-foo.test v1.2.3 h1:TMA+lyd1ck0TqjSFpNe4T6cf/K6TYkoHwOOcMBMjaEw=
-foo.test v1.2.3/go.mod h1:Ij3kyLIe5lzjycjh13NL8I2gX0quZuTdW0MnmlwGBL4=
--- print.go --
-package lib
-
-import (
-	"fmt"
-
-	"foo.test/bar"
-)
-
-func PrintAnswer() {
-	fmt.Printf("answer: %s", bar.Answer)
-}
-`
-
-const testPackageWithRequireProxy = `
--- foo.test@v1.2.3/go.mod --
-module foo.test
-
-go 1.12
--- foo.test@v1.2.3/bar/const.go --
-package bar
-
-const Answer = 42
-`
-
-func TestResolveDiagnosticWithDownload(t *testing.T) {
-	WithOptions(
-		ProxyFiles(testPackageWithRequireProxy),
-	).Run(t, testPackageWithRequire, func(t *testing.T, env *Env) {
-		env.OpenFile("print.go")
-		// Check that gopackages correctly loaded this dependency. We should get a
-		// diagnostic for the wrong formatting type.
-		// TODO: we should be able to easily also match the diagnostic message.
-		env.Await(env.DiagnosticAtRegexp("print.go", "fmt.Printf"))
-	})
-}
-
-func TestMissingDependency(t *testing.T) {
-	Run(t, testPackageWithRequire, func(t *testing.T, env *Env) {
-		env.OpenFile("print.go")
-		env.Await(LogMatching(protocol.Error, "initial workspace load failed", 1, false))
-	})
-}
-
-// Tests golang/go#36951.
-func TestAdHocPackages_Issue36951(t *testing.T) {
-	const adHoc = `
--- b/b.go --
-package b
-
-func Hello() {
-	var x int
-}
-`
-	Run(t, adHoc, func(t *testing.T, env *Env) {
-		env.OpenFile("b/b.go")
-		env.Await(env.DiagnosticAtRegexp("b/b.go", "x"))
-	})
-}
-
-// Tests golang/go#37984: GOPATH should be read from the go command.
-func TestNoGOPATH_Issue37984(t *testing.T) {
-	const files = `
--- main.go --
-package main
-
-func _() {
-	fmt.Println("Hello World")
-}
-`
-	WithOptions(
-		EditorConfig{
-			Env: map[string]string{
-				"GOPATH":      "",
-				"GO111MODULE": "off",
-			},
-		}).Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.Await(env.DiagnosticAtRegexp("main.go", "fmt"))
-		env.SaveBuffer("main.go")
-		env.Await(EmptyDiagnostics("main.go"))
-	})
-}
-
-// Tests golang/go#38669.
-func TestEqualInEnv_Issue38669(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-var _ = x.X
--- x/x.go --
-package x
-
-var X = 0
-`
-	editorConfig := EditorConfig{Env: map[string]string{"GOFLAGS": "-tags=foo"}}
-	WithOptions(editorConfig).Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.OrganizeImports("main.go")
-		env.Await(EmptyDiagnostics("main.go"))
-	})
-}
-
-// Tests golang/go#38467.
-func TestNoSuggestedFixesForGeneratedFiles_Issue38467(t *testing.T) {
-	const generated = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-// Code generated by generator.go. DO NOT EDIT.
-
-func _() {
-	for i, _ := range []string{} {
-		_ = i
-	}
-}
-`
-	Run(t, generated, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				DiagnosticAt("main.go", 5, 8),
-				ReadDiagnostics("main.go", &d),
-			),
-		)
-		if fixes := env.GetQuickFixes("main.go", d.Diagnostics); len(fixes) != 0 {
-			t.Errorf("got quick fixes %v, wanted none", fixes)
-		}
-	})
-}
-
-// Expect a module/GOPATH error if there is an error in the file at startup.
-// Tests golang/go#37279.
-func TestShowCriticalError_Issue37279(t *testing.T) {
-	const noModule = `
--- a.go --
-package foo
-
-import "mod.com/hello"
-
-func f() {
-	hello.Goodbye()
-}
-`
-	Run(t, noModule, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		env.Await(
-			OutstandingWork(lsp.WorkspaceLoadFailure, "outside of a module"),
-		)
-		env.RegexpReplace("a.go", `import "mod.com/hello"`, "")
-		env.Await(
-			NoOutstandingWork(),
-		)
-	})
-}
-
-func TestNonGoFolder(t *testing.T) {
-	const files = `
--- hello.txt --
-hi mom
-`
-	for _, go111module := range []string{"on", "off", ""} {
-		t.Run(fmt.Sprintf("GO111MODULE_%v", go111module), func(t *testing.T) {
-			WithOptions(EditorConfig{
-				Env: map[string]string{"GO111MODULE": go111module},
-			}).Run(t, files, func(t *testing.T, env *Env) {
-				env.Await(
-					NoOutstandingWork(),
-				)
-			})
-		})
-	}
-}
-
-// Tests the repro case from golang/go#38602. Diagnostics are now handled properly,
-// which blocks type checking.
-func TestConflictingMainPackageErrors(t *testing.T) {
-	const collision = `
--- x/x.go --
-package x
-
-import "x/hello"
-
-func Hello() {
-	hello.HiThere()
-}
--- x/main.go --
-package main
-
-func main() {
-	fmt.Println("")
-}
-`
-	WithOptions(
-		InGOPATH(),
-		EditorConfig{
-			Env: map[string]string{
-				"GO111MODULE": "off",
-			},
-		},
-	).Run(t, collision, func(t *testing.T, env *Env) {
-		env.OpenFile("x/x.go")
-		env.Await(
-			env.DiagnosticAtRegexpWithMessage("x/x.go", `^`, "found packages main (main.go) and x (x.go)"),
-			env.DiagnosticAtRegexpWithMessage("x/main.go", `^`, "found packages main (main.go) and x (x.go)"),
-		)
-
-		// We don't recover cleanly from the errors without good overlay support.
-		if testenv.Go1Point() >= 16 {
-			env.RegexpReplace("x/x.go", `package x`, `package main`)
-			env.Await(OnceMet(
-				env.DoneWithChange(),
-				env.DiagnosticAtRegexpWithMessage("x/main.go", `fmt`, "undeclared name")))
-		}
-	})
-}
-
-const ardanLabsProxy = `
--- github.com/ardanlabs/conf@v1.2.3/go.mod --
-module github.com/ardanlabs/conf
-
-go 1.12
--- github.com/ardanlabs/conf@v1.2.3/conf.go --
-package conf
-
-var ErrHelpWanted error
-`
-
-// Test for golang/go#38211.
-func Test_Issue38211(t *testing.T) {
-	t.Skipf("Skipping flaky test: https://golang.org/issue/44098")
-
-	testenv.NeedsGo1Point(t, 14)
-	const ardanLabs = `
--- go.mod --
-module mod.com
-
-go 1.14
--- main.go --
-package main
-
-import "github.com/ardanlabs/conf"
-
-func main() {
-	_ = conf.ErrHelpWanted
-}
-`
-	WithOptions(
-		ProxyFiles(ardanLabsProxy),
-	).Run(t, ardanLabs, func(t *testing.T, env *Env) {
-		// Expect a diagnostic with a suggested fix to add
-		// "github.com/ardanlabs/conf" to the go.mod file.
-		env.OpenFile("go.mod")
-		env.OpenFile("main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexp("main.go", `"github.com/ardanlabs/conf"`),
-				ReadDiagnostics("main.go", &d),
-			),
-		)
-		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.SaveBuffer("go.mod")
-		env.Await(
-			EmptyDiagnostics("main.go"),
-		)
-		// Comment out the line that depends on conf and expect a
-		// diagnostic and a fix to remove the import.
-		env.RegexpReplace("main.go", "_ = conf.ErrHelpWanted", "//_ = conf.ErrHelpWanted")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", `"github.com/ardanlabs/conf"`),
-		)
-		env.SaveBuffer("main.go")
-		// Expect a diagnostic and fix to remove the dependency in the go.mod.
-		env.Await(EmptyDiagnostics("main.go"))
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexpWithMessage("go.mod", "require github.com/ardanlabs/conf", "not used in this module"),
-				ReadDiagnostics("go.mod", &d),
-			),
-		)
-		env.ApplyQuickFixes("go.mod", d.Diagnostics)
-		env.SaveBuffer("go.mod")
-		env.Await(
-			EmptyDiagnostics("go.mod"),
-		)
-		// Uncomment the lines and expect a new diagnostic for the import.
-		env.RegexpReplace("main.go", "//_ = conf.ErrHelpWanted", "_ = conf.ErrHelpWanted")
-		env.SaveBuffer("main.go")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", `"github.com/ardanlabs/conf"`),
-		)
-	})
-}
-
-// Test for golang/go#38207.
-func TestNewModule_Issue38207(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	const emptyFile = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-`
-	WithOptions(
-		ProxyFiles(ardanLabsProxy),
-	).Run(t, emptyFile, func(t *testing.T, env *Env) {
-		env.CreateBuffer("main.go", `package main
-
-import "github.com/ardanlabs/conf"
-
-func main() {
-	_ = conf.ErrHelpWanted
-}
-`)
-		env.SaveBuffer("main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexpWithMessage("main.go", `"github.com/ardanlabs/conf"`, "no required module"),
-				ReadDiagnostics("main.go", &d),
-			),
-		)
-		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.Await(
-			EmptyDiagnostics("main.go"),
-		)
-	})
-}
-
-// Test for golang/go#36960.
-func TestNewFileBadImports_Issue36960(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	const simplePackage = `
--- go.mod --
-module mod.com
-
-go 1.14
--- a/a1.go --
-package a
-
-import "fmt"
-
-func _() {
-	fmt.Println("hi")
-}
-`
-	Run(t, simplePackage, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a1.go")
-		env.CreateBuffer("a/a2.go", ``)
-		env.SaveBufferWithoutActions("a/a2.go")
-		env.Await(
-			OnceMet(
-				env.DoneWithSave(),
-				NoDiagnostics("a/a1.go"),
-			),
-		)
-		env.EditBuffer("a/a2.go", fake.NewEdit(0, 0, 0, 0, `package a`))
-		env.Await(
-			OnceMet(env.DoneWithChange(), NoDiagnostics("a/a1.go")),
-		)
-	})
-}
-
-// This test tries to replicate the workflow of a user creating a new x test.
-// It also tests golang/go#39315.
-func TestManuallyCreatingXTest(t *testing.T) {
-	// Only for 1.15 because of golang/go#37971.
-	testenv.NeedsGo1Point(t, 15)
-
-	// Create a package that already has a test variant (in-package test).
-	const testVariant = `
--- go.mod --
-module mod.com
-
-go 1.15
--- hello/hello.go --
-package hello
-
-func Hello() {
-	var x int
-}
--- hello/hello_test.go --
-package hello
-
-import "testing"
-
-func TestHello(t *testing.T) {
-	var x int
-	Hello()
-}
-`
-	Run(t, testVariant, func(t *testing.T, env *Env) {
-		// Open the file, triggering the workspace load.
-		// There are errors in the code to ensure all is working as expected.
-		env.OpenFile("hello/hello.go")
-		env.Await(
-			env.DiagnosticAtRegexp("hello/hello.go", "x"),
-			env.DiagnosticAtRegexp("hello/hello_test.go", "x"),
-		)
-
-		// Create an empty file with the intention of making it an x test.
-		// This resembles a typical flow in an editor like VS Code, in which
-		// a user would create an empty file and add content, saving
-		// intermittently.
-		// TODO(rstambler): There might be more edge cases here, as file
-		// content can be added incrementally.
-		env.CreateBuffer("hello/hello_x_test.go", ``)
-
-		// Save the empty file (no actions since formatting will fail).
-		env.SaveBufferWithoutActions("hello/hello_x_test.go")
-
-		// Add the content. The missing import is for the package under test.
-		env.EditBuffer("hello/hello_x_test.go", fake.NewEdit(0, 0, 0, 0, `package hello_test
-
-import (
-	"testing"
-)
-
-func TestHello(t *testing.T) {
-	hello.Hello()
-}
-`))
-		// Expect a diagnostic for the missing import. Save, which should
-		// trigger import organization. The diagnostic should clear.
-		env.Await(
-			env.DiagnosticAtRegexp("hello/hello_x_test.go", "hello.Hello"),
-		)
-		env.SaveBuffer("hello/hello_x_test.go")
-		env.Await(
-			EmptyDiagnostics("hello/hello_x_test.go"),
-		)
-	})
-}
-
-// Reproduce golang/go#40690.
-func TestCreateOnlyXTest(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- foo/foo.go --
-package foo
--- foo/bar_test.go --
-`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("foo/bar_test.go")
-		env.EditBuffer("foo/bar_test.go", fake.NewEdit(0, 0, 0, 0, "package foo"))
-		env.Await(env.DoneWithChange())
-		env.RegexpReplace("foo/bar_test.go", "package foo", `package foo_test
-
-import "testing"
-
-func TestX(t *testing.T) {
-	var x int
-}
-`)
-		env.Await(
-			env.DiagnosticAtRegexp("foo/bar_test.go", "x"),
-		)
-	})
-}
-
-func TestChangePackageName(t *testing.T) {
-	t.Skip("This issue hasn't been fixed yet. See golang.org/issue/41061.")
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- foo/foo.go --
-package foo
--- foo/bar_test.go --
-package foo_
-`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("foo/bar_test.go")
-		env.RegexpReplace("foo/bar_test.go", "package foo_", "package foo_test")
-		env.SaveBuffer("foo/bar_test.go")
-		env.Await(
-			OnceMet(
-				env.DoneWithSave(),
-				NoDiagnostics("foo/bar_test.go"),
-			),
-			OnceMet(
-				env.DoneWithSave(),
-				NoDiagnostics("foo/foo.go"),
-			),
-		)
-	})
-}
-
-func TestIgnoredFiles(t *testing.T) {
-	const ws = `
--- go.mod --
-module mod.com
-
-go 1.12
--- _foo/x.go --
-package x
-
-var _ = foo.Bar
-`
-	Run(t, ws, func(t *testing.T, env *Env) {
-		env.OpenFile("_foo/x.go")
-		env.Await(
-			OnceMet(
-				env.DoneWithOpen(),
-				NoDiagnostics("_foo/x.go"),
-			))
-	})
-}
-
-// Partially reproduces golang/go#38977, moving a file between packages.
-// It also gets hit by some go command bug fixed in 1.15, but we don't
-// care about that so much here.
-func TestDeletePackage(t *testing.T) {
-	const ws = `
--- go.mod --
-module mod.com
-
-go 1.15
--- a/a.go --
-package a
-
-const A = 1
-
--- b/b.go --
-package b
-
-import "mod.com/a"
-
-const B = a.A
-
--- c/c.go --
-package c
-
-import "mod.com/a"
-
-const C = a.A
-`
-	Run(t, ws, func(t *testing.T, env *Env) {
-		env.OpenFile("b/b.go")
-		env.Await(env.DoneWithOpen())
-		// Delete c/c.go, the only file in package c.
-		env.RemoveWorkspaceFile("c/c.go")
-
-		// We should still get diagnostics for files that exist.
-		env.RegexpReplace("b/b.go", `a.A`, "a.Nonexistant")
-		env.Await(env.DiagnosticAtRegexp("b/b.go", `Nonexistant`))
-	})
-}
-
-// This is a copy of the scenario_default/quickfix_empty_files.txt test from
-// govim. Reproduces golang/go#39646.
-func TestQuickFixEmptyFiles(t *testing.T) {
-	t.Skip("too flaky: golang/go#48773")
-
-	testenv.NeedsGo1Point(t, 15)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-`
-	// To fully recreate the govim tests, we create files by inserting
-	// a newline, adding to the file, and then deleting the newline.
-	// Wait for each event to process to avoid cancellations and force
-	// package loads.
-	writeGoVim := func(env *Env, name, content string) {
-		env.WriteWorkspaceFile(name, "")
-		env.Await(env.DoneWithChangeWatchedFiles())
-
-		env.CreateBuffer(name, "\n")
-		env.Await(env.DoneWithOpen())
-
-		env.EditBuffer(name, fake.NewEdit(1, 0, 1, 0, content))
-		env.Await(env.DoneWithChange())
-
-		env.EditBuffer(name, fake.NewEdit(0, 0, 1, 0, ""))
-		env.Await(env.DoneWithChange())
-	}
-
-	const p = `package p; func DoIt(s string) {};`
-	const main = `package main
-
-import "mod.com/p"
-
-func main() {
-	p.DoIt(5)
-}
-`
-	// A simple version of the test that reproduces most of the problems it
-	// exposes.
-	t.Run("short", func(t *testing.T) {
-		Run(t, mod, func(t *testing.T, env *Env) {
-			writeGoVim(env, "p/p.go", p)
-			writeGoVim(env, "main.go", main)
-			env.Await(env.DiagnosticAtRegexp("main.go", "5"))
-		})
-	})
-
-	// A full version that replicates the whole flow of the test.
-	t.Run("full", func(t *testing.T) {
-		Run(t, mod, func(t *testing.T, env *Env) {
-			writeGoVim(env, "p/p.go", p)
-			writeGoVim(env, "main.go", main)
-			writeGoVim(env, "p/p_test.go", `package p
-
-import "testing"
-
-func TestDoIt(t *testing.T) {
-	DoIt(5)
-}
-`)
-			writeGoVim(env, "p/x_test.go", `package p_test
-
-import (
-	"testing"
-
-	"mod.com/p"
-)
-
-func TestDoIt(t *testing.T) {
-	p.DoIt(5)
-}
-`)
-			env.Await(
-				env.DiagnosticAtRegexp("main.go", "5"),
-				env.DiagnosticAtRegexp("p/p_test.go", "5"),
-				env.DiagnosticAtRegexp("p/x_test.go", "5"),
-			)
-			env.RegexpReplace("p/p.go", "s string", "i int")
-			env.Await(
-				EmptyDiagnostics("main.go"),
-				EmptyDiagnostics("p/p_test.go"),
-				EmptyDiagnostics("p/x_test.go"),
-			)
-		})
-	})
-}
-
-func TestSingleFile(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.13
--- a/a.go --
-package a
-
-func _() {
-	var x int
-}
-`
-	WithOptions(
-		// Empty workspace folders.
-		WorkspaceFolders(),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		env.Await(
-			env.DiagnosticAtRegexp("a/a.go", "x"),
-		)
-	})
-}
-
-// Reproduces the case described in
-// https://github.com/golang/go/issues/39296#issuecomment-652058883.
-func TestPkgm(t *testing.T) {
-	const basic = `
--- go.mod --
-module mod.com
-
-go 1.15
--- foo/foo.go --
-package foo
-
-import "fmt"
-
-func Foo() {
-	fmt.Println("")
-}
-`
-	Run(t, basic, func(t *testing.T, env *Env) {
-		testenv.NeedsGo1Point(t, 16) // We can't recover cleanly from this case without good overlay support.
-
-		env.WriteWorkspaceFile("foo/foo_test.go", `package main
-
-func main() {
-
-}`)
-		env.OpenFile("foo/foo_test.go")
-		env.RegexpReplace("foo/foo_test.go", `package main`, `package foo`)
-		env.Await(
-			OnceMet(
-				env.DoneWithChange(),
-				NoDiagnostics("foo/foo.go"),
-			),
-		)
-	})
-}
-
-func TestClosingBuffer(t *testing.T) {
-	const basic = `
--- go.mod --
-module mod.com
-
-go 1.14
--- main.go --
-package main
-
-func main() {}
-`
-	Run(t, basic, func(t *testing.T, env *Env) {
-		env.Editor.CreateBuffer(env.Ctx, "foo.go", `package main`)
-		env.Await(
-			env.DoneWithOpen(),
-		)
-		env.CloseBuffer("foo.go")
-		env.Await(
-			OnceMet(
-				env.DoneWithClose(),
-				NoLogMatching(protocol.Info, "packages=0"),
-			),
-		)
-	})
-}
-
-// Reproduces golang/go#38424.
-func TestCutAndPaste(t *testing.T) {
-	const basic = `
--- go.mod --
-module mod.com
-
-go 1.14
--- main2.go --
-package main
-`
-	Run(t, basic, func(t *testing.T, env *Env) {
-		env.CreateBuffer("main.go", "")
-		env.Await(env.DoneWithOpen())
-
-		env.SaveBufferWithoutActions("main.go")
-		env.Await(env.DoneWithSave(), env.DoneWithChangeWatchedFiles())
-
-		env.EditBuffer("main.go", fake.NewEdit(0, 0, 0, 0, `package main
-
-func main() {
-}
-`))
-		env.Await(env.DoneWithChange())
-
-		env.SaveBuffer("main.go")
-		env.Await(env.DoneWithSave(), env.DoneWithChangeWatchedFiles())
-
-		env.EditBuffer("main.go", fake.NewEdit(0, 0, 4, 0, ""))
-		env.Await(env.DoneWithChange())
-
-		env.EditBuffer("main.go", fake.NewEdit(0, 0, 0, 0, `package main
-
-func main() {
-	var x int
-}
-`))
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", "x"),
-		)
-	})
-}
-
-// Reproduces golang/go#39763.
-func TestInvalidPackageName(t *testing.T) {
-	testenv.NeedsGo1Point(t, 15)
-
-	const pkgDefault = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package default
-
-func main() {}
-`
-	Run(t, pkgDefault, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.Await(
-			env.DiagnosticAtRegexpWithMessage("main.go", "default", "expected 'IDENT'"),
-		)
-	})
-}
-
-// This tests the functionality of the "limitWorkspaceScope"
-func TestLimitWorkspaceScope(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a/main.go --
-package main
-
-func main() {}
--- main.go --
-package main
-
-func main() {
-	var x int
-}
-`
-	WithOptions(
-		WorkspaceFolders("a"),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("a/main.go")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", "x"),
-		)
-	})
-	WithOptions(
-		WorkspaceFolders("a"),
-		LimitWorkspaceScope(),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("a/main.go")
-		env.Await(
-			NoDiagnostics("main.go"),
-		)
-	})
-}
-
-func TestSimplifyCompositeLitDiagnostic(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-type t struct {
-	msg string
-}
-
-func main() {
-	x := []t{t{"msg"}}
-	fmt.Println(x)
-}
-`
-
-	WithOptions(
-		EditorConfig{EnableStaticcheck: true},
-	).Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(OnceMet(
-			env.DiagnosticAtRegexpWithMessage("main.go", `t{"msg"}`, "redundant type"),
-			ReadDiagnostics("main.go", &d),
-		))
-		if tags := d.Diagnostics[0].Tags; len(tags) == 0 || tags[0] != protocol.Unnecessary {
-			t.Errorf("wanted Unnecessary tag on diagnostic, got %v", tags)
-		}
-		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.Await(EmptyDiagnostics("main.go"))
-	})
-}
-
-// Test some secondary diagnostics
-func TestSecondaryDiagnostics(t *testing.T) {
-	const dir = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-func main() {
-	panic("not here")
-}
--- other.go --
-package main
-func main() {}
-`
-	Run(t, dir, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.OpenFile("other.go")
-		x := env.DiagnosticsFor("main.go")
-		if x == nil {
-			t.Fatalf("expected 1 diagnostic, got none")
-		}
-		if len(x.Diagnostics) != 1 {
-			t.Fatalf("main.go, got %d diagnostics, expected 1", len(x.Diagnostics))
-		}
-		keep := x.Diagnostics[0]
-		y := env.DiagnosticsFor("other.go")
-		if len(y.Diagnostics) != 1 {
-			t.Fatalf("other.go: got %d diagnostics, expected 1", len(y.Diagnostics))
-		}
-		if len(y.Diagnostics[0].RelatedInformation) != 1 {
-			t.Fatalf("got %d RelatedInformations, expected 1", len(y.Diagnostics[0].RelatedInformation))
-		}
-		// check that the RelatedInformation matches the error from main.go
-		c := y.Diagnostics[0].RelatedInformation[0]
-		if c.Location.Range != keep.Range {
-			t.Errorf("locations don't match. Got %v expected %v", c.Location.Range, keep.Range)
-		}
-	})
-}
-
-func TestNotifyOrphanedFiles(t *testing.T) {
-	// Need GO111MODULE=on for this test to work with Go 1.12.
-	testenv.NeedsGo1Point(t, 13)
-
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a/a.go --
-package a
-
-func main() {
-	var x int
-}
--- a/a_ignore.go --
-// +build ignore
-
-package a
-
-func _() {
-	var x int
-}
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		env.Await(
-			env.DiagnosticAtRegexp("a/a.go", "x"),
-		)
-		env.OpenFile("a/a_ignore.go")
-		env.Await(
-			DiagnosticAt("a/a_ignore.go", 2, 8),
-		)
-	})
-}
-
-func TestEnableAllExperiments(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "bytes"
-
-func b(c bytes.Buffer) {
-	_ = 1
-}
-`
-	WithOptions(
-		EditorConfig{
-			AllExperiments: true,
-		},
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		// Confirm that the setting doesn't cause any warnings.
-		env.Await(NoShowMessage())
-	})
-}
-
-func TestSwig(t *testing.T) {
-	// This is fixed in Go 1.17, but not earlier.
-	testenv.NeedsGo1Point(t, 17)
-
-	if _, err := exec.LookPath("swig"); err != nil {
-		t.Skip("skipping test: swig not available")
-	}
-	if _, err := exec.LookPath("g++"); err != nil {
-		t.Skip("skipping test: g++ not available")
-	}
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- pkg/simple/export_swig.go --
-package simple
-
-func ExportSimple(x, y int) int {
-	return Gcd(x, y)
-}
--- pkg/simple/simple.swigcxx --
-%module simple
-
-%inline %{
-extern int gcd(int x, int y)
-{
-  int g;
-  g = y;
-  while (x > 0) {
-    g = x;
-    x = y % x;
-    y = g;
-  }
-  return g;
-}
-%}
--- main.go --
-package a
-
-func main() {
-	var x int
-}
-`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.Await(
-			OnceMet(
-				InitialWorkspaceLoad,
-				NoDiagnosticWithMessage("", "illegal character U+0023 '#'"),
-			),
-		)
-	})
-}
-
-// When foo_test.go is opened, gopls will object to the borked package name.
-// This test asserts that when the package name is fixed, gopls will soon after
-// have no more complaints about it.
-// https://github.com/golang/go/issues/41061
-func TestRenamePackage(t *testing.T) {
-	testenv.NeedsGo1Point(t, 16)
-
-	const proxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-const Name = "Blah"
--- random.org@v1.2.3/go.mod --
-module random.org
-
-go 1.12
--- random.org@v1.2.3/blah/blah.go --
-package hello
-
-const Name = "Hello"
-`
-
-	const contents = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	blah.Hello()
-}
--- bob.go --
-package main
--- foo/foo.go --
-package foo
--- foo/foo_test.go --
-package foo_
-`
-
-	WithOptions(
-		ProxyFiles(proxy),
-		InGOPATH(),
-		EditorConfig{
-			Env: map[string]string{
-				"GO111MODULE": "off",
-			},
-		},
-	).Run(t, contents, func(t *testing.T, env *Env) {
-		// Simulate typing character by character.
-		env.OpenFile("foo/foo_test.go")
-		env.Await(env.DoneWithOpen())
-		env.RegexpReplace("foo/foo_test.go", "_", "_t")
-		env.Await(env.DoneWithChange())
-		env.RegexpReplace("foo/foo_test.go", "_t", "_test")
-		env.Await(env.DoneWithChange())
-
-		env.Await(
-			EmptyDiagnostics("foo/foo_test.go"),
-			NoOutstandingWork(),
-		)
-	})
-}
-
-// TestProgressBarErrors confirms that critical workspace load errors are shown
-// and updated via progress reports.
-func TestProgressBarErrors(t *testing.T) {
-	t.Skip("too flaky: golang/go#46930")
-	testenv.NeedsGo1Point(t, 14)
-
-	const pkg = `
--- go.mod --
-modul mod.com
-
-go 1.12
--- main.go --
-package main
-`
-	Run(t, pkg, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		env.Await(
-			OutstandingWork(lsp.WorkspaceLoadFailure, "unknown directive"),
-		)
-		env.EditBuffer("go.mod", fake.NewEdit(0, 0, 3, 0, `module mod.com
-
-go 1.hello
-`))
-		// As of golang/go#42529, go.mod changes do not reload the workspace until
-		// they are saved.
-		env.SaveBufferWithoutActions("go.mod")
-		env.Await(
-			OutstandingWork(lsp.WorkspaceLoadFailure, "invalid go version"),
-		)
-		env.RegexpReplace("go.mod", "go 1.hello", "go 1.12")
-		env.SaveBufferWithoutActions("go.mod")
-		env.Await(
-			NoOutstandingWork(),
-		)
-	})
-}
-
-func TestDeleteDirectory(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- bob/bob.go --
-package bob
-
-func Hello() {
-	var x int
-}
--- go.mod --
-module mod.com
--- main.go --
-package main
-
-import "mod.com/bob"
-
-func main() {
-	bob.Hello()
-}
-`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.RemoveWorkspaceFile("bob")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", `"mod.com/bob"`),
-			EmptyDiagnostics("bob/bob.go"),
-			RegistrationMatching("didChangeWatchedFiles"),
-		)
-	})
-}
-
-// Confirms that circular imports are tested and reported.
-func TestCircularImports(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- self/self.go --
-package self
-
-import _ "mod.com/self"
-func Hello() {}
--- double/a/a.go --
-package a
-
-import _ "mod.com/double/b"
--- double/b/b.go --
-package b
-
-import _ "mod.com/double/a"
--- triple/a/a.go --
-package a
-
-import _ "mod.com/triple/b"
--- triple/b/b.go --
-package b
-
-import _ "mod.com/triple/c"
--- triple/c/c.go --
-package c
-
-import _ "mod.com/triple/a"
-`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexpWithMessage("self/self.go", `_ "mod.com/self"`, "import cycle not allowed"),
-			env.DiagnosticAtRegexpWithMessage("double/a/a.go", `_ "mod.com/double/b"`, "import cycle not allowed"),
-			env.DiagnosticAtRegexpWithMessage("triple/a/a.go", `_ "mod.com/triple/b"`, "import cycle not allowed"),
-		)
-	})
-}
-
-// Tests golang/go#46667: deleting a problematic import path should resolve
-// import cycle errors.
-func TestResolveImportCycle(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.test
-
-go 1.16
--- a/a.go --
-package a
-
-import "mod.test/b"
-
-const A = b.A
-const B = 2
--- b/b.go --
-package b
-
-import "mod.test/a"
-
-const A = 1
-const B = a.B
-	`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		env.OpenFile("b/b.go")
-		env.Await(env.DiagnosticAtRegexp("a/a.go", `"mod.test/b"`))
-		env.RegexpReplace("b/b.go", `const B = a\.B`, "")
-		env.SaveBuffer("b/b.go")
-		env.Await(
-			EmptyOrNoDiagnostics("a/a.go"),
-			EmptyOrNoDiagnostics("b/b.go"),
-		)
-	})
-}
-
-func TestBadImport(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import (
-	_ "nosuchpkg"
-)
-`
-	t.Run("module", func(t *testing.T) {
-		Run(t, mod, func(t *testing.T, env *Env) {
-			env.Await(
-				env.DiagnosticAtRegexpWithMessage("main.go", `"nosuchpkg"`, `could not import nosuchpkg (no required module provides package "nosuchpkg"`),
-			)
-		})
-	})
-	t.Run("GOPATH", func(t *testing.T) {
-		WithOptions(
-			InGOPATH(),
-			EditorConfig{
-				Env: map[string]string{"GO111MODULE": "off"},
-			},
-			Modes(Singleton),
-		).Run(t, mod, func(t *testing.T, env *Env) {
-			env.Await(
-				env.DiagnosticAtRegexpWithMessage("main.go", `"nosuchpkg"`, `cannot find package "nosuchpkg" in any of`),
-			)
-		})
-	})
-}
-
-func TestMultipleModules_Warning(t *testing.T) {
-	const modules = `
--- a/go.mod --
-module a.com
-
-go 1.12
--- a/a.go --
-package a
--- b/go.mod --
-module b.com
-
-go 1.12
--- b/b.go --
-package b
-`
-	for _, go111module := range []string{"on", "auto"} {
-		t.Run("GO111MODULE="+go111module, func(t *testing.T) {
-			WithOptions(
-				Modes(Singleton),
-				EditorConfig{
-					Env: map[string]string{
-						"GO111MODULE": go111module,
-					},
-				},
-			).Run(t, modules, func(t *testing.T, env *Env) {
-				env.OpenFile("a/a.go")
-				env.OpenFile("b/go.mod")
-				env.Await(
-					env.DiagnosticAtRegexp("a/a.go", "package a"),
-					env.DiagnosticAtRegexp("b/go.mod", "module b.com"),
-					OutstandingWork(lsp.WorkspaceLoadFailure, "gopls requires a module at the root of your workspace."),
-				)
-			})
-		})
-	}
-
-	// Expect no warning if GO111MODULE=auto in a directory in GOPATH.
-	t.Run("GOPATH_GO111MODULE_auto", func(t *testing.T) {
-		WithOptions(
-			Modes(Singleton),
-			EditorConfig{
-				Env: map[string]string{
-					"GO111MODULE": "auto",
-				},
-			},
-			InGOPATH(),
-		).Run(t, modules, func(t *testing.T, env *Env) {
-			env.OpenFile("a/a.go")
-			env.Await(
-				OnceMet(
-					env.DoneWithOpen(),
-					NoDiagnostics("a/a.go"),
-				),
-				NoOutstandingWork(),
-			)
-		})
-	})
-}
-
-func TestNestedModules(t *testing.T) {
-	const proxy = `
--- nested.com@v1.0.0/go.mod --
-module nested.com
-
-go 1.12
--- nested.com@v1.0.0/hello/hello.go --
-package hello
-
-func Hello() {}
-`
-
-	const nested = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require nested.com v1.0.0
--- go.sum --
-nested.com v1.0.0 h1:I6spLE4CgFqMdBPc+wTV2asDO2QJ3tU0YAT+jkLeN1I=
-nested.com v1.0.0/go.mod h1:ly53UzXQgVjSlV7wicdBB4p8BxfytuGT1Xcyv0ReJfI=
--- main.go --
-package main
-
-import "nested.com/hello"
-
-func main() {
-	hello.Hello()
-}
--- nested/go.mod --
-module nested.com
-
--- nested/hello/hello.go --
-package hello
-
-func Hello() {
-	helloHelper()
-}
--- nested/hello/hello_helper.go --
-package hello
-
-func helloHelper() {}
-`
-	WithOptions(
-		ProxyFiles(proxy),
-		Modes(Singleton),
-	).Run(t, nested, func(t *testing.T, env *Env) {
-		// Expect a diagnostic in a nested module.
-		env.OpenFile("nested/hello/hello.go")
-		didOpen := env.DoneWithOpen()
-		env.Await(
-			OnceMet(
-				didOpen,
-				env.DiagnosticAtRegexp("nested/hello/hello.go", "helloHelper"),
-			),
-			OnceMet(
-				didOpen,
-				env.DiagnosticAtRegexpWithMessage("nested/hello/hello.go", "package hello", "nested module"),
-			),
-			OnceMet(
-				didOpen,
-				OutstandingWork(lsp.WorkspaceLoadFailure, "nested module"),
-			),
-		)
-	})
-}
-
-func TestAdHocPackagesReloading(t *testing.T) {
-	const nomod = `
--- main.go --
-package main
-
-func main() {}
-`
-	Run(t, nomod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.RegexpReplace("main.go", "{}", "{ var x int; }") // simulate typing
-		env.Await(
-			OnceMet(
-				env.DoneWithChange(),
-				NoLogMatching(protocol.Info, "packages=1"),
-			),
-		)
-	})
-}
-
-func TestBuildTagChange(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- foo.go --
-// decoy comment
-// +build hidden
-// decoy comment
-
-package foo
-var Foo = 1
--- bar.go --
-package foo
-var Bar = Foo
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("foo.go")
-		env.Await(env.DiagnosticAtRegexpWithMessage("bar.go", `Foo`, "undeclared name"))
-		env.RegexpReplace("foo.go", `\+build`, "")
-		env.Await(EmptyDiagnostics("bar.go"))
-	})
-
-}
-
-func TestIssue44736(t *testing.T) {
-	const files = `
-	-- go.mod --
-module blah.com
-
-go 1.16
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	asdf
-	fmt.Printf("This is a test %v")
-	fdas
-}
--- other.go --
-package main
-
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.OpenFile("other.go")
-		env.Await(
-			env.DiagnosticAtRegexpWithMessage("main.go", "asdf", "undeclared name"),
-			env.DiagnosticAtRegexpWithMessage("main.go", "fdas", "undeclared name"),
-		)
-		env.SetBufferContent("other.go", "package main\n\nasdf")
-		// The new diagnostic in other.go should not suppress diagnostics in main.go.
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexpWithMessage("other.go", "asdf", "expected declaration"),
-				env.DiagnosticAtRegexpWithMessage("main.go", "asdf", "undeclared name"),
-			),
-		)
-	})
-}
-
-func TestInitialization(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.16
--- main.go --
-package main
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		env.Await(env.DoneWithOpen())
-		env.RegexpReplace("go.mod", "module", "modul")
-		env.SaveBufferWithoutActions("go.mod")
-		env.Await(
-			OnceMet(
-				env.DoneWithSave(),
-				NoLogMatching(protocol.Error, "initial workspace load failed"),
-			),
-		)
-	})
-}
-
-// Tests golang/go#45075: A panic in fillreturns broke diagnostics.
-// Expect an error log indicating that fillreturns panicked, as well type
-// errors for the broken code.
-func TestFillReturnsPanic(t *testing.T) {
-	// At tip, the panic no longer reproduces.
-	testenv.SkipAfterGo1Point(t, 16)
-
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.15
--- main.go --
-package main
-
-func foo() int {
-	return x, nil
-}
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.Await(
-			OnceMet(
-				env.DoneWithOpen(),
-				LogMatching(protocol.Error, `.*analysis fillreturns.*panicked.*`, 1, true),
-				env.DiagnosticAtRegexpWithMessage("main.go", `return x`, "wrong number of return values"),
-			),
-		)
-	})
-}
-
-// This test confirms that the view does not reinitialize when a go.mod file is
-// opened.
-func TestNoReinitialize(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func main() {}
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		env.Await(
-			OnceMet(
-				env.DoneWithOpen(),
-				LogMatching(protocol.Info, `.*query=\[builtin mod.com/...\].*`, 1, false),
-			),
-		)
-	})
-}
-
-func TestUseOfInvalidMetadata(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import (
-	"mod.com/a"
-	//"os"
-)
-
-func _() {
-	a.Hello()
-	os.Getenv("")
-	//var x int
-}
--- a/a.go --
-package a
-
-func Hello() {}
-`
-	WithOptions(
-		EditorConfig{
-			ExperimentalUseInvalidMetadata: true,
-		},
-		Modes(Singleton),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		env.RegexpReplace("go.mod", "module mod.com", "modul mod.com") // break the go.mod file
-		env.SaveBufferWithoutActions("go.mod")
-		env.Await(
-			env.DiagnosticAtRegexp("go.mod", "modul"),
-		)
-		// Confirm that language features work with invalid metadata.
-		env.OpenFile("main.go")
-		file, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", "Hello"))
-		wantPos := env.RegexpSearch("a/a.go", "Hello")
-		if file != "a/a.go" && pos != wantPos {
-			t.Fatalf("expected a/a.go:%s, got %s:%s", wantPos, file, pos)
-		}
-		// Confirm that new diagnostics appear with invalid metadata by adding
-		// an unused variable to the body of the function.
-		env.RegexpReplace("main.go", "//var x int", "var x int")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", "x"),
-		)
-		// Add an import and confirm that we get a diagnostic for it, since the
-		// metadata will not have been updated.
-		env.RegexpReplace("main.go", "//\"os\"", "\"os\"")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", `"os"`),
-		)
-		// Fix the go.mod file and expect the diagnostic to resolve itself.
-		env.RegexpReplace("go.mod", "modul mod.com", "module mod.com")
-		env.SaveBuffer("go.mod")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", "x"),
-			env.NoDiagnosticAtRegexp("main.go", `"os"`),
-			EmptyDiagnostics("go.mod"),
-		)
-	})
-}
-
-func TestReloadInvalidMetadata(t *testing.T) {
-	// We only use invalid metadata for Go versions > 1.12.
-	testenv.NeedsGo1Point(t, 13)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func _() {}
-`
-	WithOptions(
-		EditorConfig{
-			ExperimentalUseInvalidMetadata: true,
-		},
-		// ExperimentalWorkspaceModule has a different failure mode for this
-		// case.
-		Modes(Singleton),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.Await(
-			OnceMet(
-				InitialWorkspaceLoad,
-				CompletedWork("Load", 1, false),
-			),
-		)
-
-		// Break the go.mod file on disk, expecting a reload.
-		env.WriteWorkspaceFile("go.mod", `modul mod.com
-
-go 1.12
-`)
-		env.Await(
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				env.DiagnosticAtRegexp("go.mod", "modul"),
-				CompletedWork("Load", 1, false),
-			),
-		)
-
-		env.OpenFile("main.go")
-		env.Await(env.DoneWithOpen())
-		// The first edit after the go.mod file invalidation should cause a reload.
-		// Any subsequent simple edits should not.
-		content := `package main
-
-func main() {
-	_ = 1
-}
-`
-		env.EditBuffer("main.go", fake.NewEdit(0, 0, 3, 0, content))
-		env.Await(
-			OnceMet(
-				env.DoneWithChange(),
-				CompletedWork("Load", 2, false),
-				NoLogMatching(protocol.Error, "error loading file"),
-			),
-		)
-		env.RegexpReplace("main.go", "_ = 1", "_ = 2")
-		env.Await(
-			OnceMet(
-				env.DoneWithChange(),
-				CompletedWork("Load", 2, false),
-				NoLogMatching(protocol.Error, "error loading file"),
-			),
-		)
-		// Add an import to the main.go file and confirm that it does get
-		// reloaded, but the reload fails, so we see a diagnostic on the new
-		// "fmt" import.
-		env.EditBuffer("main.go", fake.NewEdit(0, 0, 5, 0, `package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("")
-}
-`))
-		env.Await(
-			OnceMet(
-				env.DoneWithChange(),
-				env.DiagnosticAtRegexp("main.go", `"fmt"`),
-				CompletedWork("Load", 3, false),
-			),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/diagnostics/undeclared_test.go b/gopls/internal/regtest/diagnostics/undeclared_test.go
--- a/gopls/internal/regtest/diagnostics/undeclared_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/diagnostics/undeclared_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,67 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package diagnostics
-
-import (
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestUndeclaredDiagnostics(t *testing.T) {
-	src := `
--- go.mod --
-module mod.com
-
-go 1.12
--- a/a.go --
-package a
-
-func _() int {
-	return x
-}
--- b/b.go --
-package b
-
-func _() int {
-	var y int
-	y = y
-	return y
-}
-`
-	Run(t, src, func(t *testing.T, env *Env) {
-		isUnnecessary := func(diag protocol.Diagnostic) bool {
-			for _, tag := range diag.Tags {
-				if tag == protocol.Unnecessary {
-					return true
-				}
-			}
-			return false
-		}
-
-		// 'x' is undeclared, but still necessary.
-		env.OpenFile("a/a.go")
-		env.Await(env.DiagnosticAtRegexp("a/a.go", "x"))
-		diags := env.DiagnosticsFor("a/a.go")
-		if got := len(diags.Diagnostics); got != 1 {
-			t.Errorf("len(Diagnostics) = %d, want 1", got)
-		}
-		if diag := diags.Diagnostics[0]; isUnnecessary(diag) {
-			t.Errorf("%v tagged unnecessary, want necessary", diag)
-		}
-
-		// 'y = y' is pointless, and should be detected as unnecessary.
-		env.OpenFile("b/b.go")
-		env.Await(env.DiagnosticAtRegexp("b/b.go", "y = y"))
-		diags = env.DiagnosticsFor("b/b.go")
-		if got := len(diags.Diagnostics); got != 1 {
-			t.Errorf("len(Diagnostics) = %d, want 1", got)
-		}
-		if diag := diags.Diagnostics[0]; !isUnnecessary(diag) {
-			t.Errorf("%v tagged necessary, want unnecessary", diag)
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/add_import_test.go b/gopls/internal/regtest/misc/add_import_test.go
--- a/gopls/internal/regtest/misc/add_import_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/add_import_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,59 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/command"
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-	"golang.org/x/tools/internal/lsp/tests"
-)
-
-func TestAddImport(t *testing.T) {
-	const before = `package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("hello world")
-}
-`
-
-	const want = `package main
-
-import (
-	"bytes"
-	"fmt"
-)
-
-func main() {
-	fmt.Println("hello world")
-}
-`
-
-	Run(t, "", func(t *testing.T, env *Env) {
-		env.CreateBuffer("main.go", before)
-		cmd, err := command.NewAddImportCommand("Add Import", command.AddImportArgs{
-			URI:        protocol.URIFromSpanURI(env.Sandbox.Workdir.URI("main.go").SpanURI()),
-			ImportPath: "bytes",
-		})
-		if err != nil {
-			t.Fatal(err)
-		}
-		_, err = env.Editor.ExecuteCommand(env.Ctx, &protocol.ExecuteCommandParams{
-			Command:   "gopls.add_import",
-			Arguments: cmd.Arguments,
-		})
-		if err != nil {
-			t.Fatal(err)
-		}
-		got := env.Editor.BufferText("main.go")
-		if got != want {
-			t.Fatalf("gopls.add_import failed\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/call_hierarchy_test.go b/gopls/internal/regtest/misc/call_hierarchy_test.go
--- a/gopls/internal/regtest/misc/call_hierarchy_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/call_hierarchy_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,35 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package misc
-
-import (
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-// Test for golang/go#49125
-func TestCallHierarchy_Issue49125(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- p.go --
-package pkg
-`
-	// TODO(rfindley): this could probably just be a marker test.
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("p.go")
-		pos := env.RegexpSearch("p.go", "pkg")
-
-		var params protocol.CallHierarchyPrepareParams
-		params.TextDocument.URI = env.Sandbox.Workdir.URI("p.go")
-		params.Position = pos.ToProtocolPosition()
-
-		// Check that this doesn't panic.
-		env.Editor.Server.PrepareCallHierarchy(env.Ctx, &params)
-	})
-}
diff -urN a/gopls/internal/regtest/misc/configuration_test.go b/gopls/internal/regtest/misc/configuration_test.go
--- a/gopls/internal/regtest/misc/configuration_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/configuration_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,49 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/testenv"
-)
-
-// Test that enabling and disabling produces the expected results of showing
-// and hiding staticcheck analysis results.
-func TestChangeConfiguration(t *testing.T) {
-	// Staticcheck only supports Go versions > 1.14.
-	testenv.NeedsGo1Point(t, 15)
-
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a/a.go --
-package a
-
-import "errors"
-
-// FooErr should be called ErrFoo (ST1012)
-var FooErr = errors.New("foo")
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		env.Await(
-			env.DoneWithOpen(),
-			NoDiagnostics("a/a.go"),
-		)
-		cfg := &fake.EditorConfig{}
-		*cfg = env.Editor.Config
-		cfg.EnableStaticcheck = true
-		env.ChangeConfiguration(t, cfg)
-		env.Await(
-			DiagnosticAt("a/a.go", 5, 4),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/misc/debugserver_test.go b/gopls/internal/regtest/misc/debugserver_test.go
--- a/gopls/internal/regtest/misc/debugserver_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/debugserver_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,46 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"net/http"
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/command"
-	"golang.org/x/tools/internal/lsp/protocol"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestStartDebugging(t *testing.T) {
-	WithOptions(
-		Modes(Forwarded),
-	).Run(t, "", func(t *testing.T, env *Env) {
-		args, err := command.MarshalArgs(command.DebuggingArgs{})
-		if err != nil {
-			t.Fatal(err)
-		}
-		params := &protocol.ExecuteCommandParams{
-			Command:   command.StartDebugging.ID(),
-			Arguments: args,
-		}
-		var result command.DebuggingResult
-		env.ExecuteCommand(params, &result)
-		if got, want := len(result.URLs), 2; got != want {
-			t.Fatalf("got %d urls, want %d; urls: %#v", got, want, result.URLs)
-		}
-		for i, u := range result.URLs {
-			resp, err := http.Get(u)
-			if err != nil {
-				t.Errorf("getting url #%d (%q): %v", i, u, err)
-				continue
-			}
-			defer resp.Body.Close()
-			if got, want := resp.StatusCode, http.StatusOK; got != want {
-				t.Errorf("debug server #%d returned HTTP %d, want %d", i, got, want)
-			}
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/definition_test.go b/gopls/internal/regtest/misc/definition_test.go
--- a/gopls/internal/regtest/misc/definition_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/definition_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,291 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"path"
-	"strings"
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-	"golang.org/x/tools/internal/testenv"
-
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/lsp/tests"
-)
-
-const internalDefinition = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Println(message)
-}
--- const.go --
-package main
-
-const message = "Hello World."
-`
-
-func TestGoToInternalDefinition(t *testing.T) {
-	Run(t, internalDefinition, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		name, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", "message"))
-		if want := "const.go"; name != want {
-			t.Errorf("GoToDefinition: got file %q, want %q", name, want)
-		}
-		if want := env.RegexpSearch("const.go", "message"); pos != want {
-			t.Errorf("GoToDefinition: got position %v, want %v", pos, want)
-		}
-	})
-}
-
-const stdlibDefinition = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Printf()
-}`
-
-func TestGoToStdlibDefinition_Issue37045(t *testing.T) {
-	Run(t, stdlibDefinition, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		name, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `fmt.(Printf)`))
-		if got, want := path.Base(name), "print.go"; got != want {
-			t.Errorf("GoToDefinition: got file %q, want %q", name, want)
-		}
-
-		// Test that we can jump to definition from outside our workspace.
-		// See golang.org/issues/37045.
-		newName, newPos := env.GoToDefinition(name, pos)
-		if newName != name {
-			t.Errorf("GoToDefinition is not idempotent: got %q, want %q", newName, name)
-		}
-		if newPos != pos {
-			t.Errorf("GoToDefinition is not idempotent: got %v, want %v", newPos, pos)
-		}
-	})
-}
-
-func TestUnexportedStdlib_Issue40809(t *testing.T) {
-	Run(t, stdlibDefinition, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		name, _ := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `fmt.(Printf)`))
-		env.OpenFile(name)
-
-		pos := env.RegexpSearch(name, `:=\s*(newPrinter)\(\)`)
-
-		// Check that we can find references on a reference
-		refs := env.References(name, pos)
-		if len(refs) < 5 {
-			t.Errorf("expected 5+ references to newPrinter, found: %#v", refs)
-		}
-
-		name, pos = env.GoToDefinition(name, pos)
-		content, _ := env.Hover(name, pos)
-		if !strings.Contains(content.Value, "newPrinter") {
-			t.Fatal("definition of newPrinter went to the incorrect place")
-		}
-		// And on the definition too.
-		refs = env.References(name, pos)
-		if len(refs) < 5 {
-			t.Errorf("expected 5+ references to newPrinter, found: %#v", refs)
-		}
-	})
-}
-
-// Test the hover on an error's Error function.
-// This can't be done via the marker tests because Error is a builtin.
-func TestHoverOnError(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func main() {
-	var err error
-	err.Error()
-}`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		content, _ := env.Hover("main.go", env.RegexpSearch("main.go", "Error"))
-		if content == nil {
-			t.Fatalf("nil hover content for Error")
-		}
-		want := "```go\nfunc (error).Error() string\n```"
-		if content.Value != want {
-			t.Fatalf("hover failed:\n%s", tests.Diff(t, want, content.Value))
-		}
-	})
-}
-
-func TestImportShortcut(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-func main() {}
-`
-	for _, tt := range []struct {
-		wantLinks      int
-		wantDef        bool
-		importShortcut string
-	}{
-		{1, false, "Link"},
-		{0, true, "Definition"},
-		{1, true, "Both"},
-	} {
-		t.Run(tt.importShortcut, func(t *testing.T) {
-			WithOptions(
-				EditorConfig{
-					ImportShortcut: tt.importShortcut,
-				},
-			).Run(t, mod, func(t *testing.T, env *Env) {
-				env.OpenFile("main.go")
-				file, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `"fmt"`))
-				if !tt.wantDef && (file != "" || pos != (fake.Pos{})) {
-					t.Fatalf("expected no definition, got one: %s:%v", file, pos)
-				} else if tt.wantDef && file == "" && pos == (fake.Pos{}) {
-					t.Fatalf("expected definition, got none")
-				}
-				links := env.DocumentLink("main.go")
-				if len(links) != tt.wantLinks {
-					t.Fatalf("expected %v links, got %v", tt.wantLinks, len(links))
-				}
-			})
-		})
-	}
-}
-
-func TestGoToTypeDefinition_Issue38589(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-type Int int
-
-type Struct struct{}
-
-func F1() {}
-func F2() (int, error) { return 0, nil }
-func F3() (**Struct, bool, *Int, error) { return nil, false, nil, nil }
-func F4() (**Struct, bool, *float64, error) { return nil, false, nil, nil }
-
-func main() {}
-`
-
-	for _, tt := range []struct {
-		re         string
-		wantError  bool
-		wantTypeRe string
-	}{
-		{re: `F1`, wantError: true},
-		{re: `F2`, wantError: true},
-		{re: `F3`, wantError: true},
-		{re: `F4`, wantError: false, wantTypeRe: `type (Struct)`},
-	} {
-		t.Run(tt.re, func(t *testing.T) {
-			Run(t, mod, func(t *testing.T, env *Env) {
-				env.OpenFile("main.go")
-
-				_, pos, err := env.Editor.GoToTypeDefinition(env.Ctx, "main.go", env.RegexpSearch("main.go", tt.re))
-				if tt.wantError {
-					if err == nil {
-						t.Fatal("expected error, got nil")
-					}
-					return
-				}
-				if err != nil {
-					t.Fatalf("expected nil error, got %s", err)
-				}
-
-				typePos := env.RegexpSearch("main.go", tt.wantTypeRe)
-				if pos != typePos {
-					t.Errorf("invalid pos: want %+v, got %+v", typePos, pos)
-				}
-			})
-		})
-	}
-}
-
-// Test for golang/go#47825.
-func TestImportTestVariant(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- client/test/role.go --
-package test
-
-import _ "mod.com/client"
-
-type RoleSetup struct{}
--- client/client_role_test.go --
-package client_test
-
-import (
-	"testing"
-	_ "mod.com/client"
-	ctest "mod.com/client/test"
-)
-
-func TestClient(t *testing.T) {
-	_ = ctest.RoleSetup{}
-}
--- client/client_test.go --
-package client
-
-import "testing"
-
-func TestClient(t *testing.T) {}
--- client.go --
-package client
-`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("client/client_role_test.go")
-		env.GoToDefinition("client/client_role_test.go", env.RegexpSearch("client/client_role_test.go", "RoleSetup"))
-	})
-}
-
-// This test exercises a crashing pattern from golang/go#49223.
-func TestGoToCrashingDefinition_Issue49223(t *testing.T) {
-	Run(t, "", func(t *testing.T, env *Env) {
-		params := &protocol.DefinitionParams{}
-		params.TextDocument.URI = protocol.DocumentURI("fugitive%3A///Users/user/src/mm/ems/.git//0/pkg/domain/treasury/provider.go")
-		params.Position.Character = 18
-		params.Position.Line = 0
-		env.Editor.Server.Definition(env.Ctx, params)
-	})
-}
diff -urN a/gopls/internal/regtest/misc/embed_test.go b/gopls/internal/regtest/misc/embed_test.go
--- a/gopls/internal/regtest/misc/embed_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/embed_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,37 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMissingPatternDiagnostic(t *testing.T) {
-	testenv.NeedsGo1Point(t, 16)
-	const files = `
--- go.mod --
-module example.com
--- x.go --
-package x
-
-import (
-	_ "embed"
-)
-
-// Issue 47436
-func F() {}
-
-//go:embed NONEXISTENT
-var foo string
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("x.go")
-		env.Await(env.DiagnosticAtRegexpWithMessage("x.go", `NONEXISTENT`, "no matching files found"))
-		env.RegexpReplace("x.go", `NONEXISTENT`, "x.go")
-		env.Await(EmptyDiagnostics("x.go"))
-	})
-}
diff -urN a/gopls/internal/regtest/misc/failures_test.go b/gopls/internal/regtest/misc/failures_test.go
--- a/gopls/internal/regtest/misc/failures_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/failures_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,70 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-// This test passes (TestHoverOnError in definition_test.go) without
-// the //line directive
-func TestHoverFailure(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a.y --
-DWIM(main)
-
--- main.go --
-//line a.y:1
-package main
-
-func main() {
-	var err error
-	err.Error()
-}`
-	WithOptions(SkipLogs()).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		content, _ := env.Hover("main.go", env.RegexpSearch("main.go", "Error"))
-		// without the //line comment content would be non-nil
-		if content != nil {
-			t.Fatalf("expected nil hover content for Error")
-		}
-	})
-}
-
-// badPackageDup contains a duplicate definition of the 'a' const.
-// this is from diagnostics_test.go,
-const badPackageDup = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a.go --
-package consts
-
-const a = 1
--- b.go --
-package consts
-//line gen.go:5
-const a = 2
-`
-
-func TestFailingDiagnosticClearingOnEdit(t *testing.T) {
-	Run(t, badPackageDup, func(t *testing.T, env *Env) {
-		env.OpenFile("b.go")
-		// no diagnostics for any files, but there should be
-		env.Await(NoDiagnostics("a.go"), NoDiagnostics("b.go"))
-
-		// Fix the error by editing the const name in b.go to `b`.
-		env.RegexpReplace("b.go", "(a) = 2", "b")
-
-		// The diagnostics that weren't sent above should now be cleared.
-	})
-}
diff -urN a/gopls/internal/regtest/misc/fix_test.go b/gopls/internal/regtest/misc/fix_test.go
--- a/gopls/internal/regtest/misc/fix_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/fix_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,107 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/lsp/tests"
-)
-
-// A basic test for fillstruct, now that it uses a command.
-func TestFillStruct(t *testing.T) {
-	const basic = `
--- go.mod --
-module mod.com
-
-go 1.14
--- main.go --
-package main
-
-type Info struct {
-	WordCounts map[string]int
-	Words []string
-}
-
-func Foo() {
-	_ = Info{}
-}
-`
-	Run(t, basic, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		pos := env.RegexpSearch("main.go", "Info{}").ToProtocolPosition()
-		if err := env.Editor.RefactorRewrite(env.Ctx, "main.go", &protocol.Range{
-			Start: pos,
-			End:   pos,
-		}); err != nil {
-			t.Fatal(err)
-		}
-		want := `package main
-
-type Info struct {
-	WordCounts map[string]int
-	Words []string
-}
-
-func Foo() {
-	_ = Info{
-		WordCounts: map[string]int{},
-		Words:      []string{},
-	}
-}
-`
-		if got := env.Editor.BufferText("main.go"); got != want {
-			t.Fatalf("TestFillStruct failed:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-func TestFillReturns(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func Foo() error {
-	return
-}
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(OnceMet(
-			// The error message here changed in 1.18; "return values" covers both forms.
-			env.DiagnosticAtRegexpWithMessage("main.go", `return`, "return values"),
-			ReadDiagnostics("main.go", &d),
-		))
-		codeActions := env.CodeAction("main.go", d.Diagnostics)
-		if len(codeActions) != 2 {
-			t.Fatalf("expected 2 code actions, got %v", len(codeActions))
-		}
-		var foundQuickFix, foundFixAll bool
-		for _, a := range codeActions {
-			if a.Kind == protocol.QuickFix {
-				foundQuickFix = true
-			}
-			if a.Kind == protocol.SourceFixAll {
-				foundFixAll = true
-			}
-		}
-		if !foundQuickFix {
-			t.Fatalf("expected quickfix code action, got none")
-		}
-		if !foundFixAll {
-			t.Fatalf("expected fixall code action, got none")
-		}
-		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.Await(EmptyDiagnostics("main.go"))
-	})
-}
diff -urN a/gopls/internal/regtest/misc/formatting_test.go b/gopls/internal/regtest/misc/formatting_test.go
--- a/gopls/internal/regtest/misc/formatting_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/formatting_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,303 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"strings"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/tests"
-)
-
-const unformattedProgram = `
--- main.go --
-package main
-import "fmt"
-func main(  ) {
-	fmt.Println("Hello World.")
-}
--- main.go.golden --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("Hello World.")
-}
-`
-
-func TestFormatting(t *testing.T) {
-	Run(t, unformattedProgram, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.FormatBuffer("main.go")
-		got := env.Editor.BufferText("main.go")
-		want := env.ReadWorkspaceFile("main.go.golden")
-		if got != want {
-			t.Errorf("unexpected formatting result:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-// Tests golang/go#36824.
-func TestFormattingOneLine36824(t *testing.T) {
-	const onelineProgram = `
--- a.go --
-package main; func f() {}
-
--- a.go.formatted --
-package main
-
-func f() {}
-`
-	Run(t, onelineProgram, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		env.FormatBuffer("a.go")
-		got := env.Editor.BufferText("a.go")
-		want := env.ReadWorkspaceFile("a.go.formatted")
-		if got != want {
-			t.Errorf("unexpected formatting result:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-// Tests golang/go#36824.
-func TestFormattingOneLineImports36824(t *testing.T) {
-	const onelineProgramA = `
--- a.go --
-package x; func f() {fmt.Println()}
-
--- a.go.imported --
-package x
-
-import "fmt"
-
-func f() { fmt.Println() }
-`
-	Run(t, onelineProgramA, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		env.OrganizeImports("a.go")
-		got := env.Editor.BufferText("a.go")
-		want := env.ReadWorkspaceFile("a.go.imported")
-		if got != want {
-			t.Errorf("unexpected formatting result:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-func TestFormattingOneLineRmImports36824(t *testing.T) {
-	const onelineProgramB = `
--- a.go --
-package x; import "os"; func f() {}
-
--- a.go.imported --
-package x
-
-func f() {}
-`
-	Run(t, onelineProgramB, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		env.OrganizeImports("a.go")
-		got := env.Editor.BufferText("a.go")
-		want := env.ReadWorkspaceFile("a.go.imported")
-		if got != want {
-			t.Errorf("unexpected formatting result:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-const disorganizedProgram = `
--- main.go --
-package main
-
-import (
-	"fmt"
-	"errors"
-)
-func main(  ) {
-	fmt.Println(errors.New("bad"))
-}
--- main.go.organized --
-package main
-
-import (
-	"errors"
-	"fmt"
-)
-func main(  ) {
-	fmt.Println(errors.New("bad"))
-}
--- main.go.formatted --
-package main
-
-import (
-	"errors"
-	"fmt"
-)
-
-func main() {
-	fmt.Println(errors.New("bad"))
-}
-`
-
-func TestOrganizeImports(t *testing.T) {
-	Run(t, disorganizedProgram, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.OrganizeImports("main.go")
-		got := env.Editor.BufferText("main.go")
-		want := env.ReadWorkspaceFile("main.go.organized")
-		if got != want {
-			t.Errorf("unexpected formatting result:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-func TestFormattingOnSave(t *testing.T) {
-	Run(t, disorganizedProgram, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.SaveBuffer("main.go")
-		got := env.Editor.BufferText("main.go")
-		want := env.ReadWorkspaceFile("main.go.formatted")
-		if got != want {
-			t.Errorf("unexpected formatting result:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-// Tests various possibilities for comments in files with CRLF line endings.
-// Import organization in these files has historically been a source of bugs.
-func TestCRLFLineEndings(t *testing.T) {
-	for _, tt := range []struct {
-		issue, input, want string
-	}{
-		{
-			issue: "41057",
-			want: `package main
-
-/*
-Hi description
-*/
-func Hi() {
-}
-`,
-		},
-		{
-			issue: "42646",
-			want: `package main
-
-import (
-	"fmt"
-)
-
-/*
-func upload(c echo.Context) error {
-	if err := r.ParseForm(); err != nil {
-		fmt.Fprintf(w, "ParseForm() err: %v", err)
-		return
-	}
-	fmt.Fprintf(w, "POST request successful")
-	path_ver := r.FormValue("path_ver")
-	ukclin_ver := r.FormValue("ukclin_ver")
-
-	fmt.Fprintf(w, "Name = %s\n", path_ver)
-	fmt.Fprintf(w, "Address = %s\n", ukclin_ver)
-}
-*/
-
-func main() {
-	const server_port = 8080
-	fmt.Printf("port: %d\n", server_port)
-}
-`,
-		},
-		{
-			issue: "42923",
-			want: `package main
-
-// Line 1.
-// aa
-type Tree struct {
-	arr []string
-}
-`,
-		},
-		{
-			issue: "47200",
-			input: `package main
-
-import "fmt"
-
-func main() {
-	math.Sqrt(9)
-	fmt.Println("hello")
-}
-`,
-			want: `package main
-
-import (
-	"fmt"
-	"math"
-)
-
-func main() {
-	math.Sqrt(9)
-	fmt.Println("hello")
-}
-`,
-		},
-	} {
-		t.Run(tt.issue, func(t *testing.T) {
-			Run(t, "-- main.go --", func(t *testing.T, env *Env) {
-				input := tt.input
-				if input == "" {
-					input = tt.want
-				}
-				crlf := strings.ReplaceAll(input, "\n", "\r\n")
-				env.CreateBuffer("main.go", crlf)
-				env.Await(env.DoneWithOpen())
-				env.OrganizeImports("main.go")
-				got := env.Editor.BufferText("main.go")
-				got = strings.ReplaceAll(got, "\r\n", "\n") // convert everything to LF for simplicity
-				if tt.want != got {
-					t.Errorf("unexpected content after save:\n%s", tests.Diff(t, tt.want, got))
-				}
-			})
-		})
-	}
-}
-
-func TestFormattingOfGeneratedFile_Issue49555(t *testing.T) {
-	const input = `
--- main.go --
-// Code generated by generator.go. DO NOT EDIT.
-
-package main
-
-import "fmt"
-
-func main() {
-
-
-
-
-	fmt.Print("hello")
-}
-`
-
-	Run(t, input, func(t *testing.T, env *Env) {
-		wantErrSuffix := "file is generated"
-
-		env.OpenFile("main.go")
-		err := env.Editor.FormatBuffer(env.Ctx, "main.go")
-		if err == nil {
-			t.Fatal("expected error, got nil")
-		}
-		// Check only the suffix because an error contains a dynamic path to main.go
-		if !strings.HasSuffix(err.Error(), wantErrSuffix) {
-			t.Fatalf("unexpected error %q, want suffix %q", err.Error(), wantErrSuffix)
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/generate_test.go b/gopls/internal/regtest/misc/generate_test.go
--- a/gopls/internal/regtest/misc/generate_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/generate_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,75 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// TODO(rfindley): figure out why go generate fails on android builders.
-
-//go:build !android
-// +build !android
-
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestGenerateProgress(t *testing.T) {
-	t.Skipf("skipping flaky test: https://golang.org/issue/49901")
-
-	const generatedWorkspace = `
--- go.mod --
-module fake.test
-
-go 1.14
--- generate.go --
-// +build ignore
-
-package main
-
-import (
-	"io/ioutil"
-	"os"
-)
-
-func main() {
-	ioutil.WriteFile("generated.go", []byte("package " + os.Args[1] + "\n\nconst Answer = 21"), 0644)
-}
-
--- lib1/lib.go --
-package lib1
-
-//go:generate go run ../generate.go lib1
-
--- lib2/lib.go --
-package lib2
-
-//go:generate go run ../generate.go lib2
-
--- main.go --
-package main
-
-import (
-	"fake.test/lib1"
-	"fake.test/lib2"
-)
-
-func main() {
-	println(lib1.Answer + lib2.Answer)
-}
-`
-
-	Run(t, generatedWorkspace, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", "lib1.(Answer)"),
-		)
-		env.RunGenerate("./lib1")
-		env.RunGenerate("./lib2")
-		env.Await(
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				EmptyDiagnostics("main.go")),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/misc/highlight_test.go b/gopls/internal/regtest/misc/highlight_test.go
--- a/gopls/internal/regtest/misc/highlight_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/highlight_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,151 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"sort"
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestWorkspacePackageHighlight(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func main() {
-	var A string = "A"
-	x := "x-" + A
-	println(A, x)
-}`
-
-	Run(t, mod, func(t *testing.T, env *Env) {
-		const file = "main.go"
-		env.OpenFile(file)
-		_, pos := env.GoToDefinition(file, env.RegexpSearch(file, `var (A) string`))
-
-		checkHighlights(env, file, pos, 3)
-	})
-}
-
-func TestStdPackageHighlight_Issue43511(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Printf()
-}`
-
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		file, _ := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `fmt\.(Printf)`))
-		pos := env.RegexpSearch(file, `func Printf\((format) string`)
-
-		checkHighlights(env, file, pos, 2)
-	})
-}
-
-func TestThirdPartyPackageHighlight_Issue43511(t *testing.T) {
-	const proxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/global/global.go --
-package global
-
-const A = 1
-
-func foo() {
-	_ = A
-}
-
-func bar() int {
-	return A + A
-}
--- example.com@v1.2.3/local/local.go --
-package local
-
-func foo() int {
-	const b = 2
-
-	return b * b * (b+1) + b
-}`
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require example.com v1.2.3
--- go.sum --
-example.com v1.2.3 h1:WFzrgiQJwEDJNLDUOV1f9qlasQkvzXf2UNLaNIqbWsI=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- main.go --
-package main
-
-import (
-	_ "example.com/global"
-	_ "example.com/local"
-)
-
-func main() {}`
-
-	WithOptions(
-		ProxyFiles(proxy),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-
-		file, _ := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `"example.com/global"`))
-		pos := env.RegexpSearch(file, `const (A)`)
-		checkHighlights(env, file, pos, 4)
-
-		file, _ = env.GoToDefinition("main.go", env.RegexpSearch("main.go", `"example.com/local"`))
-		pos = env.RegexpSearch(file, `const (b)`)
-		checkHighlights(env, file, pos, 5)
-	})
-}
-
-func checkHighlights(env *Env, file string, pos fake.Pos, highlightCount int) {
-	t := env.T
-	t.Helper()
-
-	highlights := env.DocumentHighlight(file, pos)
-	if len(highlights) != highlightCount {
-		t.Fatalf("expected %v highlight(s), got %v", highlightCount, len(highlights))
-	}
-
-	references := env.References(file, pos)
-	if len(highlights) != len(references) {
-		t.Fatalf("number of highlights and references is expected to be equal: %v != %v", len(highlights), len(references))
-	}
-
-	sort.Slice(highlights, func(i, j int) bool {
-		return protocol.CompareRange(highlights[i].Range, highlights[j].Range) < 0
-	})
-	sort.Slice(references, func(i, j int) bool {
-		return protocol.CompareRange(references[i].Range, references[j].Range) < 0
-	})
-	for i := range highlights {
-		if highlights[i].Range != references[i].Range {
-			t.Errorf("highlight and reference ranges are expected to be equal: %v != %v", highlights[i].Range, references[i].Range)
-		}
-	}
-}
diff -urN a/gopls/internal/regtest/misc/hover_test.go b/gopls/internal/regtest/misc/hover_test.go
--- a/gopls/internal/regtest/misc/hover_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/hover_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,132 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"strings"
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/fake"
-	. "golang.org/x/tools/internal/lsp/regtest"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestHoverUnexported(t *testing.T) {
-	const proxy = `
--- golang.org/x/structs@v1.0.0/go.mod --
-module golang.org/x/structs
-
-go 1.12
-
--- golang.org/x/structs@v1.0.0/types.go --
-package structs
-
-type Mixed struct {
-	Exported   int
-	unexported string
-}
-
-func printMixed(m Mixed) {
-	println(m)
-}
-`
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require golang.org/x/structs v1.0.0
--- go.sum --
-golang.org/x/structs v1.0.0 h1:3DlrFfd3OsEen7FnCHfqtnJvjBZ8ZFKmrD/+HjpdJj0=
-golang.org/x/structs v1.0.0/go.mod h1:47gkSIdo5AaQaWJS0upVORsxfEr1LL1MWv9dmYF3iq4=
--- main.go --
-package main
-
-import "golang.org/x/structs"
-
-func main() {
-	var _ structs.Mixed
-}
-`
-	// TODO: use a nested workspace folder here.
-	WithOptions(
-		ProxyFiles(proxy),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		mixedPos := env.RegexpSearch("main.go", "Mixed")
-		got, _ := env.Hover("main.go", mixedPos)
-		if !strings.Contains(got.Value, "unexported") {
-			t.Errorf("Workspace hover: missing expected field 'unexported'. Got:\n%q", got.Value)
-		}
-		cacheFile, _ := env.GoToDefinition("main.go", mixedPos)
-		argPos := env.RegexpSearch(cacheFile, "printMixed.*(Mixed)")
-		got, _ = env.Hover(cacheFile, argPos)
-		if !strings.Contains(got.Value, "unexported") {
-			t.Errorf("Non-workspace hover: missing expected field 'unexported'. Got:\n%q", got.Value)
-		}
-	})
-}
-
-func TestHoverIntLiteral(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-	const source = `
--- main.go --
-package main
-
-var (
-	bigBin = 0b1001001
-)
-
-var hex = 0xe34e
-
-func main() {
-}
-`
-	Run(t, source, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		hexExpected := "58190"
-		got, _ := env.Hover("main.go", env.RegexpSearch("main.go", "hex"))
-		if got != nil && !strings.Contains(got.Value, hexExpected) {
-			t.Errorf("Hover: missing expected field '%s'. Got:\n%q", hexExpected, got.Value)
-		}
-
-		binExpected := "73"
-		got, _ = env.Hover("main.go", env.RegexpSearch("main.go", "bigBin"))
-		if got != nil && !strings.Contains(got.Value, binExpected) {
-			t.Errorf("Hover: missing expected field '%s'. Got:\n%q", binExpected, got.Value)
-		}
-	})
-}
-
-// Tests that hovering does not trigger the panic in golang/go#48249.
-func TestPanicInHoverBrokenCode(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-	const source = `
--- main.go --
-package main
-
-type Example struct`
-	Run(t, source, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.Editor.Hover(env.Ctx, "main.go", env.RegexpSearch("main.go", "Example"))
-	})
-}
-
-func TestHoverRune_48492(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.18
--- main.go --
-package main
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.EditBuffer("main.go", fake.NewEdit(0, 0, 1, 0, "package main\nfunc main() {\nconst x = `\nfoo\n`\n}"))
-		env.Editor.Hover(env.Ctx, "main.go", env.RegexpSearch("main.go", "foo"))
-	})
-}
diff -urN a/gopls/internal/regtest/misc/imports_test.go b/gopls/internal/regtest/misc/imports_test.go
--- a/gopls/internal/regtest/misc/imports_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/imports_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,216 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"io/ioutil"
-	"os"
-	"path/filepath"
-	"strings"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/testenv"
-)
-
-// Tests golang/go#38815.
-func TestIssue38815(t *testing.T) {
-	const needs = `
--- go.mod --
-module foo
-
-go 1.12
--- a.go --
-package main
-func f() {}
-`
-	const ntest = `package main
-func TestZ(t *testing.T) {
-	f()
-}
-`
-	const want = `package main
-
-import "testing"
-
-func TestZ(t *testing.T) {
-	f()
-}
-`
-
-	// it was returning
-	// "package main\nimport \"testing\"\npackage main..."
-	Run(t, needs, func(t *testing.T, env *Env) {
-		env.CreateBuffer("a_test.go", ntest)
-		env.SaveBuffer("a_test.go")
-		got := env.Editor.BufferText("a_test.go")
-		if want != got {
-			t.Errorf("got\n%q, wanted\n%q", got, want)
-		}
-	})
-}
-
-func TestVim1(t *testing.T) {
-	const vim1 = `package main
-
-import "fmt"
-
-var foo = 1
-var bar = 2
-
-func main() {
-	fmt.Printf("This is a test %v\n", foo)
-	fmt.Printf("This is another test %v\n", foo)
-	fmt.Printf("This is also a test %v\n", foo)
-}
-`
-
-	// The file remains unchanged, but if there are any CodeActions returned, they confuse vim.
-	// Therefore check for no CodeActions
-	Run(t, "", func(t *testing.T, env *Env) {
-		env.CreateBuffer("main.go", vim1)
-		env.OrganizeImports("main.go")
-		actions := env.CodeAction("main.go", nil)
-		if len(actions) > 0 {
-			got := env.Editor.BufferText("main.go")
-			t.Errorf("unexpected actions %#v", actions)
-			if got == vim1 {
-				t.Errorf("no changes")
-			} else {
-				t.Errorf("got\n%q", got)
-				t.Errorf("was\n%q", vim1)
-			}
-		}
-	})
-}
-
-func TestVim2(t *testing.T) {
-	const vim2 = `package main
-
-import (
-	"fmt"
-
-	"example.com/blah"
-
-	"rubbish.com/useless"
-)
-
-func main() {
-	fmt.Println(blah.Name, useless.Name)
-}
-`
-
-	Run(t, "", func(t *testing.T, env *Env) {
-		env.CreateBuffer("main.go", vim2)
-		env.OrganizeImports("main.go")
-		actions := env.CodeAction("main.go", nil)
-		if len(actions) > 0 {
-			t.Errorf("unexpected actions %#v", actions)
-		}
-	})
-}
-
-func TestGOMODCACHE(t *testing.T) {
-	const proxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/x/x.go --
-package x
-
-const X = 1
--- example.com@v1.2.3/y/y.go --
-package y
-
-const Y = 2
-`
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require example.com v1.2.3
--- go.sum --
-example.com v1.2.3 h1:6vTQqzX+pnwngZF1+5gcO3ZEWmix1jJ/h+pWS8wUxK0=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- main.go --
-package main
-
-import "example.com/x"
-
-var _, _ = x.X, y.Y
-`
-	testenv.NeedsGo1Point(t, 15)
-
-	modcache, err := ioutil.TempDir("", "TestGOMODCACHE-modcache")
-	if err != nil {
-		t.Fatal(err)
-	}
-	defer os.RemoveAll(modcache)
-	editorConfig := EditorConfig{Env: map[string]string{"GOMODCACHE": modcache}}
-	WithOptions(
-		editorConfig,
-		ProxyFiles(proxy),
-	).Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.Await(env.DiagnosticAtRegexp("main.go", `y.Y`))
-		env.SaveBuffer("main.go")
-		env.Await(EmptyDiagnostics("main.go"))
-		path, _ := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `y.(Y)`))
-		if !strings.HasPrefix(path, filepath.ToSlash(modcache)) {
-			t.Errorf("found module dependency outside of GOMODCACHE: got %v, wanted subdir of %v", path, filepath.ToSlash(modcache))
-		}
-	})
-}
-
-// Tests golang/go#40685.
-func TestAcceptImportsQuickFixTestVariant(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a/a.go --
-package a
-
-import (
-	"fmt"
-)
-
-func _() {
-	fmt.Println("")
-	os.Stat("")
-}
--- a/a_test.go --
-package a
-
-import (
-	"os"
-	"testing"
-)
-
-func TestA(t *testing.T) {
-	os.Stat("")
-}
-`
-	Run(t, pkg, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexp("a/a.go", "os.Stat"),
-				ReadDiagnostics("a/a.go", &d),
-			),
-		)
-		env.ApplyQuickFixes("a/a.go", d.Diagnostics)
-		env.Await(
-			EmptyDiagnostics("a/a.go"),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/misc/link_test.go b/gopls/internal/regtest/misc/link_test.go
--- a/gopls/internal/regtest/misc/link_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/link_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,95 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"strings"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestHoverAndDocumentLink(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-	const program = `
--- go.mod --
-module mod.test
-
-go 1.12
-
-require import.test v1.2.3
--- go.sum --
-import.test v1.2.3 h1:Mu4N9BICLJFxwwn8YNg6T3frkFWW1O7evXvo0HiRjBc=
-import.test v1.2.3/go.mod h1:KooCN1g237upRg7irU7F+3oADn5tVClU8YYW4I1xhMk=
--- main.go --
-package main
-
-import "import.test/pkg"
-
-func main() {
-	println(pkg.Hello)
-}`
-
-	const proxy = `
--- import.test@v1.2.3/go.mod --
-module import.test
-
-go 1.12
--- import.test@v1.2.3/pkg/const.go --
-package pkg
-
-const Hello = "Hello"
-`
-	WithOptions(
-		ProxyFiles(proxy),
-	).Run(t, program, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		env.OpenFile("go.mod")
-
-		modLink := "https://pkg.go.dev/mod/import.test@v1.2.3?utm_source=gopls"
-		pkgLink := "https://pkg.go.dev/import.test@v1.2.3/pkg?utm_source=gopls"
-
-		// First, check that we get the expected links via hover and documentLink.
-		content, _ := env.Hover("main.go", env.RegexpSearch("main.go", "pkg.Hello"))
-		if content == nil || !strings.Contains(content.Value, pkgLink) {
-			t.Errorf("hover: got %v in main.go, want contains %q", content, pkgLink)
-		}
-		content, _ = env.Hover("go.mod", env.RegexpSearch("go.mod", "import.test"))
-		if content == nil || !strings.Contains(content.Value, pkgLink) {
-			t.Errorf("hover: got %v in go.mod, want contains %q", content, pkgLink)
-		}
-		links := env.DocumentLink("main.go")
-		if len(links) != 1 || links[0].Target != pkgLink {
-			t.Errorf("documentLink: got %v for main.go, want link to %q", links, pkgLink)
-		}
-		links = env.DocumentLink("go.mod")
-		if len(links) != 1 || links[0].Target != modLink {
-			t.Errorf("documentLink: got %v for go.mod, want link to %q", links, modLink)
-		}
-
-		// Then change the environment to make these links private.
-		env.ChangeEnv(map[string]string{"GOPRIVATE": "import.test"})
-
-		// Finally, verify that the links are gone.
-		content, _ = env.Hover("main.go", env.RegexpSearch("main.go", "pkg.Hello"))
-		if content == nil || strings.Contains(content.Value, pkgLink) {
-			t.Errorf("hover: got %v in main.go, want non-empty hover without %q", content, pkgLink)
-		}
-		content, _ = env.Hover("go.mod", env.RegexpSearch("go.mod", "import.test"))
-		if content == nil || strings.Contains(content.Value, modLink) {
-			t.Errorf("hover: got %v in go.mod, want contains %q", content, modLink)
-		}
-		links = env.DocumentLink("main.go")
-		if len(links) != 0 {
-			t.Errorf("documentLink: got %d document links for main.go, want 0\nlinks: %v", len(links), links)
-		}
-		links = env.DocumentLink("go.mod")
-		if len(links) != 0 {
-			t.Errorf("documentLink: got %d document links for go.mod, want 0\nlinks: %v", len(links), links)
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/misc_test.go b/gopls/internal/regtest/misc/misc_test.go
--- a/gopls/internal/regtest/misc/misc_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/misc_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,16 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	"golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestMain(m *testing.M) {
-	regtest.Main(m, hooks.Options)
-}
diff -urN a/gopls/internal/regtest/misc/multiple_adhoc_test.go b/gopls/internal/regtest/misc/multiple_adhoc_test.go
--- a/gopls/internal/regtest/misc/multiple_adhoc_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/multiple_adhoc_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,44 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestMultipleAdHocPackages(t *testing.T) {
-	Run(t, `
--- a/a.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("")
-}
--- a/b.go --
-package main
-
-import "fmt"
-
-func main() () {
-	fmt.Println("")
-}
-`, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		if list := env.Completion("a/a.go", env.RegexpSearch("a/a.go", "Println")); list == nil || len(list.Items) == 0 {
-			t.Fatal("expected completions, got none")
-		}
-		env.OpenFile("a/b.go")
-		if list := env.Completion("a/b.go", env.RegexpSearch("a/b.go", "Println")); list == nil || len(list.Items) == 0 {
-			t.Fatal("expected completions, got none")
-		}
-		if list := env.Completion("a/a.go", env.RegexpSearch("a/a.go", "Println")); list == nil || len(list.Items) == 0 {
-			t.Fatal("expected completions, got none")
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/references_test.go b/gopls/internal/regtest/misc/references_test.go
--- a/gopls/internal/regtest/misc/references_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/references_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,83 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestStdlibReferences(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Print()
-}
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		file, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `fmt.(Print)`))
-		refs, err := env.Editor.References(env.Ctx, file, pos)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if len(refs) != 2 {
-			t.Fatalf("got %v reference(s), want 2", len(refs))
-		}
-		// The first reference is guaranteed to be the definition.
-		if got, want := refs[1].URI, env.Sandbox.Workdir.URI("main.go"); got != want {
-			t.Errorf("found reference in %v, wanted %v", got, want)
-		}
-	})
-}
-
-// This reproduces and tests golang/go#48400.
-func TestReferencesPanicOnError(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-type t interface {
-	error
-}
-
-type s struct{}
-
-func (*s) Error() string {
-	return ""
-}
-
-func _() {
-	var s s
-	_ = s.Error()
-}
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		file, pos := env.GoToDefinition("main.go", env.RegexpSearch("main.go", `Error`))
-		refs, err := env.Editor.References(env.Ctx, file, pos)
-		if err == nil {
-			t.Fatalf("expected error for references, instead got %v", refs)
-		}
-		wantErr := "no position for func (error).Error() string"
-		if err.Error() != wantErr {
-			t.Fatalf("expected error with message %s, instead got %s", wantErr, err.Error())
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/rename_test.go b/gopls/internal/regtest/misc/rename_test.go
--- a/gopls/internal/regtest/misc/rename_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/rename_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,58 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"strings"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-// Test for golang/go#47564.
-func TestRenameInTestVariant(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- stringutil/stringutil.go --
-package stringutil
-
-func Identity(s string) string {
-	return s
-}
--- stringutil/stringutil_test.go --
-package stringutil
-
-func TestIdentity(t *testing.T) {
-	if got := Identity("foo"); got != "foo" {
-		t.Errorf("bad")
-	}
-}
--- main.go --
-package main
-
-import (
-	"fmt"
-
-	"mod.com/stringutil"
-)
-
-func main() {
-	fmt.Println(stringutil.Identity("hello world"))
-}
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		pos := env.RegexpSearch("main.go", `stringutil\.(Identity)`)
-		env.Rename("main.go", pos, "Identityx")
-		text := env.Editor.BufferText("stringutil/stringutil_test.go")
-		if !strings.Contains(text, "Identityx") {
-			t.Errorf("stringutil/stringutil_test.go: missing expected token `Identityx` after rename:\n%s", text)
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/semantictokens_test.go b/gopls/internal/regtest/misc/semantictokens_test.go
--- a/gopls/internal/regtest/misc/semantictokens_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/semantictokens_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,44 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestBadURICrash_VSCodeIssue1498(t *testing.T) {
-	const src = `
--- go.mod --
-module example.com
-
-go 1.12
-
--- main.go --
-package main
-
-func main() {}
-
-`
-	WithOptions(
-		Modes(Singleton),
-		EditorConfig{
-			AllExperiments: true,
-		},
-	).Run(t, src, func(t *testing.T, env *Env) {
-		params := &protocol.SemanticTokensParams{}
-		const badURI = "http://foo"
-		params.TextDocument.URI = badURI
-		// This call panicked in the past: golang/vscode-go#1498.
-		if _, err := env.Editor.Server.SemanticTokensFull(env.Ctx, params); err != nil {
-			// Requests to an invalid URI scheme shouldn't result in an error, we
-			// simply don't support this so return empty result. This could be
-			// changed, but for now assert on the current behavior.
-			t.Errorf("SemanticTokensFull(%q): %v", badURI, err)
-		}
-	})
-}
diff -urN a/gopls/internal/regtest/misc/shared_test.go b/gopls/internal/regtest/misc/shared_test.go
--- a/gopls/internal/regtest/misc/shared_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/shared_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,64 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-const sharedProgram = `
--- go.mod --
-module mod
-
-go 1.12
--- main.go --
-package main
-
-import "fmt"
-
-func main() {
-	fmt.Println("Hello World.")
-}`
-
-func runShared(t *testing.T, testFunc func(env1 *Env, env2 *Env)) {
-	// Only run these tests in forwarded modes.
-	modes := DefaultModes() & (Forwarded | SeparateProcess)
-	WithOptions(Modes(modes)).Run(t, sharedProgram, func(t *testing.T, env1 *Env) {
-		// Create a second test session connected to the same workspace and server
-		// as the first.
-		env2 := NewEnv(env1.Ctx, t, env1.Sandbox, env1.Server, env1.Editor.Config, true)
-		env2.Await(InitialWorkspaceLoad)
-		testFunc(env1, env2)
-	})
-}
-
-func TestSimultaneousEdits(t *testing.T) {
-	runShared(t, func(env1 *Env, env2 *Env) {
-		// In editor #1, break fmt.Println as before.
-		env1.OpenFile("main.go")
-		env1.RegexpReplace("main.go", "Printl(n)", "")
-		// In editor #2 remove the closing brace.
-		env2.OpenFile("main.go")
-		env2.RegexpReplace("main.go", "\\)\n(})", "")
-
-		// Now check that we got different diagnostics in each environment.
-		env1.Await(env1.DiagnosticAtRegexp("main.go", "Printl"))
-		env2.Await(env2.DiagnosticAtRegexp("main.go", "$"))
-	})
-}
-
-func TestShutdown(t *testing.T) {
-	runShared(t, func(env1 *Env, env2 *Env) {
-		if err := env1.Editor.Close(env1.Ctx); err != nil {
-			t.Errorf("closing first editor: %v", err)
-		}
-		// Now make an edit in editor #2 to trigger diagnostics.
-		env2.OpenFile("main.go")
-		env2.RegexpReplace("main.go", "\\)\n(})", "")
-		env2.Await(env2.DiagnosticAtRegexp("main.go", "$"))
-	})
-}
diff -urN a/gopls/internal/regtest/misc/vendor_test.go b/gopls/internal/regtest/misc/vendor_test.go
--- a/gopls/internal/regtest/misc/vendor_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/vendor_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,73 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"runtime"
-	"testing"
-
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/testenv"
-)
-
-const basicProxy = `
--- golang.org/x/hello@v1.2.3/go.mod --
-module golang.org/x/hello
-
-go 1.14
--- golang.org/x/hello@v1.2.3/hi/hi.go --
-package hi
-
-var Goodbye error
-`
-
-func TestInconsistentVendoring(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	if runtime.GOOS == "windows" {
-		t.Skipf("skipping test due to flakiness on Windows: https://golang.org/issue/49646")
-	}
-
-	const pkgThatUsesVendoring = `
--- go.mod --
-module mod.com
-
-go 1.14
-
-require golang.org/x/hello v1.2.3
--- go.sum --
-golang.org/x/hello v1.2.3 h1:EcMp5gSkIhaTkPXp8/3+VH+IFqTpk3ZbpOhqk0Ncmho=
-golang.org/x/hello v1.2.3/go.mod h1:WW7ER2MRNXWA6c8/4bDIek4Hc/+DofTrMaQQitGXcco=
--- vendor/modules.txt --
--- a/a1.go --
-package a
-
-import "golang.org/x/hello/hi"
-
-func _() {
-	_ = hi.Goodbye
-	var q int // hardcode a diagnostic
-}
-`
-	WithOptions(
-		Modes(Singleton),
-		ProxyFiles(basicProxy),
-	).Run(t, pkgThatUsesVendoring, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a1.go")
-		d := &protocol.PublishDiagnosticsParams{}
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexpWithMessage("go.mod", "module mod.com", "Inconsistent vendoring"),
-				ReadDiagnostics("go.mod", d),
-			),
-		)
-		env.ApplyQuickFixes("go.mod", d.Diagnostics)
-
-		env.Await(
-			env.DiagnosticAtRegexpWithMessage("a/a1.go", `q int`, "not used"),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/misc/workspace_symbol_test.go b/gopls/internal/regtest/misc/workspace_symbol_test.go
--- a/gopls/internal/regtest/misc/workspace_symbol_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/misc/workspace_symbol_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,131 +0,0 @@
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package misc
-
-import (
-	"testing"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-	"golang.org/x/tools/internal/lsp/source"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestWorkspaceSymbolMissingMetadata(t *testing.T) {
-	// We get 2 symbols on 1.12, for some reason.
-	testenv.NeedsGo1Point(t, 13)
-
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.17
--- a.go --
-package p
-
-const C1 = "a.go"
--- ignore.go --
-
-// +build ignore
-
-package ignore
-
-const C2 = "ignore.go"
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("a.go")
-		syms := env.WorkspaceSymbol("C")
-		if got, want := len(syms), 1; got != want {
-			t.Errorf("got %d symbols, want %d", got, want)
-		}
-
-		// Opening up an ignored file will result in an overlay with missing
-		// metadata, but this shouldn't break workspace symbols requests.
-		env.OpenFile("ignore.go")
-		syms = env.WorkspaceSymbol("C")
-		if got, want := len(syms), 1; got != want {
-			t.Errorf("got %d symbols, want %d", got, want)
-		}
-	})
-}
-
-func TestWorkspaceSymbolSorting(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.17
--- a/a.go --
-package a
-
-const (
-	Foo = iota
-	FooBar
-	Fooey
-	Fooex
-	Fooest
-)
-`
-
-	var symbolMatcher = string(source.SymbolFastFuzzy)
-	WithOptions(
-		EditorConfig{
-			SymbolMatcher: &symbolMatcher,
-		},
-	).Run(t, files, func(t *testing.T, env *Env) {
-		want := []string{
-			"Foo",    // prefer exact segment matches first
-			"FooBar", // ...followed by exact word matches
-			"Fooex",  // shorter than Fooest, FooBar, lexically before Fooey
-			"Fooey",  // shorter than Fooest, Foobar
-			"Fooest",
-		}
-		got := env.WorkspaceSymbol("Foo")
-		compareSymbols(t, got, want)
-	})
-}
-
-func TestWorkspaceSymbolSpecialPatterns(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.17
--- a/a.go --
-package a
-
-const (
-	AxxBxxCxx
-	ABC
-)
-`
-
-	var symbolMatcher = string(source.SymbolFastFuzzy)
-	WithOptions(
-		EditorConfig{
-			SymbolMatcher: &symbolMatcher,
-		},
-	).Run(t, files, func(t *testing.T, env *Env) {
-		compareSymbols(t, env.WorkspaceSymbol("ABC"), []string{"ABC", "AxxBxxCxx"})
-		compareSymbols(t, env.WorkspaceSymbol("'ABC"), []string{"ABC"})
-		compareSymbols(t, env.WorkspaceSymbol("^mod.com"), []string{"mod.com/a.ABC", "mod.com/a.AxxBxxCxx"})
-		compareSymbols(t, env.WorkspaceSymbol("^mod.com Axx"), []string{"mod.com/a.AxxBxxCxx"})
-		compareSymbols(t, env.WorkspaceSymbol("C$"), []string{"ABC"})
-	})
-}
-
-func compareSymbols(t *testing.T, got []protocol.SymbolInformation, want []string) {
-	t.Helper()
-	if len(got) != len(want) {
-		t.Errorf("got %d symbols, want %d", len(got), len(want))
-	}
-
-	for i := range got {
-		if got[i].Name != want[i] {
-			t.Errorf("got[%d] = %q, want %q", i, got[i].Name, want[i])
-		}
-	}
-}
diff -urN a/gopls/internal/regtest/modfile/modfile_test.go b/gopls/internal/regtest/modfile/modfile_test.go
--- a/gopls/internal/regtest/modfile/modfile_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/modfile/modfile_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,1122 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package modfile
-
-import (
-	"path/filepath"
-	"runtime"
-	"strings"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/lsp/tests"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-const workspaceProxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-func SaySomething() {
-	fmt.Println("something")
-}
--- random.org@v1.2.3/go.mod --
-module random.org
-
-go 1.12
--- random.org@v1.2.3/bye/bye.go --
-package bye
-
-func Goodbye() {
-	println("Bye")
-}
-`
-
-const proxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-const Name = "Blah"
--- random.org@v1.2.3/go.mod --
-module random.org
-
-go 1.12
--- random.org@v1.2.3/blah/blah.go --
-package hello
-
-const Name = "Hello"
-`
-
-func TestModFileModification(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const untidyModule = `
--- a/go.mod --
-module mod.com
-
--- a/main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	println(blah.Name)
-}
-`
-
-	runner := RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}
-
-	t.Run("basic", func(t *testing.T) {
-		runner.Run(t, untidyModule, func(t *testing.T, env *Env) {
-			// Open the file and make sure that the initial workspace load does not
-			// modify the go.mod file.
-			goModContent := env.ReadWorkspaceFile("a/go.mod")
-			env.OpenFile("a/main.go")
-			env.Await(
-				env.DiagnosticAtRegexp("a/main.go", "\"example.com/blah\""),
-			)
-			if got := env.ReadWorkspaceFile("a/go.mod"); got != goModContent {
-				t.Fatalf("go.mod changed on disk:\n%s", tests.Diff(t, goModContent, got))
-			}
-			// Save the buffer, which will format and organize imports.
-			// Confirm that the go.mod file still does not change.
-			env.SaveBuffer("a/main.go")
-			env.Await(
-				env.DiagnosticAtRegexp("a/main.go", "\"example.com/blah\""),
-			)
-			if got := env.ReadWorkspaceFile("a/go.mod"); got != goModContent {
-				t.Fatalf("go.mod changed on disk:\n%s", tests.Diff(t, goModContent, got))
-			}
-		})
-	})
-
-	// Reproduce golang/go#40269 by deleting and recreating main.go.
-	t.Run("delete main.go", func(t *testing.T) {
-		t.Skip("This test will be flaky until golang/go#40269 is resolved.")
-
-		runner.Run(t, untidyModule, func(t *testing.T, env *Env) {
-			goModContent := env.ReadWorkspaceFile("a/go.mod")
-			mainContent := env.ReadWorkspaceFile("a/main.go")
-			env.OpenFile("a/main.go")
-			env.SaveBuffer("a/main.go")
-
-			env.RemoveWorkspaceFile("a/main.go")
-			env.Await(
-				env.DoneWithOpen(),
-				env.DoneWithSave(),
-				env.DoneWithChangeWatchedFiles(),
-			)
-
-			env.WriteWorkspaceFile("main.go", mainContent)
-			env.Await(
-				env.DiagnosticAtRegexp("main.go", "\"example.com/blah\""),
-			)
-			if got := env.ReadWorkspaceFile("go.mod"); got != goModContent {
-				t.Fatalf("go.mod changed on disk:\n%s", tests.Diff(t, goModContent, got))
-			}
-		})
-	})
-}
-
-func TestGoGetFix(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	const mod = `
--- a/go.mod --
-module mod.com
-
-go 1.12
-
--- a/main.go --
-package main
-
-import "example.com/blah"
-
-var _ = blah.Name
-`
-
-	const want = `module mod.com
-
-go 1.12
-
-require example.com v1.2.3
-`
-
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}.Run(t, mod, func(t *testing.T, env *Env) {
-		if strings.Contains(t.Name(), "workspace_module") {
-			t.Skip("workspace module mode doesn't set -mod=readonly")
-		}
-		env.OpenFile("a/main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexp("a/main.go", `"example.com/blah"`),
-				ReadDiagnostics("a/main.go", &d),
-			),
-		)
-		var goGetDiag protocol.Diagnostic
-		for _, diag := range d.Diagnostics {
-			if strings.Contains(diag.Message, "could not import") {
-				goGetDiag = diag
-			}
-		}
-		env.ApplyQuickFixes("a/main.go", []protocol.Diagnostic{goGetDiag})
-		if got := env.ReadWorkspaceFile("a/go.mod"); got != want {
-			t.Fatalf("unexpected go.mod content:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-// Tests that multiple missing dependencies gives good single fixes.
-func TestMissingDependencyFixes(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	const mod = `
--- a/go.mod --
-module mod.com
-
-go 1.12
-
--- a/main.go --
-package main
-
-import "example.com/blah"
-import "random.org/blah"
-
-var _, _ = blah.Name, hello.Name
-`
-
-	const want = `module mod.com
-
-go 1.12
-
-require random.org v1.2.3
-`
-
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}.Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("a/main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexp("a/main.go", `"random.org/blah"`),
-				ReadDiagnostics("a/main.go", &d),
-			),
-		)
-		var randomDiag protocol.Diagnostic
-		for _, diag := range d.Diagnostics {
-			if strings.Contains(diag.Message, "random.org") {
-				randomDiag = diag
-			}
-		}
-		env.ApplyQuickFixes("a/main.go", []protocol.Diagnostic{randomDiag})
-		if got := env.ReadWorkspaceFile("a/go.mod"); got != want {
-			t.Fatalf("unexpected go.mod content:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-func TestIndirectDependencyFix(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- a/go.mod --
-module mod.com
-
-go 1.12
-
-require example.com v1.2.3 // indirect
--- a/go.sum --
-example.com v1.2.3 h1:ihBTGWGjTU3V4ZJ9OmHITkU9WQ4lGdQkMjgyLFk0FaY=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- a/main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	fmt.Println(blah.Name)
-`
-	const want = `module mod.com
-
-go 1.12
-
-require example.com v1.2.3
-`
-
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}.Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("a/go.mod")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexp("a/go.mod", "// indirect"),
-				ReadDiagnostics("a/go.mod", &d),
-			),
-		)
-		env.ApplyQuickFixes("a/go.mod", d.Diagnostics)
-		if got := env.Editor.BufferText("a/go.mod"); got != want {
-			t.Fatalf("unexpected go.mod content:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-func TestUnusedDiag(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const proxy = `
--- example.com@v1.0.0/x.go --
-package pkg
-const X = 1
-`
-	const files = `
--- a/go.mod --
-module mod.com
-go 1.14
-require example.com v1.0.0
--- a/go.sum --
-example.com v1.0.0 h1:38O7j5rEBajXk+Q5wzLbRN7KqMkSgEiN9NqcM1O2bBM=
-example.com v1.0.0/go.mod h1:vUsPMGpx9ZXXzECCOsOmYCW7npJTwuA16yl89n3Mgls=
--- a/main.go --
-package main
-func main() {}
-`
-
-	const want = `module mod.com
-
-go 1.14
-`
-
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}.Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("a/go.mod")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexp("a/go.mod", `require example.com`),
-				ReadDiagnostics("a/go.mod", &d),
-			),
-		)
-		env.ApplyQuickFixes("a/go.mod", d.Diagnostics)
-		if got := env.Editor.BufferText("a/go.mod"); got != want {
-			t.Fatalf("unexpected go.mod content:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-// Test to reproduce golang/go#39041. It adds a new require to a go.mod file
-// that already has an unused require.
-func TestNewDepWithUnusedDep(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const proxy = `
--- github.com/esimov/caire@v1.2.5/go.mod --
-module github.com/esimov/caire
-
-go 1.12
--- github.com/esimov/caire@v1.2.5/caire.go --
-package caire
-
-func RemoveTempImage() {}
--- google.golang.org/protobuf@v1.20.0/go.mod --
-module google.golang.org/protobuf
-
-go 1.12
--- google.golang.org/protobuf@v1.20.0/hello/hello.go --
-package hello
-`
-	const repro = `
--- a/go.mod --
-module mod.com
-
-go 1.14
-
-require google.golang.org/protobuf v1.20.0
--- a/go.sum --
-github.com/esimov/caire v1.2.5 h1:OcqDII/BYxcBYj3DuwDKjd+ANhRxRqLa2n69EGje7qw=
-github.com/esimov/caire v1.2.5/go.mod h1:mXnjRjg3+WUtuhfSC1rKRmdZU9vJZyS1ZWU0qSvJhK8=
-google.golang.org/protobuf v1.20.0 h1:y9T1vAtFKQg0faFNMOxJU7WuEqPWolVkjIkU6aI8qCY=
-google.golang.org/protobuf v1.20.0/go.mod h1:FcqsytGClbtLv1ot8NvsJHjBi0h22StKVP+K/j2liKA=
--- a/main.go --
-package main
-
-import (
-    "github.com/esimov/caire"
-)
-
-func _() {
-    caire.RemoveTempImage()
-}`
-
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}.Run(t, repro, func(t *testing.T, env *Env) {
-		env.OpenFile("a/main.go")
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexp("a/main.go", `"github.com/esimov/caire"`),
-				ReadDiagnostics("a/main.go", &d),
-			),
-		)
-		env.ApplyQuickFixes("a/main.go", d.Diagnostics)
-		want := `module mod.com
-
-go 1.14
-
-require (
-	github.com/esimov/caire v1.2.5
-	google.golang.org/protobuf v1.20.0
-)
-`
-		if got := env.ReadWorkspaceFile("a/go.mod"); got != want {
-			t.Fatalf("TestNewDepWithUnusedDep failed:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-// TODO: For this test to be effective, the sandbox's file watcher must respect
-// the file watching GlobPattern in the capability registration. See
-// golang/go#39384.
-func TestModuleChangesOnDisk(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- a/go.mod --
-module mod.com
-
-go 1.12
-
-require example.com v1.2.3
--- a/go.sum --
-example.com v1.2.3 h1:ihBTGWGjTU3V4ZJ9OmHITkU9WQ4lGdQkMjgyLFk0FaY=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- a/main.go --
-package main
-
-func main() {
-	fmt.Println(blah.Name)
-`
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}.Run(t, mod, func(t *testing.T, env *Env) {
-		env.Await(env.DiagnosticAtRegexp("a/go.mod", "require"))
-		env.RunGoCommandInDir("a", "mod", "tidy")
-		env.Await(
-			EmptyDiagnostics("a/go.mod"),
-		)
-	})
-}
-
-// Tests golang/go#39784: a missing indirect dependency, necessary
-// due to blah@v2.0.0's incomplete go.mod file.
-func TestBadlyVersionedModule(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const proxy = `
--- example.com/blah/@v/v1.0.0.mod --
-module example.com
-
-go 1.12
--- example.com/blah@v1.0.0/blah.go --
-package blah
-
-const Name = "Blah"
--- example.com/blah/v2/@v/v2.0.0.mod --
-module example.com
-
-go 1.12
--- example.com/blah/v2@v2.0.0/blah.go --
-package blah
-
-import "example.com/blah"
-
-var V1Name = blah.Name
-const Name = "Blah"
-`
-	const files = `
--- a/go.mod --
-module mod.com
-
-go 1.12
-
-require example.com/blah/v2 v2.0.0
--- a/go.sum --
-example.com/blah v1.0.0 h1:kGPlWJbMsn1P31H9xp/q2mYI32cxLnCvauHN0AVaHnc=
-example.com/blah v1.0.0/go.mod h1:PZUQaGFeVjyDmAE8ywmLbmDn3fj4Ws8epg4oLuDzW3M=
-example.com/blah/v2 v2.0.0 h1:DNPsFPkKtTdxclRheaMCiYAoYizp6PuBzO0OmLOO0pY=
-example.com/blah/v2 v2.0.0/go.mod h1:UZiKbTwobERo/hrqFLvIQlJwQZQGxWMVY4xere8mj7w=
--- a/main.go --
-package main
-
-import "example.com/blah/v2"
-
-var _ = blah.Name
-`
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}.Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("a/main.go")
-		env.OpenFile("a/go.mod")
-		env.Await(
-			// We would like for the error to appear in the v2 module, but
-			// as of writing non-workspace packages are not diagnosed.
-			env.DiagnosticAtRegexpWithMessage("a/main.go", `"example.com/blah/v2"`, "cannot find module providing"),
-			env.DiagnosticAtRegexpWithMessage("a/go.mod", `require example.com/blah/v2`, "cannot find module providing"),
-		)
-		env.ApplyQuickFixes("a/go.mod", env.DiagnosticsFor("a/go.mod").Diagnostics)
-		const want = `module mod.com
-
-go 1.12
-
-require (
-	example.com/blah v1.0.0 // indirect
-	example.com/blah/v2 v2.0.0
-)
-`
-		env.SaveBuffer("a/go.mod")
-		env.Await(EmptyDiagnostics("a/main.go"))
-		if got := env.Editor.BufferText("a/go.mod"); got != want {
-			t.Fatalf("suggested fixes failed:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-// Reproduces golang/go#38232.
-func TestUnknownRevision(t *testing.T) {
-	if runtime.GOOS == "plan9" {
-		t.Skipf("skipping test that fails for unknown reasons on plan9; see https://go.dev/issue/50477")
-	}
-
-	testenv.NeedsGo1Point(t, 14)
-
-	const unknown = `
--- a/go.mod --
-module mod.com
-
-require (
-	example.com v1.2.2
-)
--- a/main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	var x = blah.Name
-}
-`
-
-	runner := RunMultiple{
-		{"default", WithOptions(ProxyFiles(proxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(proxy))},
-	}
-	// Start from a bad state/bad IWL, and confirm that we recover.
-	t.Run("bad", func(t *testing.T) {
-		runner.Run(t, unknown, func(t *testing.T, env *Env) {
-			env.OpenFile("a/go.mod")
-			env.Await(
-				env.DiagnosticAtRegexp("a/go.mod", "example.com v1.2.2"),
-			)
-			env.RegexpReplace("a/go.mod", "v1.2.2", "v1.2.3")
-			env.SaveBuffer("a/go.mod") // Save to trigger diagnostics.
-
-			d := protocol.PublishDiagnosticsParams{}
-			env.Await(
-				OnceMet(
-					// Make sure the diagnostic mentions the new version -- the old diagnostic is in the same place.
-					env.DiagnosticAtRegexpWithMessage("a/go.mod", "example.com v1.2.3", "example.com@v1.2.3"),
-					ReadDiagnostics("a/go.mod", &d),
-				),
-			)
-			qfs := env.GetQuickFixes("a/go.mod", d.Diagnostics)
-			if len(qfs) == 0 {
-				t.Fatalf("got 0 code actions to fix %v, wanted at least 1", d.Diagnostics)
-			}
-			env.ApplyCodeAction(qfs[0]) // Arbitrarily pick a single fix to apply. Applying all of them seems to cause trouble in this particular test.
-			env.SaveBuffer("a/go.mod")  // Save to trigger diagnostics.
-			env.Await(
-				EmptyDiagnostics("a/go.mod"),
-				env.DiagnosticAtRegexp("a/main.go", "x = "),
-			)
-		})
-	})
-
-	const known = `
--- a/go.mod --
-module mod.com
-
-require (
-	example.com v1.2.3
-)
--- a/go.sum --
-example.com v1.2.3 h1:ihBTGWGjTU3V4ZJ9OmHITkU9WQ4lGdQkMjgyLFk0FaY=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- a/main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	var x = blah.Name
-}
-`
-	// Start from a good state, transform to a bad state, and confirm that we
-	// still recover.
-	t.Run("good", func(t *testing.T) {
-		runner.Run(t, known, func(t *testing.T, env *Env) {
-			env.OpenFile("a/go.mod")
-			env.Await(
-				env.DiagnosticAtRegexp("a/main.go", "x = "),
-			)
-			env.RegexpReplace("a/go.mod", "v1.2.3", "v1.2.2")
-			env.Editor.SaveBuffer(env.Ctx, "a/go.mod") // go.mod changes must be on disk
-			env.Await(
-				env.DiagnosticAtRegexp("a/go.mod", "example.com v1.2.2"),
-			)
-			env.RegexpReplace("a/go.mod", "v1.2.2", "v1.2.3")
-			env.Editor.SaveBuffer(env.Ctx, "a/go.mod") // go.mod changes must be on disk
-			env.Await(
-				env.DiagnosticAtRegexp("a/main.go", "x = "),
-			)
-		})
-	})
-}
-
-// Confirm that an error in an indirect dependency of a requirement is surfaced
-// as a diagnostic in the go.mod file.
-func TestErrorInIndirectDependency(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const badProxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
-
-require random.org v1.2.3 // indirect
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-const Name = "Blah"
--- random.org@v1.2.3/go.mod --
-module bob.org
-
-go 1.12
--- random.org@v1.2.3/blah/blah.go --
-package hello
-
-const Name = "Hello"
-`
-	const module = `
--- a/go.mod --
-module mod.com
-
-go 1.14
-
-require example.com v1.2.3
--- a/main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	println(blah.Name)
-}
-`
-	RunMultiple{
-		{"default", WithOptions(ProxyFiles(badProxy), WorkspaceFolders("a"))},
-		{"nested", WithOptions(ProxyFiles(badProxy))},
-	}.Run(t, module, func(t *testing.T, env *Env) {
-		env.OpenFile("a/go.mod")
-		env.Await(
-			env.DiagnosticAtRegexp("a/go.mod", "require example.com v1.2.3"),
-		)
-	})
-}
-
-// A copy of govim's config_set_env_goflags_mod_readonly test.
-func TestGovimModReadonly(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.13
--- main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	println(blah.Name)
-}
-`
-	WithOptions(
-		EditorConfig{
-			Env: map[string]string{
-				"GOFLAGS": "-mod=readonly",
-			},
-		},
-		ProxyFiles(proxy),
-		Modes(Singleton),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		original := env.ReadWorkspaceFile("go.mod")
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", `"example.com/blah"`),
-		)
-		got := env.ReadWorkspaceFile("go.mod")
-		if got != original {
-			t.Fatalf("go.mod file modified:\n%s", tests.Diff(t, original, got))
-		}
-		env.RunGoCommand("get", "example.com/blah@v1.2.3")
-		env.RunGoCommand("mod", "tidy")
-		env.Await(
-			EmptyDiagnostics("main.go"),
-		)
-	})
-}
-
-func TestMultiModuleModDiagnostics(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- a/go.mod --
-module moda.com
-
-go 1.14
-
-require (
-	example.com v1.2.3
-)
--- a/go.sum --
-example.com v1.2.3 h1:Yryq11hF02fEf2JlOS2eph+ICE2/ceevGV3C9dl5V/c=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- a/main.go --
-package main
-
-func main() {}
--- b/go.mod --
-module modb.com
-
-require example.com v1.2.3
-
-go 1.14
--- b/main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	blah.SaySomething()
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceProxy),
-		Modes(Experimental),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexpWithMessage("a/go.mod", "example.com v1.2.3", "is not used"),
-		)
-	})
-}
-
-func TestModTidyWithBuildTags(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.14
--- main.go --
-// +build bob
-
-package main
-
-import "example.com/blah"
-
-func main() {
-	blah.SaySomething()
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceProxy),
-		EditorConfig{
-			BuildFlags: []string{"-tags", "bob"},
-		},
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", `"example.com/blah"`),
-		)
-	})
-}
-
-func TestModTypoDiagnostic(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func main() {}
-`
-	Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		env.RegexpReplace("go.mod", "module", "modul")
-		env.Await(
-			env.DiagnosticAtRegexp("go.mod", "modul"),
-		)
-	})
-}
-
-func TestSumUpdateFixesDiagnostics(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require (
-	example.com v1.2.3
-)
--- go.sum --
--- main.go --
-package main
-
-import (
-	"example.com/blah"
-)
-
-func main() {
-	println(blah.Name)
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceProxy),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		d := &protocol.PublishDiagnosticsParams{}
-		env.OpenFile("go.mod")
-		env.Await(
-			OnceMet(
-				env.GoSumDiagnostic("go.mod", `example.com v1.2.3`),
-				ReadDiagnostics("go.mod", d),
-			),
-		)
-		env.ApplyQuickFixes("go.mod", d.Diagnostics)
-		env.SaveBuffer("go.mod") // Save to trigger diagnostics.
-		env.Await(
-			EmptyDiagnostics("go.mod"),
-		)
-	})
-}
-
-// This test confirms that editing a go.mod file only causes metadata
-// to be invalidated when it's saved.
-func TestGoModInvalidatesOnSave(t *testing.T) {
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- main.go --
-package main
-
-func main() {
-	hello()
-}
--- hello.go --
-package main
-
-func hello() {}
-`
-	WithOptions(
-		// TODO(rFindley) this doesn't work in multi-module workspace mode, because
-		// it keeps around the last parsing modfile. Update this test to also
-		// exercise the workspace module.
-		Modes(Singleton),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		env.Await(env.DoneWithOpen())
-		env.RegexpReplace("go.mod", "module", "modul")
-		// Confirm that we still have metadata with only on-disk edits.
-		env.OpenFile("main.go")
-		file, _ := env.GoToDefinition("main.go", env.RegexpSearch("main.go", "hello"))
-		if filepath.Base(file) != "hello.go" {
-			t.Fatalf("expected definition in hello.go, got %s", file)
-		}
-		// Confirm that we no longer have metadata when the file is saved.
-		env.SaveBufferWithoutActions("go.mod")
-		_, _, err := env.Editor.GoToDefinition(env.Ctx, "main.go", env.RegexpSearch("main.go", "hello"))
-		if err == nil {
-			t.Fatalf("expected error, got none")
-		}
-	})
-}
-
-func TestRemoveUnusedDependency(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const proxy = `
--- hasdep.com@v1.2.3/go.mod --
-module hasdep.com
-
-go 1.12
-
-require example.com v1.2.3
--- hasdep.com@v1.2.3/a/a.go --
-package a
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-const Name = "Blah"
--- random.com@v1.2.3/go.mod --
-module random.com
-
-go 1.12
--- random.com@v1.2.3/blah/blah.go --
-package blah
-
-const Name = "Blah"
-`
-	t.Run("almost tidied", func(t *testing.T) {
-		const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require hasdep.com v1.2.3
--- go.sum --
-example.com v1.2.3 h1:ihBTGWGjTU3V4ZJ9OmHITkU9WQ4lGdQkMjgyLFk0FaY=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
-hasdep.com v1.2.3 h1:00y+N5oD+SpKoqV1zP2VOPawcW65Zb9NebANY3GSzGI=
-hasdep.com v1.2.3/go.mod h1:ePVZOlez+KZEOejfLPGL2n4i8qiAjrkhQZ4wcImqAes=
--- main.go --
-package main
-
-func main() {}
-`
-		WithOptions(
-			ProxyFiles(proxy),
-		).Run(t, mod, func(t *testing.T, env *Env) {
-			env.OpenFile("go.mod")
-			d := &protocol.PublishDiagnosticsParams{}
-			env.Await(
-				OnceMet(
-					env.DiagnosticAtRegexp("go.mod", "require hasdep.com v1.2.3"),
-					ReadDiagnostics("go.mod", d),
-				),
-			)
-			const want = `module mod.com
-
-go 1.12
-`
-			env.ApplyQuickFixes("go.mod", d.Diagnostics)
-			if got := env.Editor.BufferText("go.mod"); got != want {
-				t.Fatalf("unexpected content in go.mod:\n%s", tests.Diff(t, want, got))
-			}
-		})
-	})
-
-	t.Run("not tidied", func(t *testing.T) {
-		const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require hasdep.com v1.2.3
-require random.com v1.2.3
--- go.sum --
-example.com v1.2.3 h1:ihBTGWGjTU3V4ZJ9OmHITkU9WQ4lGdQkMjgyLFk0FaY=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
-hasdep.com v1.2.3 h1:00y+N5oD+SpKoqV1zP2VOPawcW65Zb9NebANY3GSzGI=
-hasdep.com v1.2.3/go.mod h1:ePVZOlez+KZEOejfLPGL2n4i8qiAjrkhQZ4wcImqAes=
-random.com v1.2.3 h1:PzYTykzqqH6+qU0dIgh9iPFbfb4Mm8zNBjWWreRKtx0=
-random.com v1.2.3/go.mod h1:8EGj+8a4Hw1clAp8vbaeHAsKE4sbm536FP7nKyXO+qQ=
--- main.go --
-package main
-
-func main() {}
-`
-		WithOptions(
-			ProxyFiles(proxy),
-		).Run(t, mod, func(t *testing.T, env *Env) {
-			d := &protocol.PublishDiagnosticsParams{}
-			env.OpenFile("go.mod")
-			pos := env.RegexpSearch("go.mod", "require hasdep.com v1.2.3")
-			env.Await(
-				OnceMet(
-					DiagnosticAt("go.mod", pos.Line, pos.Column),
-					ReadDiagnostics("go.mod", d),
-				),
-			)
-			const want = `module mod.com
-
-go 1.12
-
-require random.com v1.2.3
-`
-			var diagnostics []protocol.Diagnostic
-			for _, d := range d.Diagnostics {
-				if d.Range.Start.Line != uint32(pos.Line) {
-					continue
-				}
-				diagnostics = append(diagnostics, d)
-			}
-			env.ApplyQuickFixes("go.mod", diagnostics)
-			if got := env.Editor.BufferText("go.mod"); got != want {
-				t.Fatalf("unexpected content in go.mod:\n%s", tests.Diff(t, want, got))
-			}
-		})
-	})
-}
-
-func TestSumUpdateQuickFix(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require (
-	example.com v1.2.3
-)
--- go.sum --
--- main.go --
-package main
-
-import (
-	"example.com/blah"
-)
-
-func main() {
-	blah.Hello()
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceProxy),
-		Modes(Singleton),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("go.mod")
-		params := &protocol.PublishDiagnosticsParams{}
-		env.Await(
-			OnceMet(
-				env.GoSumDiagnostic("go.mod", "example.com"),
-				ReadDiagnostics("go.mod", params),
-			),
-		)
-		env.ApplyQuickFixes("go.mod", params.Diagnostics)
-		const want = `example.com v1.2.3 h1:Yryq11hF02fEf2JlOS2eph+ICE2/ceevGV3C9dl5V/c=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
-`
-		if got := env.ReadWorkspaceFile("go.sum"); got != want {
-			t.Fatalf("unexpected go.sum contents:\n%s", tests.Diff(t, want, got))
-		}
-	})
-}
-
-func TestDownloadDeps(t *testing.T) {
-	testenv.NeedsGo1Point(t, 14)
-
-	const proxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
-
-require random.org v1.2.3
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-import "random.org/bye"
-
-func SaySomething() {
-	bye.Goodbye()
-}
--- random.org@v1.2.3/go.mod --
-module random.org
-
-go 1.12
--- random.org@v1.2.3/bye/bye.go --
-package bye
-
-func Goodbye() {
-	println("Bye")
-}
-`
-
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
--- go.sum --
--- main.go --
-package main
-
-import (
-	"example.com/blah"
-)
-
-func main() {
-	blah.SaySomething()
-}
-`
-	WithOptions(
-		ProxyFiles(proxy),
-		Modes(Singleton),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.OpenFile("main.go")
-		d := &protocol.PublishDiagnosticsParams{}
-		env.Await(
-			env.DiagnosticAtRegexpWithMessage("main.go", `"example.com/blah"`, `could not import example.com/blah (no required module provides package "example.com/blah")`),
-			ReadDiagnostics("main.go", d),
-		)
-		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.Await(
-			EmptyDiagnostics("main.go"),
-			NoDiagnostics("go.mod"),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/template/template_test.go b/gopls/internal/regtest/template/template_test.go
--- a/gopls/internal/regtest/template/template_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/template/template_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,177 +0,0 @@
-// Copyright 2022 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package template
-
-import (
-	"strings"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	"golang.org/x/tools/internal/lsp/protocol"
-	. "golang.org/x/tools/internal/lsp/regtest"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-func TestTemplatesFromExtensions(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- hello.tmpl --
-{{range .Planets}}
-Hello {{}} <-- missing body
-{{end}}
-`
-
-	WithOptions(
-		EditorConfig{
-			Settings: map[string]interface{}{
-				"templateExtensions": []string{"tmpl"},
-			},
-		},
-	).Run(t, files, func(t *testing.T, env *Env) {
-		// TODO: can we move this diagnostic onto {{}}?
-		env.Await(env.DiagnosticAtRegexp("hello.tmpl", "()Hello {{}}"))
-		env.WriteWorkspaceFile("hello.tmpl", "{{range .Planets}}\nHello {{.}}\n{{end}}")
-		env.Await(EmptyDiagnostics("hello.tmpl"))
-	})
-}
-
-func TestTemplatesObserveDirectoryFilters(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a/a.tmpl --
-A {{}} <-- missing body
--- b/b.tmpl --
-B {{}} <-- missing body
-`
-
-	WithOptions(
-		EditorConfig{
-			Settings: map[string]interface{}{
-				"templateExtensions": []string{"tmpl"},
-			},
-			DirectoryFilters: []string{"-b"},
-		},
-	).Run(t, files, func(t *testing.T, env *Env) {
-		env.Await(
-			OnceMet(env.DiagnosticAtRegexp("a/a.tmpl", "()A")),
-			NoDiagnostics("b/b.tmpl"),
-		)
-	})
-}
-
-func TestTemplatesFromLangID(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.CreateBuffer("hello.tmpl", "")
-		env.Await(
-			OnceMet(
-				env.DoneWithOpen(),
-				NoDiagnostics("hello.tmpl"), // Don't get spurious errors for empty templates.
-			),
-		)
-		env.SetBufferContent("hello.tmpl", "{{range .Planets}}\nHello {{}}\n{{end}}")
-		env.Await(env.DiagnosticAtRegexp("hello.tmpl", "()Hello {{}}"))
-		env.RegexpReplace("hello.tmpl", "{{}}", "{{.}}")
-		env.Await(EmptyOrNoDiagnostics("hello.tmpl"))
-	})
-}
-
-func TestClosingTemplatesMakesDiagnosticsDisappear(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- hello.tmpl --
-{{range .Planets}}
-Hello {{}} <-- missing body
-{{end}}
-`
-
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("hello.tmpl")
-		env.Await(env.DiagnosticAtRegexp("hello.tmpl", "()Hello {{}}"))
-		// Since we don't have templateExtensions configured, closing hello.tmpl
-		// should make its diagnostics disappear.
-		env.CloseBuffer("hello.tmpl")
-		env.Await(EmptyDiagnostics("hello.tmpl"))
-	})
-}
-
-func TestMultipleSuffixes(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- b.gotmpl --
-{{define "A"}}goo{{end}}
--- a.tmpl --
-{{template "A"}}
-`
-
-	WithOptions(
-		EditorConfig{
-			Settings: map[string]interface{}{
-				"templateExtensions": []string{"tmpl", "gotmpl"},
-			},
-		},
-	).Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("a.tmpl")
-		x := env.RegexpSearch("a.tmpl", `A`)
-		file, pos := env.GoToDefinition("a.tmpl", x)
-		refs := env.References(file, pos)
-		if len(refs) != 2 {
-			t.Fatalf("got %v reference(s), want 2", len(refs))
-		}
-		// make sure we got one from b.gotmpl
-		want := env.Sandbox.Workdir.URI("b.gotmpl")
-		if refs[0].URI != want && refs[1].URI != want {
-			t.Errorf("failed to find reference to %s", shorten(want))
-			for i, r := range refs {
-				t.Logf("%d: URI:%s %v", i, shorten(r.URI), r.Range)
-			}
-		}
-
-		content, npos := env.Hover(file, pos)
-		if pos != npos {
-			t.Errorf("pos? got %v, wanted %v", npos, pos)
-		}
-		if content.Value != "template A defined" {
-			t.Errorf("got %s, wanted 'template A defined", content.Value)
-		}
-	})
-}
-
-// shorten long URIs
-func shorten(fn protocol.DocumentURI) string {
-	if len(fn) <= 20 {
-		return string(fn)
-	}
-	pieces := strings.Split(string(fn), "/")
-	if len(pieces) < 2 {
-		return string(fn)
-	}
-	j := len(pieces)
-	return pieces[j-2] + "/" + pieces[j-1]
-}
-
-// Hover,  SemTok, Diagnose with errors
-// and better coverage
diff -urN a/gopls/internal/regtest/watch/watch_test.go b/gopls/internal/regtest/watch/watch_test.go
--- a/gopls/internal/regtest/watch/watch_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/watch/watch_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,766 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package regtest
-
-import (
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	. "golang.org/x/tools/internal/lsp/regtest"
-
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-func TestEditFile(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- a/a.go --
-package a
-
-func _() {
-	var x int
-}
-`
-	// Edit the file when it's *not open* in the workspace, and check that
-	// diagnostics are updated.
-	t.Run("unopened", func(t *testing.T) {
-		Run(t, pkg, func(t *testing.T, env *Env) {
-			env.Await(
-				env.DiagnosticAtRegexp("a/a.go", "x"),
-			)
-			env.WriteWorkspaceFile("a/a.go", `package a; func _() {};`)
-			env.Await(
-				EmptyDiagnostics("a/a.go"),
-			)
-		})
-	})
-
-	// Edit the file when it *is open* in the workspace, and check that
-	// diagnostics are *not* updated.
-	t.Run("opened", func(t *testing.T) {
-		Run(t, pkg, func(t *testing.T, env *Env) {
-			env.OpenFile("a/a.go")
-			// Insert a trivial edit so that we don't automatically update the buffer
-			// (see CL 267577).
-			env.EditBuffer("a/a.go", fake.NewEdit(0, 0, 0, 0, " "))
-			env.Await(env.DoneWithOpen())
-			env.WriteWorkspaceFile("a/a.go", `package a; func _() {};`)
-			env.Await(
-				OnceMet(
-					env.DoneWithChangeWatchedFiles(),
-					env.DiagnosticAtRegexp("a/a.go", "x"),
-				))
-		})
-	})
-}
-
-// Edit a dependency on disk and expect a new diagnostic.
-func TestEditDependency(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- b/b.go --
-package b
-
-func B() int { return 0 }
--- a/a.go --
-package a
-
-import (
-	"mod.com/b"
-)
-
-func _() {
-	_ = b.B()
-}
-`
-	Run(t, pkg, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		env.Await(env.DoneWithOpen())
-		env.WriteWorkspaceFile("b/b.go", `package b; func B() {};`)
-		env.Await(
-			env.DiagnosticAtRegexp("a/a.go", "b.B"),
-		)
-	})
-}
-
-// Edit both the current file and one of its dependencies on disk and
-// expect diagnostic changes.
-func TestEditFileAndDependency(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- b/b.go --
-package b
-
-func B() int { return 0 }
--- a/a.go --
-package a
-
-import (
-	"mod.com/b"
-)
-
-func _() {
-	var x int
-	_ = b.B()
-}
-`
-	Run(t, pkg, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexp("a/a.go", "x"),
-		)
-		env.WriteWorkspaceFiles(map[string]string{
-			"b/b.go": `package b; func B() {};`,
-			"a/a.go": `package a
-
-import "mod.com/b"
-
-func _() {
-	b.B()
-}`,
-		})
-		env.Await(
-			EmptyDiagnostics("a/a.go"),
-			NoDiagnostics("b/b.go"),
-		)
-	})
-}
-
-// Delete a dependency and expect a new diagnostic.
-func TestDeleteDependency(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- b/b.go --
-package b
-
-func B() int { return 0 }
--- a/a.go --
-package a
-
-import (
-	"mod.com/b"
-)
-
-func _() {
-	_ = b.B()
-}
-`
-	Run(t, pkg, func(t *testing.T, env *Env) {
-		env.OpenFile("a/a.go")
-		env.Await(env.DoneWithOpen())
-		env.RemoveWorkspaceFile("b/b.go")
-		env.Await(
-			env.DiagnosticAtRegexp("a/a.go", "\"mod.com/b\""),
-		)
-	})
-}
-
-// Create a dependency on disk and expect the diagnostic to go away.
-func TestCreateDependency(t *testing.T) {
-	const missing = `
--- go.mod --
-module mod.com
-
-go 1.14
--- b/b.go --
-package b
-
-func B() int { return 0 }
--- a/a.go --
-package a
-
-import (
-	"mod.com/c"
-)
-
-func _() {
-	c.C()
-}
-`
-	Run(t, missing, func(t *testing.T, env *Env) {
-		t.Skip("the initial workspace load fails and never retries")
-
-		env.Await(
-			env.DiagnosticAtRegexp("a/a.go", "\"mod.com/c\""),
-		)
-		env.WriteWorkspaceFile("c/c.go", `package c; func C() {};`)
-		env.Await(
-			EmptyDiagnostics("c/c.go"),
-		)
-	})
-}
-
-// Create a new dependency and add it to the file on disk.
-// This is similar to what might happen if you switch branches.
-func TestCreateAndAddDependency(t *testing.T) {
-	const original = `
--- go.mod --
-module mod.com
-
-go 1.14
--- a/a.go --
-package a
-
-func _() {}
-`
-	Run(t, original, func(t *testing.T, env *Env) {
-		env.WriteWorkspaceFile("c/c.go", `package c; func C() {};`)
-		env.WriteWorkspaceFile("a/a.go", `package a; import "mod.com/c"; func _() { c.C() }`)
-		env.Await(
-			NoDiagnostics("a/a.go"),
-		)
-	})
-}
-
-// Create a new file that defines a new symbol, in the same package.
-func TestCreateFile(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- a/a.go --
-package a
-
-func _() {
-	hello()
-}
-`
-	Run(t, pkg, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexp("a/a.go", "hello"),
-		)
-		env.WriteWorkspaceFile("a/a2.go", `package a; func hello() {};`)
-		env.Await(
-			EmptyDiagnostics("a/a.go"),
-		)
-	})
-}
-
-// Add a new method to an interface and implement it.
-// Inspired by the structure of internal/lsp/source and internal/lsp/cache.
-func TestCreateImplementation(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- b/b.go --
-package b
-
-type B interface{
-	Hello() string
-}
-
-func SayHello(bee B) {
-	println(bee.Hello())
-}
--- a/a.go --
-package a
-
-import "mod.com/b"
-
-type X struct {}
-
-func (_ X) Hello() string {
-	return ""
-}
-
-func _() {
-	x := X{}
-	b.SayHello(x)
-}
-`
-	const newMethod = `package b
-type B interface{
-	Hello() string
-	Bye() string
-}
-
-func SayHello(bee B) {
-	println(bee.Hello())
-}`
-	const implementation = `package a
-
-import "mod.com/b"
-
-type X struct {}
-
-func (_ X) Hello() string {
-	return ""
-}
-
-func (_ X) Bye() string {
-	return ""
-}
-
-func _() {
-	x := X{}
-	b.SayHello(x)
-}`
-
-	// Add the new method before the implementation. Expect diagnostics.
-	t.Run("method before implementation", func(t *testing.T) {
-		Run(t, pkg, func(t *testing.T, env *Env) {
-			env.WriteWorkspaceFile("b/b.go", newMethod)
-			env.Await(
-				OnceMet(
-					env.DoneWithChangeWatchedFiles(),
-					DiagnosticAt("a/a.go", 12, 12),
-				),
-			)
-			env.WriteWorkspaceFile("a/a.go", implementation)
-			env.Await(
-				EmptyDiagnostics("a/a.go"),
-			)
-		})
-	})
-	// Add the new implementation before the new method. Expect no diagnostics.
-	t.Run("implementation before method", func(t *testing.T) {
-		Run(t, pkg, func(t *testing.T, env *Env) {
-			env.WriteWorkspaceFile("a/a.go", implementation)
-			env.Await(
-				OnceMet(
-					env.DoneWithChangeWatchedFiles(),
-					NoDiagnostics("a/a.go"),
-				),
-			)
-			env.WriteWorkspaceFile("b/b.go", newMethod)
-			env.Await(
-				NoDiagnostics("a/a.go"),
-			)
-		})
-	})
-	// Add both simultaneously. Expect no diagnostics.
-	t.Run("implementation and method simultaneously", func(t *testing.T) {
-		Run(t, pkg, func(t *testing.T, env *Env) {
-			env.WriteWorkspaceFiles(map[string]string{
-				"a/a.go": implementation,
-				"b/b.go": newMethod,
-			})
-			env.Await(
-				OnceMet(
-					env.DoneWithChangeWatchedFiles(),
-					NoDiagnostics("a/a.go"),
-				),
-				NoDiagnostics("b/b.go"),
-			)
-		})
-	})
-}
-
-// Tests golang/go#38498. Delete a file and then force a reload.
-// Assert that we no longer try to load the file.
-func TestDeleteFiles(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13) // Poor overlay support causes problems on 1.12.
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- a/a.go --
-package a
-
-func _() {
-	var _ int
-}
--- a/a_unneeded.go --
-package a
-`
-	t.Run("close then delete", func(t *testing.T) {
-		WithOptions(EditorConfig{
-			VerboseOutput: true,
-		}).Run(t, pkg, func(t *testing.T, env *Env) {
-			env.OpenFile("a/a.go")
-			env.OpenFile("a/a_unneeded.go")
-			env.Await(
-				OnceMet(
-					env.DoneWithOpen(),
-					LogMatching(protocol.Info, "a_unneeded.go", 1, false),
-				),
-			)
-
-			// Close and delete the open file, mimicking what an editor would do.
-			env.CloseBuffer("a/a_unneeded.go")
-			env.RemoveWorkspaceFile("a/a_unneeded.go")
-			env.RegexpReplace("a/a.go", "var _ int", "fmt.Println(\"\")")
-			env.Await(
-				env.DiagnosticAtRegexp("a/a.go", "fmt"),
-			)
-			env.SaveBuffer("a/a.go")
-			env.Await(
-				OnceMet(
-					env.DoneWithSave(),
-					// There should only be one log message containing
-					// a_unneeded.go, from the initial workspace load, which we
-					// check for earlier. If there are more, there's a bug.
-					LogMatching(protocol.Info, "a_unneeded.go", 1, false),
-				),
-				EmptyDiagnostics("a/a.go"),
-			)
-		})
-	})
-
-	t.Run("delete then close", func(t *testing.T) {
-		WithOptions(
-			EditorConfig{VerboseOutput: true},
-		).Run(t, pkg, func(t *testing.T, env *Env) {
-			env.OpenFile("a/a.go")
-			env.OpenFile("a/a_unneeded.go")
-			env.Await(
-				OnceMet(
-					env.DoneWithOpen(),
-					LogMatching(protocol.Info, "a_unneeded.go", 1, false),
-				),
-			)
-
-			// Delete and then close the file.
-			env.RemoveWorkspaceFile("a/a_unneeded.go")
-			env.CloseBuffer("a/a_unneeded.go")
-			env.RegexpReplace("a/a.go", "var _ int", "fmt.Println(\"\")")
-			env.Await(
-				env.DiagnosticAtRegexp("a/a.go", "fmt"),
-			)
-			env.SaveBuffer("a/a.go")
-			env.Await(
-				OnceMet(
-					env.DoneWithSave(),
-					// There should only be one log message containing
-					// a_unneeded.go, from the initial workspace load, which we
-					// check for earlier. If there are more, there's a bug.
-					LogMatching(protocol.Info, "a_unneeded.go", 1, false),
-				),
-				EmptyDiagnostics("a/a.go"),
-			)
-		})
-	})
-}
-
-// This change reproduces the behavior of switching branches, with multiple
-// files being created and deleted. The key change here is the movement of a
-// symbol from one file to another in a given package through a deletion and
-// creation. To reproduce an issue with metadata invalidation in batched
-// changes, the last change in the batch is an on-disk file change that doesn't
-// require metadata invalidation.
-func TestMoveSymbol(t *testing.T) {
-	const pkg = `
--- go.mod --
-module mod.com
-
-go 1.14
--- main.go --
-package main
-
-import "mod.com/a"
-
-func main() {
-	var x int
-	x = a.Hello
-	println(x)
-}
--- a/a1.go --
-package a
-
-var Hello int
--- a/a2.go --
-package a
-
-func _() {}
-`
-	Run(t, pkg, func(t *testing.T, env *Env) {
-		env.ChangeFilesOnDisk([]fake.FileEvent{
-			{
-				Path: "a/a3.go",
-				Content: `package a
-
-var Hello int
-`,
-				ProtocolEvent: protocol.FileEvent{
-					URI:  env.Sandbox.Workdir.URI("a/a3.go"),
-					Type: protocol.Created,
-				},
-			},
-			{
-				Path: "a/a1.go",
-				ProtocolEvent: protocol.FileEvent{
-					URI:  env.Sandbox.Workdir.URI("a/a1.go"),
-					Type: protocol.Deleted,
-				},
-			},
-			{
-				Path:    "a/a2.go",
-				Content: `package a; func _() {};`,
-				ProtocolEvent: protocol.FileEvent{
-					URI:  env.Sandbox.Workdir.URI("a/a2.go"),
-					Type: protocol.Changed,
-				},
-			},
-		})
-		env.Await(
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				NoDiagnostics("main.go"),
-			),
-		)
-	})
-}
-
-// Reproduce golang/go#40456.
-func TestChangeVersion(t *testing.T) {
-	const proxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-const Name = "Blah"
-
-func X(x int) {}
--- example.com@v1.2.2/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.2/blah/blah.go --
-package blah
-
-const Name = "Blah"
-
-func X() {}
--- random.org@v1.2.3/go.mod --
-module random.org
-
-go 1.12
--- random.org@v1.2.3/blah/blah.go --
-package hello
-
-const Name = "Hello"
-`
-	const mod = `
--- go.mod --
-module mod.com
-
-go 1.12
-
-require example.com v1.2.2
--- main.go --
-package main
-
-import "example.com/blah"
-
-func main() {
-	blah.X()
-}
-`
-	WithOptions(ProxyFiles(proxy)).Run(t, mod, func(t *testing.T, env *Env) {
-		env.WriteWorkspaceFiles(map[string]string{
-			"go.mod": `module mod.com
-
-go 1.12
-
-require example.com v1.2.3
-`,
-			"main.go": `package main
-
-import (
-	"example.com/blah"
-)
-
-func main() {
-	blah.X(1)
-}
-`,
-		})
-		env.Await(
-			env.DoneWithChangeWatchedFiles(),
-			NoDiagnostics("main.go"),
-		)
-	})
-}
-
-// Reproduces golang/go#40340.
-func TestSwitchFromGOPATHToModules(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-
-	const files = `
--- foo/blah/blah.go --
-package blah
-
-const Name = ""
--- foo/main.go --
-package main
-
-import "blah"
-
-func main() {
-	_ = blah.Name
-}
-`
-	WithOptions(
-		InGOPATH(),
-		EditorConfig{
-			Env: map[string]string{
-				"GO111MODULE": "auto",
-			},
-		},
-		Modes(Experimental), // module is in a subdirectory
-	).Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("foo/main.go")
-		env.Await(env.DiagnosticAtRegexp("foo/main.go", `"blah"`))
-		if err := env.Sandbox.RunGoCommand(env.Ctx, "foo", "mod", []string{"init", "mod.com"}, true); err != nil {
-			t.Fatal(err)
-		}
-		env.RegexpReplace("foo/main.go", `"blah"`, `"mod.com/blah"`)
-		env.Await(
-			EmptyDiagnostics("foo/main.go"),
-		)
-	})
-}
-
-// Reproduces golang/go#40487.
-func TestSwitchFromModulesToGOPATH(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-
-	const files = `
--- foo/go.mod --
-module mod.com
-
-go 1.14
--- foo/blah/blah.go --
-package blah
-
-const Name = ""
--- foo/main.go --
-package main
-
-import "mod.com/blah"
-
-func main() {
-	_ = blah.Name
-}
-`
-	WithOptions(
-		InGOPATH(),
-		EditorConfig{
-			Env: map[string]string{
-				"GO111MODULE": "auto",
-			},
-		},
-	).Run(t, files, func(t *testing.T, env *Env) {
-		env.OpenFile("foo/main.go")
-		env.RemoveWorkspaceFile("foo/go.mod")
-		env.Await(
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				env.DiagnosticAtRegexp("foo/main.go", `"mod.com/blah"`),
-			),
-		)
-		env.RegexpReplace("foo/main.go", `"mod.com/blah"`, `"foo/blah"`)
-		env.Await(
-			EmptyDiagnostics("foo/main.go"),
-		)
-	})
-}
-
-func TestNewSymbolInTestVariant(t *testing.T) {
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- a/a.go --
-package a
-
-func bob() {}
--- a/a_test.go --
-package a
-
-import "testing"
-
-func TestBob(t *testing.T) {
-	bob()
-}
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		// Add a new symbol to the package under test and use it in the test
-		// variant. Expect no diagnostics.
-		env.WriteWorkspaceFiles(map[string]string{
-			"a/a.go": `package a
-
-func bob() {}
-func george() {}
-`,
-			"a/a_test.go": `package a
-
-import "testing"
-
-func TestAll(t *testing.T) {
-	bob()
-	george()
-}
-`,
-		})
-		env.Await(
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				NoDiagnostics("a/a.go"),
-			),
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				NoDiagnostics("a/a_test.go"),
-			),
-		)
-		// Now, add a new file to the test variant and use its symbol in the
-		// original test file. Expect no diagnostics.
-		env.WriteWorkspaceFiles(map[string]string{
-			"a/a_test.go": `package a
-
-import "testing"
-
-func TestAll(t *testing.T) {
-	bob()
-	george()
-	hi()
-}
-`,
-			"a/a2_test.go": `package a
-
-import "testing"
-
-func hi() {}
-
-func TestSomething(t *testing.T) {}
-`,
-		})
-		env.Await(
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				NoDiagnostics("a/a_test.go"),
-			),
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				NoDiagnostics("a/a2_test.go"),
-			),
-		)
-	})
-}
diff -urN a/gopls/internal/regtest/workspace/workspace_test.go b/gopls/internal/regtest/workspace/workspace_test.go
--- a/gopls/internal/regtest/workspace/workspace_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/internal/regtest/workspace/workspace_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,1163 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package workspace
-
-import (
-	"encoding/json"
-	"fmt"
-	"io/ioutil"
-	"path/filepath"
-	"sort"
-	"strings"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	. "golang.org/x/tools/internal/lsp/regtest"
-	"golang.org/x/tools/internal/lsp/source"
-
-	"golang.org/x/tools/internal/lsp/command"
-	"golang.org/x/tools/internal/lsp/fake"
-	"golang.org/x/tools/internal/lsp/protocol"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMain(m *testing.M) {
-	Main(m, hooks.Options)
-}
-
-const workspaceProxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-func SaySomething() {
-	fmt.Println("something")
-}
--- random.org@v1.2.3/go.mod --
-module random.org
-
-go 1.12
--- random.org@v1.2.3/bye/bye.go --
-package bye
-
-func Goodbye() {
-	println("Bye")
-}
-`
-
-// TODO: Add a replace directive.
-const workspaceModule = `
--- pkg/go.mod --
-module mod.com
-
-go 1.14
-
-require (
-	example.com v1.2.3
-	random.org v1.2.3
-)
--- pkg/go.sum --
-example.com v1.2.3 h1:Yryq11hF02fEf2JlOS2eph+ICE2/ceevGV3C9dl5V/c=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
-random.org v1.2.3 h1:+JE2Fkp7gS0zsHXGEQJ7hraom3pNTlkxC4b2qPfA+/Q=
-random.org v1.2.3/go.mod h1:E9KM6+bBX2g5ykHZ9H27w16sWo3QwgonyjM44Dnej3I=
--- pkg/main.go --
-package main
-
-import (
-	"example.com/blah"
-	"mod.com/inner"
-	"random.org/bye"
-)
-
-func main() {
-	blah.SaySomething()
-	inner.Hi()
-	bye.Goodbye()
-}
--- pkg/main2.go --
-package main
-
-import "fmt"
-
-func _() {
-	fmt.Print("%s")
-}
--- pkg/inner/inner.go --
-package inner
-
-import "example.com/blah"
-
-func Hi() {
-	blah.SaySomething()
-}
--- goodbye/bye/bye.go --
-package bye
-
-func Bye() {}
--- goodbye/go.mod --
-module random.org
-
-go 1.12
-`
-
-// Confirm that find references returns all of the references in the module,
-// regardless of what the workspace root is.
-func TestReferences(t *testing.T) {
-	for _, tt := range []struct {
-		name, rootPath string
-	}{
-		{
-			name:     "module root",
-			rootPath: "pkg",
-		},
-		{
-			name:     "subdirectory",
-			rootPath: "pkg/inner",
-		},
-	} {
-		t.Run(tt.name, func(t *testing.T) {
-			opts := []RunOption{ProxyFiles(workspaceProxy)}
-			if tt.rootPath != "" {
-				opts = append(opts, WorkspaceFolders(tt.rootPath))
-			}
-			WithOptions(opts...).Run(t, workspaceModule, func(t *testing.T, env *Env) {
-				f := "pkg/inner/inner.go"
-				env.OpenFile(f)
-				locations := env.References(f, env.RegexpSearch(f, `SaySomething`))
-				want := 3
-				if got := len(locations); got != want {
-					t.Fatalf("expected %v locations, got %v", want, got)
-				}
-			})
-		})
-	}
-}
-
-// make sure that directory filters work
-func TestFilters(t *testing.T) {
-	for _, tt := range []struct {
-		name, rootPath string
-	}{
-		{
-			name:     "module root",
-			rootPath: "pkg",
-		},
-	} {
-		t.Run(tt.name, func(t *testing.T) {
-			opts := []RunOption{ProxyFiles(workspaceProxy)}
-			if tt.rootPath != "" {
-				opts = append(opts, WorkspaceFolders(tt.rootPath))
-			}
-			f := func(o *source.Options) {
-				o.DirectoryFilters = append(o.DirectoryFilters, "-inner")
-			}
-			opts = append(opts, Options(f))
-			WithOptions(opts...).Run(t, workspaceModule, func(t *testing.T, env *Env) {
-				syms := env.WorkspaceSymbol("Hi")
-				sort.Slice(syms, func(i, j int) bool { return syms[i].ContainerName < syms[j].ContainerName })
-				for i, s := range syms {
-					if strings.Contains(s.ContainerName, "/inner") {
-						t.Errorf("%s %v %s %s %d\n", s.Name, s.Kind, s.ContainerName, tt.name, i)
-					}
-				}
-			})
-		})
-	}
-}
-
-// Make sure that analysis diagnostics are cleared for the whole package when
-// the only opened file is closed. This test was inspired by the experience in
-// VS Code, where clicking on a reference result triggers a
-// textDocument/didOpen without a corresponding textDocument/didClose.
-func TestClearAnalysisDiagnostics(t *testing.T) {
-	WithOptions(
-		ProxyFiles(workspaceProxy),
-		WorkspaceFolders("pkg/inner"),
-	).Run(t, workspaceModule, func(t *testing.T, env *Env) {
-		env.OpenFile("pkg/main.go")
-		env.Await(
-			env.DiagnosticAtRegexp("pkg/main2.go", "fmt.Print"),
-		)
-		env.CloseBuffer("pkg/main.go")
-		env.Await(
-			EmptyDiagnostics("pkg/main2.go"),
-		)
-	})
-}
-
-// This test checks that gopls updates the set of files it watches when a
-// replace target is added to the go.mod.
-func TestWatchReplaceTargets(t *testing.T) {
-	t.Skipf("skipping known-flaky test: see https://go.dev/issue/50748")
-
-	WithOptions(
-		ProxyFiles(workspaceProxy),
-		WorkspaceFolders("pkg"),
-	).Run(t, workspaceModule, func(t *testing.T, env *Env) {
-		// Add a replace directive and expect the files that gopls is watching
-		// to change.
-		dir := env.Sandbox.Workdir.URI("goodbye").SpanURI().Filename()
-		goModWithReplace := fmt.Sprintf(`%s
-replace random.org => %s
-`, env.ReadWorkspaceFile("pkg/go.mod"), dir)
-		env.WriteWorkspaceFile("pkg/go.mod", goModWithReplace)
-		env.Await(
-			env.DoneWithChangeWatchedFiles(),
-			UnregistrationMatching("didChangeWatchedFiles"),
-			RegistrationMatching("didChangeWatchedFiles"),
-		)
-	})
-}
-
-const workspaceModuleProxy = `
--- example.com@v1.2.3/go.mod --
-module example.com
-
-go 1.12
--- example.com@v1.2.3/blah/blah.go --
-package blah
-
-func SaySomething() {
-	fmt.Println("something")
-}
--- b.com@v1.2.3/go.mod --
-module b.com
-
-go 1.12
--- b.com@v1.2.3/b/b.go --
-package b
-
-func Hello() {}
-`
-
-func TestAutomaticWorkspaceModule_Interdependent(t *testing.T) {
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-require b.com v1.2.3
--- moda/a/go.sum --
-b.com v1.2.3 h1:tXrlXP0rnjRpKNmkbLYoWBdq0ikb3C3bKK9//moAWBI=
-b.com v1.2.3/go.mod h1:D+J7pfFBZK5vdIdZEFquR586vKKIkqG7Qjw9AxG5BQ8=
--- moda/a/a.go --
-package a
-
-import (
-	"b.com/b"
-)
-
-func main() {
-	var x int
-	_ = b.Hello()
-}
--- modb/go.mod --
-module b.com
-
--- modb/b/b.go --
-package b
-
-func Hello() int {
-	var x int
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceModuleProxy),
-		Modes(Experimental),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexp("moda/a/a.go", "x"),
-			env.DiagnosticAtRegexp("modb/b/b.go", "x"),
-			env.NoDiagnosticAtRegexp("moda/a/a.go", `"b.com/b"`),
-		)
-	})
-}
-
-func TestMultiModuleWithExclude(t *testing.T) {
-	testenv.NeedsGo1Point(t, 16)
-
-	const proxy = `
--- c.com@v1.2.3/go.mod --
-module c.com
-
-go 1.12
-
-require b.com v1.2.3
--- c.com@v1.2.3/blah/blah.go --
-package blah
-
-func SaySomething() {
-	fmt.Println("something")
-}
--- b.com@v1.2.3/go.mod --
-module b.com
-
-go 1.12
--- b.com@v1.2.4/b/b.go --
-package b
-
-func Hello() {}
--- b.com@v1.2.4/go.mod --
-module b.com
-
-go 1.12
--- b.com@v1.2.4/b/b.go --
-package b
-
-func Hello() {}
-`
-	const multiModule = `
--- go.mod --
-module a.com
-
-require c.com v1.2.3
-
-exclude b.com v1.2.3
--- go.sum --
-c.com v1.2.3 h1:n07Dz9fYmpNqvZMwZi5NEqFcSHbvLa9lacMX+/g25tw=
-c.com v1.2.3/go.mod h1:/4TyYgU9Nu5tA4NymP5xyqE8R2VMzGD3TbJCwCOvHAg=
--- main.go --
-package a
-
-func main() {
-	var x int
-}
-`
-	WithOptions(
-		ProxyFiles(proxy),
-		Modes(Experimental),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexp("main.go", "x"),
-		)
-	})
-}
-
-// This change tests that the version of the module used changes after it has
-// been deleted from the workspace.
-func TestDeleteModule_Interdependent(t *testing.T) {
-	t.Skip("Skipping due to golang/go#46375: race due to orphaned file reloading")
-
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-require b.com v1.2.3
--- moda/a/go.sum --
-b.com v1.2.3 h1:tXrlXP0rnjRpKNmkbLYoWBdq0ikb3C3bKK9//moAWBI=
-b.com v1.2.3/go.mod h1:D+J7pfFBZK5vdIdZEFquR586vKKIkqG7Qjw9AxG5BQ8=
--- moda/a/a.go --
-package a
-
-import (
-	"b.com/b"
-)
-
-func main() {
-	var x int
-	_ = b.Hello()
-}
--- modb/go.mod --
-module b.com
-
--- modb/b/b.go --
-package b
-
-func Hello() int {
-	var x int
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceModuleProxy),
-		Modes(Experimental),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		env.OpenFile("moda/a/a.go")
-		env.Await(env.DoneWithOpen())
-
-		original, _ := env.GoToDefinition("moda/a/a.go", env.RegexpSearch("moda/a/a.go", "Hello"))
-		if want := "modb/b/b.go"; !strings.HasSuffix(original, want) {
-			t.Errorf("expected %s, got %v", want, original)
-		}
-		env.CloseBuffer(original)
-		env.Await(env.DoneWithClose())
-
-		env.RemoveWorkspaceFile("modb/b/b.go")
-		env.RemoveWorkspaceFile("modb/go.mod")
-		env.Await(
-			env.DoneWithChangeWatchedFiles(),
-		)
-
-		d := protocol.PublishDiagnosticsParams{}
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexpWithMessage("moda/a/go.mod", "require b.com v1.2.3", "b.com@v1.2.3 has not been downloaded"),
-				ReadDiagnostics("moda/a/go.mod", &d),
-			),
-		)
-		env.ApplyQuickFixes("moda/a/go.mod", d.Diagnostics)
-		env.Await(env.DoneWithChangeWatchedFiles())
-		got, _ := env.GoToDefinition("moda/a/a.go", env.RegexpSearch("moda/a/a.go", "Hello"))
-		if want := "b.com@v1.2.3/b/b.go"; !strings.HasSuffix(got, want) {
-			t.Errorf("expected %s, got %v", want, got)
-		}
-	})
-}
-
-// Tests that the version of the module used changes after it has been added
-// to the workspace.
-func TestCreateModule_Interdependent(t *testing.T) {
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-require b.com v1.2.3
--- moda/a/go.sum --
-b.com v1.2.3 h1:tXrlXP0rnjRpKNmkbLYoWBdq0ikb3C3bKK9//moAWBI=
-b.com v1.2.3/go.mod h1:D+J7pfFBZK5vdIdZEFquR586vKKIkqG7Qjw9AxG5BQ8=
--- moda/a/a.go --
-package a
-
-import (
-	"b.com/b"
-)
-
-func main() {
-	var x int
-	_ = b.Hello()
-}
-`
-	WithOptions(
-		Modes(Experimental),
-		ProxyFiles(workspaceModuleProxy),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		env.OpenFile("moda/a/a.go")
-		original, _ := env.GoToDefinition("moda/a/a.go", env.RegexpSearch("moda/a/a.go", "Hello"))
-		if want := "b.com@v1.2.3/b/b.go"; !strings.HasSuffix(original, want) {
-			t.Errorf("expected %s, got %v", want, original)
-		}
-		env.CloseBuffer(original)
-		env.WriteWorkspaceFiles(map[string]string{
-			"modb/go.mod": "module b.com",
-			"modb/b/b.go": `package b
-
-func Hello() int {
-	var x int
-}
-`,
-		})
-		env.Await(
-			OnceMet(
-				env.DoneWithChangeWatchedFiles(),
-				env.DiagnosticAtRegexp("modb/b/b.go", "x"),
-			),
-		)
-		got, _ := env.GoToDefinition("moda/a/a.go", env.RegexpSearch("moda/a/a.go", "Hello"))
-		if want := "modb/b/b.go"; !strings.HasSuffix(got, want) {
-			t.Errorf("expected %s, got %v", want, original)
-		}
-	})
-}
-
-// This test confirms that a gopls workspace can recover from initialization
-// with one invalid module.
-func TestOneBrokenModule(t *testing.T) {
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-require b.com v1.2.3
-
--- moda/a/a.go --
-package a
-
-import (
-	"b.com/b"
-)
-
-func main() {
-	var x int
-	_ = b.Hello()
-}
--- modb/go.mod --
-modul b.com // typo here
-
--- modb/b/b.go --
-package b
-
-func Hello() int {
-	var x int
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceModuleProxy),
-		Modes(Experimental),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		env.OpenFile("modb/go.mod")
-		env.Await(
-			OnceMet(
-				env.DoneWithOpen(),
-				DiagnosticAt("modb/go.mod", 0, 0),
-			),
-		)
-		env.RegexpReplace("modb/go.mod", "modul", "module")
-		env.SaveBufferWithoutActions("modb/go.mod")
-		env.Await(
-			env.DiagnosticAtRegexp("modb/b/b.go", "x"),
-		)
-	})
-}
-
-func TestUseGoplsMod(t *testing.T) {
-	// This test validates certain functionality related to using a gopls.mod
-	// file to specify workspace modules.
-	testenv.NeedsGo1Point(t, 14)
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-require b.com v1.2.3
--- moda/a/go.sum --
-b.com v1.2.3 h1:tXrlXP0rnjRpKNmkbLYoWBdq0ikb3C3bKK9//moAWBI=
-b.com v1.2.3/go.mod h1:D+J7pfFBZK5vdIdZEFquR586vKKIkqG7Qjw9AxG5BQ8=
--- moda/a/a.go --
-package a
-
-import (
-	"b.com/b"
-)
-
-func main() {
-	var x int
-	_ = b.Hello()
-}
--- modb/go.mod --
-module b.com
-
-require example.com v1.2.3
--- modb/go.sum --
-example.com v1.2.3 h1:Yryq11hF02fEf2JlOS2eph+ICE2/ceevGV3C9dl5V/c=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- modb/b/b.go --
-package b
-
-func Hello() int {
-	var x int
-}
--- gopls.mod --
-module gopls-workspace
-
-require (
-	a.com v0.0.0-goplsworkspace
-	b.com v1.2.3
-)
-
-replace a.com => $SANDBOX_WORKDIR/moda/a
-`
-	WithOptions(
-		ProxyFiles(workspaceModuleProxy),
-		Modes(Experimental),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		// Initially, the gopls.mod should cause only the a.com module to be
-		// loaded. Validate this by jumping to a definition in b.com and ensuring
-		// that we go to the module cache.
-		env.OpenFile("moda/a/a.go")
-		env.Await(env.DoneWithOpen())
-
-		// To verify which modules are loaded, we'll jump to the definition of
-		// b.Hello.
-		checkHelloLocation := func(want string) error {
-			location, _ := env.GoToDefinition("moda/a/a.go", env.RegexpSearch("moda/a/a.go", "Hello"))
-			if !strings.HasSuffix(location, want) {
-				return fmt.Errorf("expected %s, got %v", want, location)
-			}
-			return nil
-		}
-
-		// Initially this should be in the module cache, as b.com is not replaced.
-		if err := checkHelloLocation("b.com@v1.2.3/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-
-		// Now, modify the gopls.mod file on disk to activate the b.com module in
-		// the workspace.
-		workdir := env.Sandbox.Workdir.RootURI().SpanURI().Filename()
-		env.WriteWorkspaceFile("gopls.mod", fmt.Sprintf(`module gopls-workspace
-
-require (
-	a.com v1.9999999.0-goplsworkspace
-	b.com v1.9999999.0-goplsworkspace
-)
-
-replace a.com => %s/moda/a
-replace b.com => %s/modb
-`, workdir, workdir))
-		env.Await(env.DoneWithChangeWatchedFiles())
-		// Check that go.mod diagnostics picked up the newly active mod file.
-		// The local version of modb has an extra dependency we need to download.
-		env.OpenFile("modb/go.mod")
-		env.Await(env.DoneWithOpen())
-
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexpWithMessage("modb/go.mod", `require example.com v1.2.3`, "has not been downloaded"),
-				ReadDiagnostics("modb/go.mod", &d),
-			),
-		)
-		env.ApplyQuickFixes("modb/go.mod", d.Diagnostics)
-		env.Await(env.DiagnosticAtRegexp("modb/b/b.go", "x"))
-		// Jumping to definition should now go to b.com in the workspace.
-		if err := checkHelloLocation("modb/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-
-		// Now, let's modify the gopls.mod *overlay* (not on disk), and verify that
-		// this change is only picked up once it is saved.
-		env.OpenFile("gopls.mod")
-		env.Await(env.DoneWithOpen())
-		env.SetBufferContent("gopls.mod", fmt.Sprintf(`module gopls-workspace
-
-require (
-	a.com v0.0.0-goplsworkspace
-)
-
-replace a.com => %s/moda/a
-`, workdir))
-
-		// Editing the gopls.mod removes modb from the workspace modules, and so
-		// should clear outstanding diagnostics...
-		env.Await(OnceMet(
-			env.DoneWithChange(),
-			EmptyDiagnostics("modb/go.mod"),
-		))
-		// ...but does not yet cause a workspace reload, so we should still jump to modb.
-		if err := checkHelloLocation("modb/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-		// Saving should reload the workspace.
-		env.SaveBufferWithoutActions("gopls.mod")
-		if err := checkHelloLocation("b.com@v1.2.3/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-	})
-}
-
-func TestUseGoWork(t *testing.T) {
-	// This test validates certain functionality related to using a go.work
-	// file to specify workspace modules.
-	testenv.NeedsGo1Point(t, 14)
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-require b.com v1.2.3
--- moda/a/go.sum --
-b.com v1.2.3 h1:tXrlXP0rnjRpKNmkbLYoWBdq0ikb3C3bKK9//moAWBI=
-b.com v1.2.3/go.mod h1:D+J7pfFBZK5vdIdZEFquR586vKKIkqG7Qjw9AxG5BQ8=
--- moda/a/a.go --
-package a
-
-import (
-	"b.com/b"
-)
-
-func main() {
-	var x int
-	_ = b.Hello()
-}
--- modb/go.mod --
-module b.com
-
-require example.com v1.2.3
--- modb/go.sum --
-example.com v1.2.3 h1:Yryq11hF02fEf2JlOS2eph+ICE2/ceevGV3C9dl5V/c=
-example.com v1.2.3/go.mod h1:Y2Rc5rVWjWur0h3pd9aEvK5Pof8YKDANh9gHA2Maujo=
--- modb/b/b.go --
-package b
-
-func Hello() int {
-	var x int
-}
--- go.work --
-go 1.17
-
-directory (
-	./moda/a
-)
-`
-	WithOptions(
-		ProxyFiles(workspaceModuleProxy),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		// Initially, the gopls.mod should cause only the a.com module to be
-		// loaded. Validate this by jumping to a definition in b.com and ensuring
-		// that we go to the module cache.
-		env.OpenFile("moda/a/a.go")
-		env.Await(env.DoneWithOpen())
-
-		// To verify which modules are loaded, we'll jump to the definition of
-		// b.Hello.
-		checkHelloLocation := func(want string) error {
-			location, _ := env.GoToDefinition("moda/a/a.go", env.RegexpSearch("moda/a/a.go", "Hello"))
-			if !strings.HasSuffix(location, want) {
-				return fmt.Errorf("expected %s, got %v", want, location)
-			}
-			return nil
-		}
-
-		// Initially this should be in the module cache, as b.com is not replaced.
-		if err := checkHelloLocation("b.com@v1.2.3/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-
-		// Now, modify the gopls.mod file on disk to activate the b.com module in
-		// the workspace.
-		env.WriteWorkspaceFile("go.work", `
-go 1.17
-
-directory (
-	./moda/a
-	./modb
-)
-`)
-		env.Await(env.DoneWithChangeWatchedFiles())
-		// Check that go.mod diagnostics picked up the newly active mod file.
-		// The local version of modb has an extra dependency we need to download.
-		env.OpenFile("modb/go.mod")
-		env.Await(env.DoneWithOpen())
-
-		var d protocol.PublishDiagnosticsParams
-		env.Await(
-			OnceMet(
-				env.DiagnosticAtRegexpWithMessage("modb/go.mod", `require example.com v1.2.3`, "has not been downloaded"),
-				ReadDiagnostics("modb/go.mod", &d),
-			),
-		)
-		env.ApplyQuickFixes("modb/go.mod", d.Diagnostics)
-		env.Await(env.DiagnosticAtRegexp("modb/b/b.go", "x"))
-		// Jumping to definition should now go to b.com in the workspace.
-		if err := checkHelloLocation("modb/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-
-		// Now, let's modify the gopls.mod *overlay* (not on disk), and verify that
-		// this change is only picked up once it is saved.
-		env.OpenFile("go.work")
-		env.Await(env.DoneWithOpen())
-		env.SetBufferContent("go.work", `go 1.17
-
-directory (
-	./moda/a
-)`)
-
-		// Editing the gopls.mod removes modb from the workspace modules, and so
-		// should clear outstanding diagnostics...
-		env.Await(OnceMet(
-			env.DoneWithChange(),
-			EmptyDiagnostics("modb/go.mod"),
-		))
-		// ...but does not yet cause a workspace reload, so we should still jump to modb.
-		if err := checkHelloLocation("modb/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-		// Saving should reload the workspace.
-		env.SaveBufferWithoutActions("go.work")
-		if err := checkHelloLocation("b.com@v1.2.3/b/b.go"); err != nil {
-			t.Fatal(err)
-		}
-	})
-}
-
-func TestNonWorkspaceFileCreation(t *testing.T) {
-	testenv.NeedsGo1Point(t, 13)
-
-	const files = `
--- go.mod --
-module mod.com
-
-go 1.12
--- x.go --
-package x
-`
-
-	const code = `
-package foo
-import "fmt"
-var _ = fmt.Printf
-`
-	Run(t, files, func(t *testing.T, env *Env) {
-		env.CreateBuffer("/tmp/foo.go", "")
-		env.EditBuffer("/tmp/foo.go", fake.NewEdit(0, 0, 0, 0, code))
-		env.GoToDefinition("/tmp/foo.go", env.RegexpSearch("/tmp/foo.go", `Printf`))
-	})
-}
-
-func TestMultiModuleV2(t *testing.T) {
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-require b.com/v2 v2.1.9
--- moda/a/a.go --
-package a
-
-import (
-	"b.com/v2/b"
-)
-
-func main() {
-	var x int
-	_ = b.Hi()
-}
--- modb/go.mod --
-module b.com
-
--- modb/b/b.go --
-package b
-
-func Hello() int {
-	var x int
-}
--- modb/v2/go.mod --
-module b.com/v2
-
--- modb/v2/b/b.go --
-package b
-
-func Hi() int {
-	var x int
-}
--- modc/go.mod --
-module gopkg.in/yaml.v1 // test gopkg.in versions
--- modc/main.go --
-package main
-
-func main() {
-	var x int
-}
-`
-	WithOptions(
-		Modes(Experimental),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		env.Await(
-			env.DiagnosticAtRegexp("moda/a/a.go", "x"),
-			env.DiagnosticAtRegexp("modb/b/b.go", "x"),
-			env.DiagnosticAtRegexp("modb/v2/b/b.go", "x"),
-			env.DiagnosticAtRegexp("modc/main.go", "x"),
-		)
-	})
-}
-
-func TestWorkspaceDirAccess(t *testing.T) {
-	const multiModule = `
--- moda/a/go.mod --
-module a.com
-
-go 1.15
--- moda/a/a.go --
-package main
-
-func main() {
-	fmt.Println("Hello")
-}
--- modb/go.mod --
-module b.com
-
-go 1.16
--- modb/b/b.go --
-package main
-
-func main() {
-	fmt.Println("World")
-}
-`
-	WithOptions(
-		Modes(Experimental),
-		SendPID(),
-	).Run(t, multiModule, func(t *testing.T, env *Env) {
-		params := &protocol.ExecuteCommandParams{
-			Command:   command.WorkspaceMetadata.ID(),
-			Arguments: []json.RawMessage{json.RawMessage("{}")},
-		}
-		var result command.WorkspaceMetadataResult
-		env.ExecuteCommand(params, &result)
-
-		if n := len(result.Workspaces); n != 1 {
-			env.T.Fatalf("got %d workspaces, want 1", n)
-		}
-		// Don't factor this out of Server.addFolders. vscode-go expects this
-		// directory.
-		modPath := filepath.Join(result.Workspaces[0].ModuleDir, "go.mod")
-		gotb, err := ioutil.ReadFile(modPath)
-		if err != nil {
-			t.Fatalf("reading expected workspace modfile: %v", err)
-		}
-		got := string(gotb)
-		for _, want := range []string{"go 1.16", "a.com v1.9999999.0-goplsworkspace", "b.com v1.9999999.0-goplsworkspace"} {
-			if !strings.Contains(got, want) {
-				// want before got here, since the go.mod is multi-line
-				t.Fatalf("workspace go.mod missing %q. got:\n%s", want, got)
-			}
-		}
-		workdir := env.Sandbox.Workdir.RootURI().SpanURI().Filename()
-		env.WriteWorkspaceFile("gopls.mod", fmt.Sprintf(`
-				module gopls-workspace
-
-				require (
-					a.com v1.9999999.0-goplsworkspace
-				)
-
-				replace a.com => %s/moda/a
-				`, workdir))
-		env.Await(env.DoneWithChangeWatchedFiles())
-		gotb, err = ioutil.ReadFile(modPath)
-		if err != nil {
-			t.Fatalf("reading expected workspace modfile: %v", err)
-		}
-		got = string(gotb)
-		want := "b.com v1.9999999.0-goplsworkspace"
-		if strings.Contains(got, want) {
-			t.Fatalf("workspace go.mod contains unexpected %q. got:\n%s", want, got)
-		}
-	})
-}
-
-func TestDirectoryFiltersLoads(t *testing.T) {
-	// exclude, and its error, should be excluded from the workspace.
-	const files = `
--- go.mod --
-module example.com
-
-go 1.12
--- exclude/exclude.go --
-package exclude
-
-const _ = Nonexistant
-`
-	cfg := EditorConfig{
-		DirectoryFilters: []string{"-exclude"},
-	}
-	WithOptions(cfg).Run(t, files, func(t *testing.T, env *Env) {
-		env.Await(NoDiagnostics("exclude/x.go"))
-	})
-}
-
-func TestDirectoryFiltersTransitiveDep(t *testing.T) {
-	// Even though exclude is excluded from the workspace, it should
-	// still be importable as a non-workspace package.
-	const files = `
--- go.mod --
-module example.com
-
-go 1.12
--- include/include.go --
-package include
-import "example.com/exclude"
-
-const _ = exclude.X
--- exclude/exclude.go --
-package exclude
-
-const _ = Nonexistant // should be ignored, since this is a non-workspace package
-const X = 1
-`
-
-	cfg := EditorConfig{
-		DirectoryFilters: []string{"-exclude"},
-	}
-	WithOptions(cfg).Run(t, files, func(t *testing.T, env *Env) {
-		env.Await(
-			NoDiagnostics("exclude/exclude.go"), // filtered out
-			NoDiagnostics("include/include.go"), // successfully builds
-		)
-	})
-}
-
-func TestDirectoryFiltersWorkspaceModules(t *testing.T) {
-	// Define a module include.com which should be in the workspace, plus a
-	// module exclude.com which should be excluded and therefore come from
-	// the proxy.
-	const files = `
--- include/go.mod --
-module include.com
-
-go 1.12
-
-require exclude.com v1.0.0
-
--- include/go.sum --
-exclude.com v1.0.0 h1:Q5QSfDXY5qyNCBeUiWovUGqcLCRZKoTs9XdBeVz+w1I=
-exclude.com v1.0.0/go.mod h1:hFox2uDlNB2s2Jfd9tHlQVfgqUiLVTmh6ZKat4cvnj4=
-
--- include/include.go --
-package include
-
-import "exclude.com"
-
-var _ = exclude.X // satisfied only by the workspace version
--- exclude/go.mod --
-module exclude.com
-
-go 1.12
--- exclude/exclude.go --
-package exclude
-
-const X = 1
-`
-	const proxy = `
--- exclude.com@v1.0.0/go.mod --
-module exclude.com
-
-go 1.12
--- exclude.com@v1.0.0/exclude.go --
-package exclude
-`
-	cfg := EditorConfig{
-		DirectoryFilters: []string{"-exclude"},
-	}
-	WithOptions(cfg, Modes(Experimental), ProxyFiles(proxy)).Run(t, files, func(t *testing.T, env *Env) {
-		env.Await(env.DiagnosticAtRegexp("include/include.go", `exclude.(X)`))
-	})
-}
-
-// Confirm that a fix for a tidy module will correct all modules in the
-// workspace.
-func TestMultiModule_OneBrokenModule(t *testing.T) {
-	testenv.NeedsGo1Point(t, 15)
-
-	const mod = `
--- a/go.mod --
-module a.com
-
-go 1.12
--- a/main.go --
-package main
--- b/go.mod --
-module b.com
-
-go 1.12
-
-require (
-	example.com v1.2.3
-)
--- b/go.sum --
--- b/main.go --
-package b
-
-import "example.com/blah"
-
-func main() {
-	blah.Hello()
-}
-`
-	WithOptions(
-		ProxyFiles(workspaceProxy),
-		Modes(Experimental),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		params := &protocol.PublishDiagnosticsParams{}
-		env.OpenFile("b/go.mod")
-		env.Await(
-			OnceMet(
-				env.GoSumDiagnostic("b/go.mod", `example.com v1.2.3`),
-				ReadDiagnostics("b/go.mod", params),
-			),
-		)
-		for _, d := range params.Diagnostics {
-			if !strings.Contains(d.Message, "go.sum is out of sync") {
-				continue
-			}
-			actions := env.GetQuickFixes("b/go.mod", []protocol.Diagnostic{d})
-			if len(actions) != 2 {
-				t.Fatalf("expected 2 code actions, got %v", len(actions))
-			}
-			env.ApplyQuickFixes("b/go.mod", []protocol.Diagnostic{d})
-		}
-		env.Await(
-			EmptyDiagnostics("b/go.mod"),
-		)
-	})
-}
-
-// Sometimes users may have their module cache within the workspace.
-// We shouldn't consider any module in the module cache to be in the workspace.
-func TestGOMODCACHEInWorkspace(t *testing.T) {
-	const mod = `
--- a/go.mod --
-module a.com
-
-go 1.12
--- a/a.go --
-package a
-
-func _() {}
--- a/c/c.go --
-package c
--- gopath/src/b/b.go --
-package b
--- gopath/pkg/mod/example.com/go.mod --
-module example.com
-
-go 1.12
--- gopath/pkg/mod/example.com/main.go --
-package main
-`
-	WithOptions(
-		EditorConfig{Env: map[string]string{
-			"GOPATH": filepath.FromSlash("$SANDBOX_WORKDIR/gopath"),
-		}},
-		Modes(Singleton),
-	).Run(t, mod, func(t *testing.T, env *Env) {
-		env.Await(
-			// Confirm that the build configuration is seen as valid,
-			// even though there are technically multiple go.mod files in the
-			// worskpace.
-			LogMatching(protocol.Info, ".*valid build configuration = true.*", 1, false),
-		)
-	})
-}
-
-func TestAddGoWork(t *testing.T) {
-	const nomod = `
--- a/go.mod --
-module a.com
-
-go 1.16
--- a/main.go --
-package main
-
-func main() {}
--- b/go.mod --
-module b.com
-
-go 1.16
--- b/main.go --
-package main
-
-func main() {}
-`
-	WithOptions(
-		Modes(Singleton),
-	).Run(t, nomod, func(t *testing.T, env *Env) {
-		env.OpenFile("a/main.go")
-		env.OpenFile("b/main.go")
-		env.Await(
-			DiagnosticAt("a/main.go", 0, 0),
-			DiagnosticAt("b/main.go", 0, 0),
-		)
-		env.WriteWorkspaceFile("go.work", `go 1.16
-
-directory (
-	a
-	b
-)
-`)
-		env.Await(
-			EmptyDiagnostics("a/main.go"),
-			EmptyDiagnostics("b/main.go"),
-		)
-	})
-}
diff -urN a/gopls/main.go b/gopls/main.go
--- a/gopls/main.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/main.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,26 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-// Gopls (pronounced “go please”) is an LSP server for Go.
-// The Language Server Protocol allows any text editor
-// to be extended with IDE-like features;
-// see https://langserver.org/ for details.
-//
-// See https://github.com/golang/tools/blob/master/gopls/README.md
-// for the most up-to-date documentation.
-package main // import "golang.org/x/tools/gopls"
-
-import (
-	"context"
-	"os"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	"golang.org/x/tools/internal/lsp/cmd"
-	"golang.org/x/tools/internal/tool"
-)
-
-func main() {
-	ctx := context.Background()
-	tool.Main(ctx, cmd.New("gopls", "", nil, hooks.Options), os.Args[1:])
-}
diff -urN a/gopls/release/release.go b/gopls/release/release.go
--- a/gopls/release/release.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/release/release.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,213 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-//
-// Package release checks that the a given version of gopls is ready for
-// release. It can also tag and publish the release.
-//
-// To run:
-//
-// $ cd $GOPATH/src/golang.org/x/tools/gopls
-// $ go run release/release.go -version=<version>
-package main
-
-import (
-	"flag"
-	"fmt"
-	"go/types"
-	exec "golang.org/x/sys/execabs"
-	"io/ioutil"
-	"log"
-	"os"
-	"os/user"
-	"path/filepath"
-	"strconv"
-	"strings"
-
-	"golang.org/x/mod/modfile"
-	"golang.org/x/mod/semver"
-	"golang.org/x/tools/go/packages"
-)
-
-var (
-	versionFlag = flag.String("version", "", "version to tag")
-	remoteFlag  = flag.String("remote", "", "remote to which to push the tag")
-	releaseFlag = flag.Bool("release", false, "release is true if you intend to tag and push a release")
-)
-
-func main() {
-	flag.Parse()
-
-	if *versionFlag == "" {
-		log.Fatalf("must provide -version flag")
-	}
-	if !semver.IsValid(*versionFlag) {
-		log.Fatalf("invalid version %s", *versionFlag)
-	}
-	if semver.Major(*versionFlag) != "v0" {
-		log.Fatalf("expected major version v0, got %s", semver.Major(*versionFlag))
-	}
-	if semver.Build(*versionFlag) != "" {
-		log.Fatalf("unexpected build suffix: %s", *versionFlag)
-	}
-	if *releaseFlag && *remoteFlag == "" {
-		log.Fatalf("must provide -remote flag if releasing")
-	}
-	user, err := user.Current()
-	if err != nil {
-		log.Fatal(err)
-	}
-	// Validate that the user is running the program from the gopls module.
-	wd, err := os.Getwd()
-	if err != nil {
-		log.Fatal(err)
-	}
-	if filepath.Base(wd) != "gopls" {
-		log.Fatalf("must run from the gopls module")
-	}
-	// Confirm that they are running on a branch with a name following the
-	// format of "gopls-release-branch.<major>.<minor>".
-	if err := validateBranchName(*versionFlag); err != nil {
-		log.Fatal(err)
-	}
-	// Confirm that they have updated the hardcoded version.
-	if err := validateHardcodedVersion(wd, *versionFlag); err != nil {
-		log.Fatal(err)
-	}
-	// Confirm that the versions in the go.mod file are correct.
-	if err := validateGoModFile(wd); err != nil {
-		log.Fatal(err)
-	}
-	earlyExitMsg := "Validated that the release is ready. Exiting without tagging and publishing."
-	if !*releaseFlag {
-		fmt.Println(earlyExitMsg)
-		os.Exit(0)
-	}
-	fmt.Println(`Proceeding to tagging and publishing the release...
-Please enter Y if you wish to proceed or anything else if you wish to exit.`)
-	// Accept and process user input.
-	var input string
-	fmt.Scanln(&input)
-	switch input {
-	case "Y":
-		fmt.Println("Proceeding to tagging and publishing the release.")
-	default:
-		fmt.Println(earlyExitMsg)
-		os.Exit(0)
-	}
-	// To tag the release:
-	// $ git -c user.email=username@google.com tag -a -m “<message>” gopls/v<major>.<minor>.<patch>-<pre-release>
-	goplsVersion := fmt.Sprintf("gopls/%s", *versionFlag)
-	cmd := exec.Command("git", "-c", fmt.Sprintf("user.email=%s@google.com", user.Username), "tag", "-a", "-m", fmt.Sprintf("%q", goplsVersion), goplsVersion)
-	if err := cmd.Run(); err != nil {
-		log.Fatal(err)
-	}
-	// Push the tag to the remote:
-	// $ git push <remote> gopls/v<major>.<minor>.<patch>-pre.1
-	cmd = exec.Command("git", "push", *remoteFlag, goplsVersion)
-	if err := cmd.Run(); err != nil {
-		log.Fatal(err)
-	}
-}
-
-// validateBranchName reports whether the user's current branch name is of the
-// form "gopls-release-branch.<major>.<minor>". It reports an error if not.
-func validateBranchName(version string) error {
-	cmd := exec.Command("git", "branch", "--show-current")
-	stdout, err := cmd.Output()
-	if err != nil {
-		return err
-	}
-	branch := strings.TrimSpace(string(stdout))
-	expectedBranch := fmt.Sprintf("gopls-release-branch.%s", strings.TrimPrefix(semver.MajorMinor(version), "v"))
-	if branch != expectedBranch {
-		return fmt.Errorf("expected release branch %s, got %s", expectedBranch, branch)
-	}
-	return nil
-}
-
-// validateHardcodedVersion reports whether the version hardcoded in the gopls
-// binary is equivalent to the version being published. It reports an error if
-// not.
-func validateHardcodedVersion(wd string, version string) error {
-	pkgs, err := packages.Load(&packages.Config{
-		Dir: filepath.Dir(wd),
-		Mode: packages.NeedName | packages.NeedFiles |
-			packages.NeedCompiledGoFiles | packages.NeedImports |
-			packages.NeedTypes | packages.NeedTypesSizes,
-	}, "golang.org/x/tools/internal/lsp/debug")
-	if err != nil {
-		return err
-	}
-	if len(pkgs) != 1 {
-		return fmt.Errorf("expected 1 package, got %v", len(pkgs))
-	}
-	pkg := pkgs[0]
-	obj := pkg.Types.Scope().Lookup("Version")
-	c, ok := obj.(*types.Const)
-	if !ok {
-		return fmt.Errorf("no constant named Version")
-	}
-	hardcodedVersion, err := strconv.Unquote(c.Val().ExactString())
-	if err != nil {
-		return err
-	}
-	if semver.Prerelease(hardcodedVersion) != "" {
-		return fmt.Errorf("unexpected pre-release for hardcoded version: %s", hardcodedVersion)
-	}
-	// Don't worry about pre-release tags and expect that there is no build
-	// suffix.
-	version = strings.TrimSuffix(version, semver.Prerelease(version))
-	if hardcodedVersion != version {
-		return fmt.Errorf("expected version to be %s, got %s", *versionFlag, hardcodedVersion)
-	}
-	return nil
-}
-
-func validateGoModFile(wd string) error {
-	filename := filepath.Join(wd, "go.mod")
-	data, err := ioutil.ReadFile(filename)
-	if err != nil {
-		return err
-	}
-	gomod, err := modfile.Parse(filename, data, nil)
-	if err != nil {
-		return err
-	}
-	// Confirm that there is no replace directive in the go.mod file.
-	if len(gomod.Replace) > 0 {
-		return fmt.Errorf("expected no replace directives, got %v", len(gomod.Replace))
-	}
-	// Confirm that the version of x/tools in the gopls/go.mod file points to
-	// the second-to-last commit. (The last commit will be the one to update the
-	// go.mod file.)
-	cmd := exec.Command("git", "rev-parse", "@~")
-	stdout, err := cmd.Output()
-	if err != nil {
-		return err
-	}
-	hash := string(stdout)
-	// Find the golang.org/x/tools require line and compare the versions.
-	var version string
-	for _, req := range gomod.Require {
-		if req.Mod.Path == "golang.org/x/tools" {
-			version = req.Mod.Version
-			break
-		}
-	}
-	if version == "" {
-		return fmt.Errorf("no require for golang.org/x/tools")
-	}
-	split := strings.Split(version, "-")
-	if len(split) != 3 {
-		return fmt.Errorf("unexpected pseudoversion format %s", version)
-	}
-	last := split[len(split)-1]
-	if last == "" {
-		return fmt.Errorf("unexpected pseudoversion format %s", version)
-	}
-	if !strings.HasPrefix(hash, last) {
-		return fmt.Errorf("golang.org/x/tools pseudoversion should be at commit %s, instead got %s", hash, last)
-	}
-	return nil
-}
diff -urN a/gopls/test/debug/debug_test.go b/gopls/test/debug/debug_test.go
--- a/gopls/test/debug/debug_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/test/debug/debug_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,181 +0,0 @@
-// Copyright 2020 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package debug_test
-
-// Provide 'static type checking' of the templates. This guards against changes is various
-// gopls datastructures causing template execution to fail. The checking is done by
-// the github.com/jba/templatecheck pacakge. Before that is run, the test checks that
-// its list of templates and their arguments corresponds to the arguments in
-// calls to render(). The test assumes that all uses of templates are done through render().
-
-import (
-	"go/ast"
-	"html/template"
-	"log"
-	"runtime"
-	"sort"
-	"strings"
-	"testing"
-
-	"github.com/jba/templatecheck"
-	"golang.org/x/tools/go/packages"
-	"golang.org/x/tools/internal/lsp/cache"
-	"golang.org/x/tools/internal/lsp/debug"
-	"golang.org/x/tools/internal/lsp/source"
-	"golang.org/x/tools/internal/span"
-)
-
-type tdata struct {
-	tmpl *template.Template
-	data interface{} // a value of the needed type
-}
-
-var templates = map[string]tdata{
-	"MainTmpl":    {debug.MainTmpl, &debug.Instance{}},
-	"DebugTmpl":   {debug.DebugTmpl, nil},
-	"RPCTmpl":     {debug.RPCTmpl, &debug.Rpcs{}},
-	"TraceTmpl":   {debug.TraceTmpl, debug.TraceResults{}},
-	"CacheTmpl":   {debug.CacheTmpl, &cache.Cache{}},
-	"SessionTmpl": {debug.SessionTmpl, &cache.Session{}},
-	"ViewTmpl":    {debug.ViewTmpl, &cache.View{}},
-	"ClientTmpl":  {debug.ClientTmpl, &debug.Client{}},
-	"ServerTmpl":  {debug.ServerTmpl, &debug.Server{}},
-	//"FileTmpl":    {FileTmpl, source.Overlay{}}, // need to construct a source.Overlay in init
-	"InfoTmpl":   {debug.InfoTmpl, "something"},
-	"MemoryTmpl": {debug.MemoryTmpl, runtime.MemStats{}},
-}
-
-// construct a source.Overlay for fileTmpl
-type fakeOverlay struct{}
-
-func (fakeOverlay) Version() int32 {
-	return 0
-}
-func (fakeOverlay) Session() string {
-	return ""
-}
-func (fakeOverlay) VersionedFileIdentity() source.VersionedFileIdentity {
-	return source.VersionedFileIdentity{}
-}
-func (fakeOverlay) FileIdentity() source.FileIdentity {
-	return source.FileIdentity{}
-}
-func (fakeOverlay) Kind() source.FileKind {
-	return 0
-}
-func (fakeOverlay) Read() ([]byte, error) {
-	return nil, nil
-}
-func (fakeOverlay) Saved() bool {
-	return true
-}
-func (fakeOverlay) URI() span.URI {
-	return ""
-}
-
-var _ source.Overlay = fakeOverlay{}
-
-func init() {
-	log.SetFlags(log.Lshortfile)
-	var v fakeOverlay
-	templates["FileTmpl"] = tdata{debug.FileTmpl, v}
-}
-
-func TestTemplates(t *testing.T) {
-	if runtime.GOOS == "android" {
-		t.Skip("this test is not supported for Android")
-	}
-	cfg := &packages.Config{
-		Mode: packages.NeedTypesInfo | packages.LoadAllSyntax, // figure out what's necessary PJW
-	}
-	pkgs, err := packages.Load(cfg, "golang.org/x/tools/internal/lsp/debug")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if len(pkgs) != 1 {
-		t.Fatalf("expected a single package, but got %d", len(pkgs))
-	}
-	p := pkgs[0]
-	if len(p.Errors) != 0 {
-		t.Fatalf("compiler error, e.g. %v", p.Errors[0])
-	}
-	// find the calls to render in serve.go
-	tree := treeOf(p, "serve.go")
-	if tree == nil {
-		t.Fatalf("found no syntax tree for %s", "serve.go")
-	}
-	renders := callsOf(p, tree, "render")
-	if len(renders) == 0 {
-		t.Fatalf("found no calls to render")
-	}
-	var found = make(map[string]bool)
-	for _, r := range renders {
-		if len(r.Args) != 2 {
-			// template, func
-			t.Fatalf("got %d args, expected 2", len(r.Args))
-		}
-		t0, ok := p.TypesInfo.Types[r.Args[0]]
-		if !ok || !t0.IsValue() || t0.Type.String() != "*html/template.Template" {
-			t.Fatalf("no type info for template")
-		}
-		if id, ok := r.Args[0].(*ast.Ident); !ok {
-			t.Errorf("expected *ast.Ident, got %T", r.Args[0])
-		} else {
-			found[id.Name] = true
-		}
-	}
-	// make sure found and templates have the same templates
-	for k := range found {
-		if _, ok := templates[k]; !ok {
-			t.Errorf("code has template %s, but test does not", k)
-		}
-	}
-	for k := range templates {
-		if _, ok := found[k]; !ok {
-			t.Errorf("test has template %s, code does not", k)
-		}
-	}
-	// now check all the known templates, in alphabetic order, for determinacy
-	keys := []string{}
-	for k := range templates {
-		keys = append(keys, k)
-	}
-	sort.Strings(keys)
-	for _, k := range keys {
-		v := templates[k]
-		// the FuncMap is an annoyance; should not be necessary
-		if err := templatecheck.CheckHTML(v.tmpl, v.data); err != nil {
-			t.Errorf("%s: %v", k, err)
-		}
-	}
-}
-
-func callsOf(p *packages.Package, tree *ast.File, name string) []*ast.CallExpr {
-	var ans []*ast.CallExpr
-	f := func(n ast.Node) bool {
-		x, ok := n.(*ast.CallExpr)
-		if !ok {
-			return true
-		}
-		if y, ok := x.Fun.(*ast.Ident); ok {
-			if y.Name == name {
-				ans = append(ans, x)
-			}
-		}
-		return true
-	}
-	ast.Inspect(tree, f)
-	return ans
-}
-func treeOf(p *packages.Package, fname string) *ast.File {
-	for _, tree := range p.Syntax {
-		loc := tree.Package
-		pos := p.Fset.PositionFor(loc, false)
-		if strings.HasSuffix(pos.Filename, fname) {
-			return tree
-		}
-	}
-	return nil
-}
diff -urN a/gopls/test/gopls_test.go b/gopls/test/gopls_test.go
--- a/gopls/test/gopls_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/test/gopls_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,32 +0,0 @@
-// Copyright 2019 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gopls_test
-
-import (
-	"os"
-	"testing"
-
-	"golang.org/x/tools/gopls/internal/hooks"
-	cmdtest "golang.org/x/tools/internal/lsp/cmd/test"
-	"golang.org/x/tools/internal/lsp/source"
-	"golang.org/x/tools/internal/lsp/tests"
-	"golang.org/x/tools/internal/testenv"
-)
-
-func TestMain(m *testing.M) {
-	testenv.ExitIfSmallMachine()
-	os.Exit(m.Run())
-}
-
-func TestCommandLine(t *testing.T) {
-	cmdtest.TestCommandLine(t, "../../internal/lsp/testdata", commandLineOptions)
-}
-
-func commandLineOptions(options *source.Options) {
-	options.Staticcheck = true
-	options.GoDiff = false
-	tests.DefaultOptions(options)
-	hooks.Options(options)
-}
diff -urN a/gopls/test/json_test.go b/gopls/test/json_test.go
--- a/gopls/test/json_test.go	2022-03-14 16:31:30.000000000 -0700
+++ b/gopls/test/json_test.go	1969-12-31 16:00:00.000000000 -0800
@@ -1,134 +0,0 @@
-// Copyright 2021 The Go Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package gopls_test
-
-import (
-	"encoding/json"
-	"fmt"
-	"regexp"
-	"strings"
-	"testing"
-
-	"github.com/google/go-cmp/cmp"
-	"golang.org/x/tools/internal/lsp/protocol"
-)
-
-// verify that type errors in Initialize lsp messages don't cause
-// any other unmarshalling errors. The code looks at single values and the
-// first component of array values. Each occurrence is replaced by something
-// of a different type,  the resulting string unmarshalled, and compared to
-// the unmarshalling of the unchanged strings. The test passes if there is no
-// more than a single difference reported. That is, if changing a single value
-// in the message changes no more than a single value in the unmarshalled struct,
-// it is safe to ignore *json.UnmarshalTypeError.
-
-// strings are changed to numbers or bools (true)
-// bools are changed to numbers or strings
-// numbers are changed to strings or bools
-
-// a recent Initialize message taken from a log
-const input = `{"processId":38349,"clientInfo":{"name":"vscode","version":"1.56.0-insider"},"rootPath":"/Users/pjw/latest/tools","rootUri":"file:///Users/pjw/latest/tools","capabilities":{"workspace":{"applyEdit":true,"workspaceEdit":{"documentChanges":true,"resourceOperations":["create","rename","delete"],"failureHandling":"textOnlyTransactional"},"didChangeConfiguration":{"dynamicRegistration":true},"didChangeWatchedFiles":{"dynamicRegistration":true},"symbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"tagSupport":{"valueSet":[1]}},"executeCommand":{"dynamicRegistration":true},"configuration":true,"workspaceFolders":true,"semanticTokens":{"refreshSupport":true}},"textDocument":{"publishDiagnostics":{"relatedInformation":true,"versionSupport":false,"tagSupport":{"valueSet":[1,2]},"codeDescriptionSupport":true,"dataSupport":true},"synchronization":{"dynamicRegistration":true,"willSave":true,"willSaveWaitUntil":true,"didSave":true},"completion":{"dynamicRegistration":true,"contextSupport":true,"completionItem":{"snippetSupport":true,"commitCharactersSupport":true,"documentationFormat":["markdown","plaintext"],"deprecatedSupport":true,"preselectSupport":true,"tagSupport":{"valueSet":[1]},"insertReplaceSupport":true,"resolveSupport":{"properties":["documentation","detail","additionalTextEdits"]}},"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}},"hover":{"dynamicRegistration":true,"contentFormat":["markdown","plaintext"]},"signatureHelp":{"dynamicRegistration":true,"signatureInformation":{"documentationFormat":["markdown","plaintext"],"parameterInformation":{"labelOffsetSupport":true},"activeParameterSupport":true},"contextSupport":true},"definition":{"dynamicRegistration":true,"linkSupport":true},"references":{"dynamicRegistration":true},"documentHighlight":{"dynamicRegistration":true},"documentSymbol":{"dynamicRegistration":true,"symbolKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]},"hierarchicalDocumentSymbolSupport":true,"tagSupport":{"valueSet":[1]},"labelSupport":true},"codeAction":{"dynamicRegistration":true,"isPreferredSupport":true,"disabledSupport":true,"dataSupport":true,"resolveSupport":{"properties":["edit"]},"codeActionLiteralSupport":{"codeActionKind":{"valueSet":["","quickfix","refactor","refactor.extract","refactor.inline","refactor.rewrite","source","source.organizeImports"]}}},"codeLens":{"dynamicRegistration":true},"formatting":{"dynamicRegistration":true},"rangeFormatting":{"dynamicRegistration":true},"onTypeFormatting":{"dynamicRegistration":true},"rename":{"dynamicRegistration":true,"prepareSupport":true,"prepareSupportDefaultBehavior":true},"documentLink":{"dynamicRegistration":true,"tooltipSupport":true},"typeDefinition":{"dynamicRegistration":true,"linkSupport":true},"implementation":{"dynamicRegistration":true,"linkSupport":true},"colorProvider":{"dynamicRegistration":true},"foldingRange":{"dynamicRegistration":true,"rangeLimit":5000,"lineFoldingOnly":true},"declaration":{"dynamicRegistration":true,"linkSupport":true},"selectionRange":{"dynamicRegistration":true},"callHierarchy":{"dynamicRegistration":true},"semanticTokens":{"dynamicRegistration":true,"tokenTypes":["namespace","type","class","enum","interface","struct","typeParameter","parameter","variable","property","enumMember","event","function","member","macro","keyword","modifier","comment","string","number","regexp","operator"],"tokenModifiers":["declaration","definition","readonly","static","deprecated","abstract","async","modification","documentation","defaultLibrary"],"formats":["relative"],"requests":{"range":true,"full":{"delta":true}}}},"window":{"workDoneProgress":true}},"initializationOptions":{"usePlaceholders":true,"completionDocumentation":true,"verboseOutput":false,"codelenses":{"gc_details":true},"analyses":{"fillstruct":true,"staticcheck":true},"experimentalWorkspaceModule":true,"semanticTokens":true},"trace":"off","workspaceFolders":[{"uri":"file:///Users/pjw/latest/tools","name":"tools"}]}`
-
-type DiffReporter struct {
-	path  cmp.Path
-	diffs []string
-}
-
-func (r *DiffReporter) PushStep(ps cmp.PathStep) {
-	r.path = append(r.path, ps)
-}
-
-func (r *DiffReporter) Report(rs cmp.Result) {
-	if !rs.Equal() {
-		vx, vy := r.path.Last().Values()
-		r.diffs = append(r.diffs, fmt.Sprintf("%#v:\n\t-: %+v\n\t+: %+v\n", r.path, vx, vy))
-	}
-}
-
-func (r *DiffReporter) PopStep() {
-	r.path = r.path[:len(r.path)-1]
-}
-
-func (r *DiffReporter) String() string {
-	return strings.Join(r.diffs, "\n")
-}
-
-func TestStringChanges(t *testing.T) {
-	// string as value
-	stringLeaf := regexp.MustCompile(`:("[^"]*")`)
-	leafs := stringLeaf.FindAllStringSubmatchIndex(input, -1)
-	allDeltas(t, leafs, "23", "true")
-	// string as first element of array
-	stringArray := regexp.MustCompile(`[[]("[^"]*")`)
-	arrays := stringArray.FindAllStringSubmatchIndex(input, -1)
-	allDeltas(t, arrays, "23", "true")
-}
-
-func TestBoolChanges(t *testing.T) {
-	boolLeaf := regexp.MustCompile(`:(true|false)(,|})`)
-	leafs := boolLeaf.FindAllStringSubmatchIndex(input, -1)
-	allDeltas(t, leafs, "23", `"xx"`)
-	boolArray := regexp.MustCompile(`:[[](true|false)(,|])`)
-	arrays := boolArray.FindAllStringSubmatchIndex(input, -1)
-	allDeltas(t, arrays, "23", `"xx"`)
-}
-
-func TestNumberChanges(t *testing.T) {
-	numLeaf := regexp.MustCompile(`:(\d+)(,|})`)
-	leafs := numLeaf.FindAllStringSubmatchIndex(input, -1)
-	allDeltas(t, leafs, "true", `"xx"`)
-	numArray := regexp.MustCompile(`:[[](\d+)(,|])`)
-	arrays := numArray.FindAllStringSubmatchIndex(input, -1)
-	allDeltas(t, arrays, "true", `"xx"`)
-}
-
-// v is a set of matches. check that substituting any repl never
-// creates more than 1 unmarshaling error
-func allDeltas(t *testing.T, v [][]int, repls ...string) {
-	t.Helper()
-	for _, repl := range repls {
-		for i, x := range v {
-			err := tryChange(x[2], x[3], repl)
-			if err != nil {
-				t.Errorf("%d:%q %v", i, input[x[2]:x[3]], err)
-			}
-		}
-	}
-}
-
-func tryChange(start, end int, repl string) error {
-	var p, q protocol.InitializeParams
-	mod := input[:start] + repl + input[end:]
-	excerpt := func() (string, string) {
-		a := start - 5
-		if a < 0 {
-			a = 0
-		}
-		b := end + 5
-		if b > len(input) {
-			// trusting repl to be no longer than what it replaces
-			b = len(input)
-		}
-		ma := input[a:b]
-		mb := mod[a:b]
-		return ma, mb
-	}
-	if err := json.Unmarshal([]byte(input), &p); err != nil {
-		return fmt.Errorf("%s %v", repl, err)
-	}
-	if err := json.Unmarshal([]byte(mod), &q); err == nil {
-		return nil // no errors is ok
-	} else if _, ok := err.(*json.UnmarshalTypeError); !ok {
-		return fmt.Errorf("%T, not *json.UnmarshalTypeError", err)
-	}
-
-	var r DiffReporter
-	cmp.Diff(p, q, cmp.Reporter(&r))
-	if len(r.diffs) > 1 { // 0 is possible, e.g., for interface{}
-		ma, mb := excerpt()
-		return fmt.Errorf("got %d diffs for %q\n%s\n%s", len(r.diffs), repl, ma, mb)
-	}
-	return nil
-}
