gopls/internal/regtest: replace NoDiagnostics with NoMatchingDiagnostics

Replace uses of NoDiagnostics with the more flexible
NoMatchingDiagnostics, and rename NoMatchingDiagnostics to
NoDiagnostics.

Updates golang/go#39384

Change-Id: I15b19ad6c9b58c1ae88ec1b444bb589002f75a80
Reviewed-on: https://go-review.googlesource.com/c/tools/+/461936
gopls-CI: kokoro <noreply+kokoro@google.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/gopls/internal/lsp/regtest/expectation.go b/gopls/internal/lsp/regtest/expectation.go
index 8073561..66a59ee 100644
--- a/gopls/internal/lsp/regtest/expectation.go
+++ b/gopls/internal/lsp/regtest/expectation.go
@@ -728,12 +728,10 @@
 	}
 }
 
-// NoMatchingDiagnostics asserts that there are no diagnostics matching the
-// given filters. Notably, if no filters are supplied this assertion checks
-// that there are no diagnostics at all, for any file.
-//
-// TODO(rfindley): replace NoDiagnostics with this, and rename.
-func NoMatchingDiagnostics(filters ...DiagnosticFilter) Expectation {
+// NoDiagnostics asserts that there are no diagnostics matching the given
+// filters. Notably, if no filters are supplied this assertion checks that
+// there are no diagnostics at all, for any file.
+func NoDiagnostics(filters ...DiagnosticFilter) Expectation {
 	check := func(s State) Verdict {
 		diags := flattenDiagnostics(s)
 		for _, filter := range filters {
@@ -778,7 +776,7 @@
 // -- Diagnostic filters --
 
 // A DiagnosticFilter filters the set of diagnostics, for assertion with
-// Diagnostics or NoMatchingDiagnostics.
+// Diagnostics or NoDiagnostics.
 type DiagnosticFilter struct {
 	desc  string
 	check func(name string, _ protocol.Diagnostic) bool
@@ -832,21 +830,6 @@
 
 // TODO(rfindley): eliminate all expectations below this point.
 
-// NoDiagnostics asserts that either no diagnostics are sent for the
-// workspace-relative path name, or empty diagnostics are sent.
-func NoDiagnostics(name string) Expectation {
-	check := func(s State) Verdict {
-		if diags := s.diagnostics[name]; diags == nil || len(diags.Diagnostics) == 0 {
-			return Met
-		}
-		return Unmet
-	}
-	return SimpleExpectation{
-		check:       check,
-		description: fmt.Sprintf("empty or no diagnostics for %q", name),
-	}
-}
-
 // DiagnosticAtRegexp expects that there is a diagnostic entry at the start
 // position matching the regexp search string re in the buffer specified by
 // name. Note that this currently ignores the end position.
diff --git a/gopls/internal/regtest/codelens/codelens_test.go b/gopls/internal/regtest/codelens/codelens_test.go
index 56e6cca..0920650 100644
--- a/gopls/internal/regtest/codelens/codelens_test.go
+++ b/gopls/internal/regtest/codelens/codelens_test.go
@@ -215,13 +215,13 @@
 					// but there may be some subtlety in timing here, where this
 					// should always succeed, but may not actually test the correct
 					// behavior.
-					NoMatchingDiagnostics(env.AtRegexp("b/go.mod", `require`)),
+					NoDiagnostics(env.AtRegexp("b/go.mod", `require`)),
 				)
 				// Check for upgrades in b/go.mod and then clear them.
 				env.ExecuteCodeLensCommand("b/go.mod", command.CheckUpgrades, nil)
 				env.Await(env.DiagnosticAtRegexpWithMessage("b/go.mod", `require`, "can be upgraded"))
 				env.ExecuteCodeLensCommand("b/go.mod", command.ResetGoModDiagnostics, nil)
-				env.Await(NoDiagnostics("b/go.mod"))
+				env.Await(NoDiagnostics(ForFile("b/go.mod")))
 
 				// Apply the diagnostics to a/go.mod.
 				env.ApplyQuickFixes("a/go.mod", d.Diagnostics)
@@ -331,6 +331,6 @@
 
 		// Regenerate cgo, fixing the diagnostic.
 		env.ExecuteCodeLensCommand("cgo.go", command.RegenerateCgo, nil)
-		env.Await(NoDiagnostics("cgo.go"))
+		env.Await(NoDiagnostics(ForFile("cgo.go")))
 	})
 }
diff --git a/gopls/internal/regtest/codelens/gcdetails_test.go b/gopls/internal/regtest/codelens/gcdetails_test.go
index 1b2c346..4b74022 100644
--- a/gopls/internal/regtest/codelens/gcdetails_test.go
+++ b/gopls/internal/regtest/codelens/gcdetails_test.go
@@ -66,7 +66,7 @@
 		// 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.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("main.go")))
 
 		// Saving a buffer should re-format back to the original state, and
 		// re-enable the gc_details diagnostics.
@@ -75,7 +75,7 @@
 
 		// Toggle the GC details code lens again so now it should be off.
 		env.ExecuteCodeLensCommand("main.go", command.GCDetails, nil)
-		env.Await(NoDiagnostics("main.go"))
+		env.Await(NoDiagnostics(ForFile("main.go")))
 	})
 }
 
diff --git a/gopls/internal/regtest/diagnostics/analysis_test.go b/gopls/internal/regtest/diagnostics/analysis_test.go
index bad4f65..a038d15 100644
--- a/gopls/internal/regtest/diagnostics/analysis_test.go
+++ b/gopls/internal/regtest/diagnostics/analysis_test.go
@@ -44,6 +44,6 @@
 		)
 
 		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("main.go")))
 	})
 }
diff --git a/gopls/internal/regtest/diagnostics/builtin_test.go b/gopls/internal/regtest/diagnostics/builtin_test.go
index 5baf1dc..193bbe0 100644
--- a/gopls/internal/regtest/diagnostics/builtin_test.go
+++ b/gopls/internal/regtest/diagnostics/builtin_test.go
@@ -30,6 +30,6 @@
 		if !strings.HasSuffix(name, "builtin.go") {
 			t.Fatalf("jumped to %q, want builtin.go", name)
 		}
-		env.AfterChange(NoDiagnostics("builtin.go"))
+		env.AfterChange(NoDiagnostics(ForFile("builtin.go")))
 	})
 }
diff --git a/gopls/internal/regtest/diagnostics/diagnostics_test.go b/gopls/internal/regtest/diagnostics/diagnostics_test.go
index df456e7..a7b5bb0 100644
--- a/gopls/internal/regtest/diagnostics/diagnostics_test.go
+++ b/gopls/internal/regtest/diagnostics/diagnostics_test.go
@@ -77,7 +77,7 @@
 			env.DiagnosticAtRegexp("main.go", "log"),
 		)
 		env.SaveBuffer("main.go")
-		env.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("main.go")))
 	})
 }
 
@@ -119,8 +119,8 @@
 		// Fix the error by editing the const name in b.go to `b`.
 		env.RegexpReplace("b.go", "(a) = 2", "b")
 		env.AfterChange(
-			NoDiagnostics("a.go"),
-			NoDiagnostics("b.go"),
+			NoDiagnostics(ForFile("a.go")),
+			NoDiagnostics(ForFile("b.go")),
 		)
 	})
 }
@@ -132,8 +132,8 @@
 		env.RemoveWorkspaceFile("b.go")
 
 		env.Await(
-			NoDiagnostics("a.go"),
-			NoDiagnostics("b.go"),
+			NoDiagnostics(ForFile("a.go")),
+			NoDiagnostics(ForFile("b.go")),
 		)
 	})
 }
@@ -152,7 +152,7 @@
 		env.AfterChange(
 			env.DiagnosticAtRegexp("a.go", "a = 1"),
 			env.DiagnosticAtRegexp("b.go", "a = 2"),
-			NoDiagnostics("c.go"),
+			NoDiagnostics(ForFile("c.go")),
 		)
 	})
 }
@@ -177,7 +177,7 @@
 		// Expect the diagnostics to clear.
 		env.SaveBuffer("c/c.go")
 		env.AfterChange(
-			NoDiagnostics("c/c.go"),
+			NoDiagnostics(ForFile("c/c.go")),
 		)
 	})
 }
@@ -213,7 +213,7 @@
 	Run(t, test38878, func(t *testing.T, env *Env) {
 		env.Await(env.DiagnosticAtRegexp("a_test.go", `f\((3)\)`))
 		env.RemoveWorkspaceFile("a_test.go")
-		env.AfterChange(NoDiagnostics("a_test.go"))
+		env.AfterChange(NoDiagnostics(ForFile("a_test.go")))
 
 		// Make sure the test variant has been removed from the workspace by
 		// triggering a metadata load.
@@ -267,7 +267,7 @@
 			env.SaveBuffer("go.mod")
 			var d protocol.PublishDiagnosticsParams
 			env.AfterChange(
-				NoDiagnostics("main.go"),
+				NoDiagnostics(ForFile("main.go")),
 				env.DiagnosticAtRegexp("bob/bob.go", "x"),
 				ReadDiagnostics("bob/bob.go", &d),
 			)
@@ -283,7 +283,7 @@
 			)
 			env.RunGoCommand("mod", "init", "mod.com")
 			env.AfterChange(
-				NoDiagnostics("main.go"),
+				NoDiagnostics(ForFile("main.go")),
 				env.DiagnosticAtRegexp("bob/bob.go", "x"),
 			)
 		})
@@ -300,7 +300,7 @@
 				t.Fatal(err)
 			}
 			env.AfterChange(
-				NoDiagnostics("main.go"),
+				NoDiagnostics(ForFile("main.go")),
 				env.DiagnosticAtRegexp("bob/bob.go", "x"),
 			)
 		})
@@ -350,7 +350,7 @@
 		env.RegexpReplace("lib.go", "_ = x", "var y int")
 		env.AfterChange(
 			env.DiagnosticAtRegexp("lib.go", "y int"),
-			NoDiagnostics("lib_test.go"),
+			NoDiagnostics(ForFile("lib_test.go")),
 		)
 	})
 }
@@ -370,7 +370,7 @@
 		env.OpenFile("a.go")
 		env.RegexpReplace("a.go", "foo", "foox")
 		env.AfterChange(
-			NoDiagnostics("a.go"),
+			NoDiagnostics(ForFile("a.go")),
 		)
 	})
 }
@@ -464,7 +464,7 @@
 		env.OpenFile("main.go")
 		env.AfterChange(env.DiagnosticAtRegexp("main.go", "fmt"))
 		env.SaveBuffer("main.go")
-		env.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("main.go")))
 	})
 }
 
@@ -489,7 +489,7 @@
 	).Run(t, files, func(t *testing.T, env *Env) {
 		env.OpenFile("main.go")
 		env.OrganizeImports("main.go")
-		env.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("main.go")))
 	})
 }
 
@@ -650,7 +650,7 @@
 		env.ApplyQuickFixes("main.go", d.Diagnostics)
 		env.SaveBuffer("go.mod")
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 		// Comment out the line that depends on conf and expect a
 		// diagnostic and a fix to remove the import.
@@ -661,14 +661,14 @@
 		env.SaveBuffer("main.go")
 		// Expect a diagnostic and fix to remove the dependency in the go.mod.
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 			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.AfterChange(
-			NoDiagnostics("go.mod"),
+			NoDiagnostics(ForFile("go.mod")),
 		)
 		// Uncomment the lines and expect a new diagnostic for the import.
 		env.RegexpReplace("main.go", "//_ = conf.ErrHelpWanted", "_ = conf.ErrHelpWanted")
@@ -707,7 +707,7 @@
 		)
 		env.ApplyQuickFixes("main.go", d.Diagnostics)
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -733,11 +733,11 @@
 		env.CreateBuffer("a/a2.go", ``)
 		env.SaveBufferWithoutActions("a/a2.go")
 		env.AfterChange(
-			NoDiagnostics("a/a1.go"),
+			NoDiagnostics(ForFile("a/a1.go")),
 		)
 		env.EditBuffer("a/a2.go", fake.NewEdit(0, 0, 0, 0, `package a`))
 		env.AfterChange(
-			NoDiagnostics("a/a1.go"),
+			NoDiagnostics(ForFile("a/a1.go")),
 		)
 	})
 }
@@ -805,7 +805,7 @@
 		)
 		env.SaveBuffer("hello/hello_x_test.go")
 		env.AfterChange(
-			NoDiagnostics("hello/hello_x_test.go"),
+			NoDiagnostics(ForFile("hello/hello_x_test.go")),
 		)
 	})
 }
@@ -854,8 +854,8 @@
 		env.OpenFile("foo/bar_test.go")
 		env.RegexpReplace("foo/bar_test.go", "package foo_", "package foo_test")
 		env.AfterChange(
-			NoDiagnostics("foo/bar_test.go"),
-			NoDiagnostics("foo/foo.go"),
+			NoDiagnostics(ForFile("foo/bar_test.go")),
+			NoDiagnostics(ForFile("foo/foo.go")),
 		)
 	})
 }
@@ -874,7 +874,7 @@
 	Run(t, ws, func(t *testing.T, env *Env) {
 		env.OpenFile("_foo/x.go")
 		env.AfterChange(
-			NoDiagnostics("_foo/x.go"),
+			NoDiagnostics(ForFile("_foo/x.go")),
 		)
 	})
 }
@@ -997,9 +997,9 @@
 			)
 			env.RegexpReplace("p/p.go", "s string", "i int")
 			env.AfterChange(
-				NoDiagnostics("main.go"),
-				NoDiagnostics("p/p_test.go"),
-				NoDiagnostics("p/x_test.go"),
+				NoDiagnostics(ForFile("main.go")),
+				NoDiagnostics(ForFile("p/p_test.go")),
+				NoDiagnostics(ForFile("p/x_test.go")),
 			)
 		})
 	})
@@ -1054,7 +1054,7 @@
 }`)
 		env.OpenFile("foo/foo_test.go")
 		env.RegexpReplace("foo/foo_test.go", `package main`, `package foo`)
-		env.AfterChange(NoDiagnostics("foo/foo.go"))
+		env.AfterChange(NoDiagnostics(ForFile("foo/foo.go")))
 	})
 }
 
@@ -1173,7 +1173,7 @@
 	).Run(t, mod, func(t *testing.T, env *Env) {
 		env.OpenFile("a/main.go")
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -1212,7 +1212,7 @@
 			t.Errorf("wanted Unnecessary tag on diagnostic, got %v", tags)
 		}
 		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("main.go")))
 	})
 }
 
@@ -1369,7 +1369,7 @@
 	Run(t, mod, func(t *testing.T, env *Env) {
 		env.OnceMet(
 			InitialWorkspaceLoad,
-			NoMatchingDiagnostics(WithMessageContaining("illegal character U+0023 '#'")),
+			NoDiagnostics(WithMessageContaining("illegal character U+0023 '#'")),
 		)
 	})
 }
@@ -1431,7 +1431,7 @@
 		env.Await(env.DoneWithChange())
 		env.RegexpReplace("foo/foo_test.go", "_t", "_test")
 		env.AfterChange(
-			NoDiagnostics("foo/foo_test.go"),
+			NoDiagnostics(ForFile("foo/foo_test.go")),
 			NoOutstandingWork(),
 		)
 	})
@@ -1498,7 +1498,7 @@
 		env.RemoveWorkspaceFile("bob")
 		env.AfterChange(
 			env.DiagnosticAtRegexp("cmd/main.go", `"mod.com/bob"`),
-			NoDiagnostics("bob/bob.go"),
+			NoDiagnostics(ForFile("bob/bob.go")),
 			NoFileWatchMatching("bob"),
 		)
 	})
@@ -1585,8 +1585,8 @@
 		env.RegexpReplace("b/b.go", `const B = a\.B`, "")
 		env.SaveBuffer("b/b.go")
 		env.Await(
-			NoDiagnostics("a/a.go"),
-			NoDiagnostics("b/b.go"),
+			NoDiagnostics(ForFile("a/a.go")),
+			NoDiagnostics(ForFile("b/b.go")),
 		)
 	})
 }
@@ -1718,7 +1718,7 @@
 		env.OpenFile("foo.go")
 		env.AfterChange(env.DiagnosticAtRegexp("bar.go", `Foo`))
 		env.RegexpReplace("foo.go", `\+build`, "")
-		env.AfterChange(NoDiagnostics("bar.go"))
+		env.AfterChange(NoDiagnostics(ForFile("bar.go")))
 	})
 
 }
@@ -1819,7 +1819,7 @@
 		)
 		env.WriteWorkspaceFile("go.mod", "module mod.com \n\ngo 1.13\n")
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -1874,7 +1874,7 @@
 
 		env.ApplyQuickFixes("main.go", d.Diagnostics)
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -1912,7 +1912,7 @@
 		// Once the edit is applied, the problematic diagnostics should be
 		// resolved.
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
diff --git a/gopls/internal/regtest/misc/configuration_test.go b/gopls/internal/regtest/misc/configuration_test.go
index 4164d6c..6aea24a 100644
--- a/gopls/internal/regtest/misc/configuration_test.go
+++ b/gopls/internal/regtest/misc/configuration_test.go
@@ -36,7 +36,7 @@
 	Run(t, files, func(t *testing.T, env *Env) {
 		env.OpenFile("a/a.go")
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),
+			NoDiagnostics(ForFile("a/a.go")),
 		)
 		cfg := env.Editor.Config()
 		cfg.Settings = map[string]interface{}{
diff --git a/gopls/internal/regtest/misc/embed_test.go b/gopls/internal/regtest/misc/embed_test.go
index 0d6d2dd..15943b8 100644
--- a/gopls/internal/regtest/misc/embed_test.go
+++ b/gopls/internal/regtest/misc/embed_test.go
@@ -30,6 +30,6 @@
 		env.OpenFile("x.go")
 		env.AfterChange(env.DiagnosticAtRegexpWithMessage("x.go", `NONEXISTENT`, "no matching files found"))
 		env.RegexpReplace("x.go", `NONEXISTENT`, "x.go")
-		env.AfterChange(NoDiagnostics("x.go"))
+		env.AfterChange(NoDiagnostics(ForFile("x.go")))
 	})
 }
diff --git a/gopls/internal/regtest/misc/failures_test.go b/gopls/internal/regtest/misc/failures_test.go
index b3ff37a..f088a0e 100644
--- a/gopls/internal/regtest/misc/failures_test.go
+++ b/gopls/internal/regtest/misc/failures_test.go
@@ -77,8 +77,8 @@
 		// Fix the error by editing the const name in b.go to `b`.
 		env.RegexpReplace("b.go", "(a) = 2", "b")
 		env.Await(
-			NoDiagnostics("a.go"),
-			NoDiagnostics("b.go"),
+			NoDiagnostics(ForFile("a.go")),
+			NoDiagnostics(ForFile("b.go")),
 		)
 	})
 }
diff --git a/gopls/internal/regtest/misc/fix_test.go b/gopls/internal/regtest/misc/fix_test.go
index 72c6231..f00a734 100644
--- a/gopls/internal/regtest/misc/fix_test.go
+++ b/gopls/internal/regtest/misc/fix_test.go
@@ -102,6 +102,6 @@
 			t.Fatalf("expected fixall code action, got none")
 		}
 		env.ApplyQuickFixes("main.go", d.Diagnostics)
-		env.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("main.go")))
 	})
 }
diff --git a/gopls/internal/regtest/misc/generate_test.go b/gopls/internal/regtest/misc/generate_test.go
index f6bbcd5..9fd448c 100644
--- a/gopls/internal/regtest/misc/generate_test.go
+++ b/gopls/internal/regtest/misc/generate_test.go
@@ -65,7 +65,7 @@
 		env.RunGenerate("./lib1")
 		env.RunGenerate("./lib2")
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
diff --git a/gopls/internal/regtest/misc/imports_test.go b/gopls/internal/regtest/misc/imports_test.go
index 6558491..b9804d0 100644
--- a/gopls/internal/regtest/misc/imports_test.go
+++ b/gopls/internal/regtest/misc/imports_test.go
@@ -158,7 +158,7 @@
 		env.OpenFile("main.go")
 		env.AfterChange(env.DiagnosticAtRegexp("main.go", `y.Y`))
 		env.SaveBuffer("main.go")
-		env.AfterChange(NoDiagnostics("main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("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))
@@ -205,7 +205,7 @@
 		)
 		env.ApplyQuickFixes("a/a.go", d.Diagnostics)
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),
+			NoDiagnostics(ForFile("a/a.go")),
 		)
 	})
 }
@@ -252,6 +252,6 @@
 		// Saving caller.go should trigger goimports, which should find a.Test in
 		// the mod.com module, thanks to the go.work file.
 		env.SaveBuffer("caller/caller.go")
-		env.AfterChange(NoDiagnostics("caller/caller.go"))
+		env.AfterChange(NoDiagnostics(ForFile("caller/caller.go")))
 	})
 }
diff --git a/gopls/internal/regtest/misc/rename_test.go b/gopls/internal/regtest/misc/rename_test.go
index b6a385d..81b3de8 100644
--- a/gopls/internal/regtest/misc/rename_test.go
+++ b/gopls/internal/regtest/misc/rename_test.go
@@ -412,7 +412,7 @@
 		// Moving x.go should make the diagnostic go away.
 		env.RenameFile("a/x.go", "b/x.go")
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),                     // no more duplicate declarations
+			NoDiagnostics(ForFile("a/a.go")),            // no more duplicate declarations
 			env.DiagnosticAtRegexp("b/b.go", "package"), // as package names mismatch
 		)
 
diff --git a/gopls/internal/regtest/misc/shared_test.go b/gopls/internal/regtest/misc/shared_test.go
index 23f7a42..84eb99f 100644
--- a/gopls/internal/regtest/misc/shared_test.go
+++ b/gopls/internal/regtest/misc/shared_test.go
@@ -65,7 +65,7 @@
 
 		env1.RegexpReplace("main.go", "Printl", "Println")
 		env1.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
diff --git a/gopls/internal/regtest/misc/vuln_test.go b/gopls/internal/regtest/misc/vuln_test.go
index 5cf4252..b34ddfc 100644
--- a/gopls/internal/regtest/misc/vuln_test.go
+++ b/gopls/internal/regtest/misc/vuln_test.go
@@ -228,7 +228,7 @@
 		env.OnceMet(
 			CompletedProgress(result.Token, nil),
 			ShownMessage("Found GOSTDLIB"),
-			NoDiagnostics("go.mod"),
+			NoDiagnostics(ForFile("go.mod")),
 		)
 		testFetchVulncheckResult(t, env, map[string]fetchVulncheckResult{
 			"go.mod": {IDs: []string{"GOSTDLIB"}, Mode: govulncheck.ModeGovulncheck}})
@@ -274,7 +274,7 @@
 	).Run(t, files, func(t *testing.T, env *Env) {
 		env.OpenFile("go.mod")
 		env.AfterChange(
-			NoDiagnostics("go.mod"),
+			NoDiagnostics(ForFile("go.mod")),
 			// we don't publish diagnostics for standard library vulnerability yet.
 		)
 		testFetchVulncheckResult(t, env, map[string]fetchVulncheckResult{
@@ -854,7 +854,7 @@
 		}
 		env.ApplyCodeAction(reset)
 
-		env.Await(NoDiagnostics("go.mod"))
+		env.Await(NoDiagnostics(ForFile("go.mod")))
 	})
 }
 
diff --git a/gopls/internal/regtest/modfile/modfile_test.go b/gopls/internal/regtest/modfile/modfile_test.go
index ab74595..c5aed8a 100644
--- a/gopls/internal/regtest/modfile/modfile_test.go
+++ b/gopls/internal/regtest/modfile/modfile_test.go
@@ -485,7 +485,7 @@
 		)
 		env.RunGoCommandInDir("a", "mod", "tidy")
 		env.AfterChange(
-			NoDiagnostics("a/go.mod"),
+			NoDiagnostics(ForFile("a/go.mod")),
 		)
 	})
 }
@@ -558,7 +558,7 @@
 )
 `
 		env.SaveBuffer("a/go.mod")
-		env.AfterChange(NoDiagnostics("a/main.go"))
+		env.AfterChange(NoDiagnostics(ForFile("a/main.go")))
 		if got := env.BufferText("a/go.mod"); got != want {
 			t.Fatalf("suggested fixes failed:\n%s", compare.Text(want, got))
 		}
@@ -614,7 +614,7 @@
 			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.AfterChange(
-				NoDiagnostics("a/go.mod"),
+				NoDiagnostics(ForFile("a/go.mod")),
 				env.DiagnosticAtRegexp("a/main.go", "x = "),
 			)
 		})
@@ -744,7 +744,7 @@
 		env.RunGoCommand("get", "example.com/blah@v1.2.3")
 		env.RunGoCommand("mod", "tidy")
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -882,7 +882,7 @@
 		env.ApplyQuickFixes("go.mod", d.Diagnostics)
 		env.SaveBuffer("go.mod") // Save to trigger diagnostics.
 		env.AfterChange(
-			NoDiagnostics("go.mod"),
+			NoDiagnostics(ForFile("go.mod")),
 		)
 	})
 }
@@ -1149,8 +1149,8 @@
 		)
 		env.ApplyQuickFixes("main.go", d.Diagnostics)
 		env.Await(
-			NoDiagnostics("main.go"),
-			NoDiagnostics("go.mod"),
+			NoDiagnostics(ForFile("main.go")),
+			NoDiagnostics(ForFile("go.mod")),
 		)
 	})
 }
@@ -1170,7 +1170,7 @@
 			env.DiagnosticAtRegexpWithMessage("go.mod", `go foo`, "invalid go version"),
 		)
 		env.WriteWorkspaceFile("go.mod", "module mod.com \n\ngo 1.12\n")
-		env.AfterChange(NoDiagnostics("go.mod"))
+		env.AfterChange(NoDiagnostics(ForFile("go.mod")))
 	})
 }
 
diff --git a/gopls/internal/regtest/template/template_test.go b/gopls/internal/regtest/template/template_test.go
index 140ba3c..f3453d7 100644
--- a/gopls/internal/regtest/template/template_test.go
+++ b/gopls/internal/regtest/template/template_test.go
@@ -96,7 +96,7 @@
 		}
 
 		env.WriteWorkspaceFile("hello.tmpl", "{{range .Planets}}\nHello {{.}}\n{{end}}")
-		env.AfterChange(NoDiagnostics("hello.tmpl"))
+		env.AfterChange(NoDiagnostics(ForFile("hello.tmpl")))
 	})
 }
 
@@ -121,7 +121,7 @@
 		env.OnceMet(
 			InitialWorkspaceLoad,
 			env.DiagnosticAtRegexp("a/a.tmpl", "()A"),
-			NoDiagnostics("b/b.tmpl"),
+			NoDiagnostics(ForFile("b/b.tmpl")),
 		)
 	})
 }
@@ -137,12 +137,12 @@
 	Run(t, files, func(t *testing.T, env *Env) {
 		env.CreateBuffer("hello.tmpl", "")
 		env.AfterChange(
-			NoDiagnostics("hello.tmpl"), // Don't get spurious errors for empty templates.
+			NoDiagnostics(ForFile("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(NoDiagnostics("hello.tmpl"))
+		env.Await(NoDiagnostics(ForFile("hello.tmpl")))
 	})
 }
 
@@ -167,7 +167,7 @@
 		// should make its diagnostics disappear.
 		env.CloseBuffer("hello.tmpl")
 		env.AfterChange(
-			NoDiagnostics("hello.tmpl"),
+			NoDiagnostics(ForFile("hello.tmpl")),
 		)
 	})
 }
diff --git a/gopls/internal/regtest/watch/watch_test.go b/gopls/internal/regtest/watch/watch_test.go
index d2a203e..6a91a26 100644
--- a/gopls/internal/regtest/watch/watch_test.go
+++ b/gopls/internal/regtest/watch/watch_test.go
@@ -43,7 +43,7 @@
 			)
 			env.WriteWorkspaceFile("a/a.go", `package a; func _() {};`)
 			env.AfterChange(
-				NoDiagnostics("a/a.go"),
+				NoDiagnostics(ForFile("a/a.go")),
 			)
 		})
 	})
@@ -137,8 +137,8 @@
 }`,
 		})
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),
-			NoDiagnostics("b/b.go"),
+			NoDiagnostics(ForFile("a/a.go")),
+			NoDiagnostics(ForFile("b/b.go")),
 		)
 	})
 }
@@ -204,7 +204,7 @@
 		)
 		env.WriteWorkspaceFile("c/c.go", `package c; func C() {};`)
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),
+			NoDiagnostics(ForFile("a/a.go")),
 		)
 	})
 }
@@ -226,7 +226,7 @@
 		env.WriteWorkspaceFile("c/c.go", `package c; func C() {};`)
 		env.WriteWorkspaceFile("a/a.go", `package a; import "mod.com/c"; func _() { c.C() }`)
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),
+			NoDiagnostics(ForFile("a/a.go")),
 		)
 	})
 }
@@ -252,7 +252,7 @@
 		)
 		env.WriteWorkspaceFile("a/a2.go", `package a; func hello() {};`)
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),
+			NoDiagnostics(ForFile("a/a.go")),
 		)
 	})
 }
@@ -328,7 +328,7 @@
 			)
 			env.WriteWorkspaceFile("a/a.go", implementation)
 			env.AfterChange(
-				NoDiagnostics("a/a.go"),
+				NoDiagnostics(ForFile("a/a.go")),
 			)
 		})
 	})
@@ -337,11 +337,11 @@
 		Run(t, pkg, func(t *testing.T, env *Env) {
 			env.WriteWorkspaceFile("a/a.go", implementation)
 			env.AfterChange(
-				NoDiagnostics("a/a.go"),
+				NoDiagnostics(ForFile("a/a.go")),
 			)
 			env.WriteWorkspaceFile("b/b.go", newMethod)
 			env.AfterChange(
-				NoDiagnostics("a/a.go"),
+				NoDiagnostics(ForFile("a/a.go")),
 			)
 		})
 	})
@@ -353,8 +353,8 @@
 				"b/b.go": newMethod,
 			})
 			env.AfterChange(
-				NoDiagnostics("a/a.go"),
-				NoDiagnostics("b/b.go"),
+				NoDiagnostics(ForFile("a/a.go")),
+				NoDiagnostics(ForFile("b/b.go")),
 			)
 		})
 	})
@@ -400,7 +400,7 @@
 				// 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),
-				NoDiagnostics("a/a.go"),
+				NoDiagnostics(ForFile("a/a.go")),
 			)
 		})
 	})
@@ -428,7 +428,7 @@
 				// 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),
-				NoDiagnostics("a/a.go"),
+				NoDiagnostics(ForFile("a/a.go")),
 			)
 		})
 	})
@@ -470,7 +470,7 @@
 		env.RemoveWorkspaceFile("a/a1.go")
 		env.WriteWorkspaceFile("a/a2.go", "package a; func _() {};")
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -547,7 +547,7 @@
 		})
 		env.AfterChange(
 			env.DoneWithChangeWatchedFiles(),
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -575,7 +575,7 @@
 	).Run(t, files, func(t *testing.T, env *Env) {
 		env.OpenFile("main.go")
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 		if err := env.Sandbox.RunGoCommand(env.Ctx, "", "mod", []string{"init", "mod.com"}, true); err != nil {
 			t.Fatal(err)
@@ -589,7 +589,7 @@
 
 		env.RegexpReplace("main.go", `"foo/blah"`, `"mod.com/foo/blah"`)
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 		)
 	})
 }
@@ -625,7 +625,7 @@
 		)
 		env.RegexpReplace("foo/main.go", `"mod.com/blah"`, `"foo/blah"`)
 		env.AfterChange(
-			NoDiagnostics("foo/main.go"),
+			NoDiagnostics(ForFile("foo/main.go")),
 		)
 	})
 }
@@ -669,8 +669,8 @@
 `,
 		})
 		env.AfterChange(
-			NoDiagnostics("a/a.go"),
-			NoDiagnostics("a/a_test.go"),
+			NoDiagnostics(ForFile("a/a.go")),
+			NoDiagnostics(ForFile("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.
@@ -695,8 +695,8 @@
 `,
 		})
 		env.AfterChange(
-			NoDiagnostics("a/a_test.go"),
-			NoDiagnostics("a/a2_test.go"),
+			NoDiagnostics(ForFile("a/a_test.go")),
+			NoDiagnostics(ForFile("a/a2_test.go")),
 		)
 	})
 }
diff --git a/gopls/internal/regtest/workspace/broken_test.go b/gopls/internal/regtest/workspace/broken_test.go
index 9a65030..0c718b3 100644
--- a/gopls/internal/regtest/workspace/broken_test.go
+++ b/gopls/internal/regtest/workspace/broken_test.go
@@ -166,7 +166,7 @@
 		env.OpenFile("go.mod")
 		env.RegexpReplace("go.mod", "mod.testx", "mod.test")
 		env.SaveBuffer("go.mod") // saving triggers a reload
-		env.AfterChange(NoMatchingDiagnostics())
+		env.AfterChange(NoDiagnostics())
 	})
 }
 
@@ -219,8 +219,8 @@
 				// workspace folder, therefore we can't invoke AfterChange here.
 				env.ChangeWorkspaceFolders("a", "b")
 				env.Await(
-					NoDiagnostics("a/a.go"),
-					NoDiagnostics("b/go.mod"),
+					NoDiagnostics(ForFile("a/a.go")),
+					NoDiagnostics(ForFile("b/go.mod")),
 					NoOutstandingWork(),
 				)
 
@@ -256,7 +256,7 @@
 		).Run(t, modules, func(t *testing.T, env *Env) {
 			env.OpenFile("a/a.go")
 			env.AfterChange(
-				NoDiagnostics("a/a.go"),
+				NoDiagnostics(ForFile("a/a.go")),
 				NoOutstandingWork(),
 			)
 		})
diff --git a/gopls/internal/regtest/workspace/directoryfilters_test.go b/gopls/internal/regtest/workspace/directoryfilters_test.go
index bf22b80..f7c7153 100644
--- a/gopls/internal/regtest/workspace/directoryfilters_test.go
+++ b/gopls/internal/regtest/workspace/directoryfilters_test.go
@@ -55,7 +55,7 @@
 	).Run(t, files, func(t *testing.T, env *Env) {
 		env.OnceMet(
 			InitialWorkspaceLoad,
-			NoDiagnostics("exclude/x.go"),
+			NoDiagnostics(ForFile("exclude/x.go")),
 		)
 	})
 }
@@ -85,8 +85,8 @@
 	).Run(t, files, func(t *testing.T, env *Env) {
 		env.OnceMet(
 			InitialWorkspaceLoad,
-			NoDiagnostics("exclude/exclude.go"), // filtered out
-			NoDiagnostics("include/include.go"), // successfully builds
+			NoDiagnostics(ForFile("exclude/exclude.go")), // filtered out
+			NoDiagnostics(ForFile("include/include.go")), // successfully builds
 		)
 	})
 }
diff --git a/gopls/internal/regtest/workspace/metadata_test.go b/gopls/internal/regtest/workspace/metadata_test.go
index de7dec9..4990a66 100644
--- a/gopls/internal/regtest/workspace/metadata_test.go
+++ b/gopls/internal/regtest/workspace/metadata_test.go
@@ -34,7 +34,7 @@
 		env.OpenFile("p.go")
 		env.RegexpReplace("p.go", "\"fmt\"", "\"fmt\"\n)")
 		env.AfterChange(
-			NoDiagnostics("p.go"),
+			NoDiagnostics(ForFile("p.go")),
 		)
 	})
 }
@@ -88,8 +88,8 @@
 		// information when fresh metadata arrives.
 		// env.RegexpReplace("foo.go", "package main", "package main // test")
 		env.AfterChange(
-			NoDiagnostics("foo.go"),
-			NoDiagnostics("bar.go"),
+			NoDiagnostics(ForFile("foo.go")),
+			NoDiagnostics(ForFile("bar.go")),
 		)
 
 		// If instead of 'ignore' (which gopls treats as a standalone package) we
diff --git a/gopls/internal/regtest/workspace/standalone_test.go b/gopls/internal/regtest/workspace/standalone_test.go
index 53b269e..7056f54 100644
--- a/gopls/internal/regtest/workspace/standalone_test.go
+++ b/gopls/internal/regtest/workspace/standalone_test.go
@@ -74,14 +74,14 @@
 		}
 
 		env.OpenFile("lib/lib.go")
-		env.AfterChange(NoMatchingDiagnostics())
+		env.AfterChange(NoDiagnostics())
 
 		// Replacing C with D should not cause any workspace diagnostics, since we
 		// haven't yet opened the standalone file.
 		env.RegexpReplace("lib/lib.go", "C", "D")
-		env.AfterChange(NoMatchingDiagnostics())
+		env.AfterChange(NoDiagnostics())
 		env.RegexpReplace("lib/lib.go", "D", "C")
-		env.AfterChange(NoMatchingDiagnostics())
+		env.AfterChange(NoDiagnostics())
 
 		refs := env.References("lib/lib.go", env.RegexpSearch("lib/lib.go", "C"))
 		checkLocations("References", refs, "lib/lib.go")
@@ -91,7 +91,7 @@
 
 		// Opening the standalone file should not result in any diagnostics.
 		env.OpenFile("lib/ignore.go")
-		env.AfterChange(NoMatchingDiagnostics())
+		env.AfterChange(NoDiagnostics())
 
 		// Having opened the standalone file, we should find its symbols in the
 		// workspace.
@@ -135,7 +135,7 @@
 
 		// Undoing the replacement should fix diagnostics
 		env.RegexpReplace("lib/lib.go", "D", "C")
-		env.AfterChange(NoMatchingDiagnostics())
+		env.AfterChange(NoDiagnostics())
 
 		// Now that our workspace has no errors, we should be able to find
 		// references and rename.
@@ -187,7 +187,7 @@
 
 		env.AfterChange(
 			env.DiagnosticAtRegexp("ignore.go", "package (main)"),
-			NoDiagnostics("standalone.go"),
+			NoDiagnostics(ForFile("standalone.go")),
 		)
 
 		cfg := env.Editor.Config()
@@ -201,7 +201,7 @@
 		env.RegexpReplace("ignore.go", "arbitrary", "meaningless")
 
 		env.AfterChange(
-			NoDiagnostics("ignore.go"),
+			NoDiagnostics(ForFile("ignore.go")),
 			env.DiagnosticAtRegexp("standalone.go", "package (main)"),
 		)
 	})
diff --git a/gopls/internal/regtest/workspace/workspace_test.go b/gopls/internal/regtest/workspace/workspace_test.go
index 720ec97..acdeef6 100644
--- a/gopls/internal/regtest/workspace/workspace_test.go
+++ b/gopls/internal/regtest/workspace/workspace_test.go
@@ -156,7 +156,7 @@
 		)
 		env.CloseBuffer("pkg/main.go")
 		env.AfterChange(
-			NoDiagnostics("pkg/main2.go"),
+			NoDiagnostics(ForFile("pkg/main2.go")),
 		)
 	})
 }
@@ -269,7 +269,7 @@
 		env.AfterChange(
 			env.DiagnosticAtRegexp("moda/a/a.go", "x"),
 			env.DiagnosticAtRegexp("modb/b/b.go", "x"),
-			NoMatchingDiagnostics(env.AtRegexp("moda/a/a.go", `"b.com/b"`)),
+			NoDiagnostics(env.AtRegexp("moda/a/a.go", `"b.com/b"`)),
 		)
 	})
 }
@@ -643,7 +643,7 @@
 
 		// This fails if guarded with a OnceMet(DoneWithSave(), ...), because it is
 		// debounced (and therefore not synchronous with the change).
-		env.Await(NoDiagnostics("modb/go.mod"))
+		env.Await(NoDiagnostics(ForFile("modb/go.mod")))
 
 		// Test Formatting.
 		env.SetBufferContent("go.work", `go 1.18
@@ -693,7 +693,7 @@
 		// the diagnostic still shows up.
 		env.SetBufferContent("go.work", "go 1.18 \n\n use ./bar\n")
 		env.AfterChange(
-			NoMatchingDiagnostics(env.AtRegexp("go.work", "use")),
+			NoDiagnostics(env.AtRegexp("go.work", "use")),
 		)
 		env.SetBufferContent("go.work", "go 1.18 \n\n use ./foo\n")
 		env.AfterChange(
@@ -978,7 +978,7 @@
 			env.ApplyQuickFixes("b/go.mod", []protocol.Diagnostic{d})
 		}
 		env.AfterChange(
-			NoDiagnostics("b/go.mod"),
+			NoDiagnostics(ForFile("b/go.mod")),
 		)
 	})
 }
@@ -1051,7 +1051,7 @@
 		// Since b/main.go is not in the workspace, it should have a warning on its
 		// package declaration.
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 			DiagnosticAt("b/main.go", 0, 0),
 		)
 		env.WriteWorkspaceFile("go.work", `go 1.16
@@ -1061,7 +1061,7 @@
 	b
 )
 `)
-		env.AfterChange(NoMatchingDiagnostics())
+		env.AfterChange(NoDiagnostics())
 		// Removing the go.work file should put us back where we started.
 		env.RemoveWorkspaceFile("go.work")
 
@@ -1077,7 +1077,7 @@
 		env.OpenFile("b/main.go")
 
 		env.AfterChange(
-			NoDiagnostics("main.go"),
+			NoDiagnostics(ForFile("main.go")),
 			DiagnosticAt("b/main.go", 0, 0),
 		)
 	})
@@ -1119,8 +1119,8 @@
 		)
 		env.RegexpReplace("other_test.go", "main", "main_test")
 		env.AfterChange(
-			NoDiagnostics("other_test.go"),
-			NoDiagnostics("main_test.go"),
+			NoDiagnostics(ForFile("other_test.go")),
+			NoDiagnostics(ForFile("main_test.go")),
 		)
 
 		// This will cause a test failure if other_test.go is not in any package.
@@ -1163,7 +1163,7 @@
 	Run(t, ws, func(t *testing.T, env *Env) {
 		env.OpenFile("b/main.go")
 		env.AfterChange(
-			NoDiagnostics("a/main.go"),
+			NoDiagnostics(ForFile("a/main.go")),
 		)
 		env.OpenFile("a/main.go")
 		env.AfterChange(
@@ -1178,7 +1178,7 @@
 		// Gopls should be smart enough to avoid diagnosing a.
 		env.RegexpReplace("b/main.go", "package b", "package b // a package")
 		env.AfterChange(
-			NoDiagnostics("a/main.go"),
+			NoDiagnostics(ForFile("a/main.go")),
 		)
 	})
 }