cmd/go/internal/modload: remove the Reqs function

The Reqs function returns an mvs.Reqs implemention for the global
build list. The API that it presents assumes that the build list is
globally consistent (problematic for #40775) and readily available
(problematic for #36460).

Fortunately, it is no longer used outside of the modload package.
We can instead use individual instances of the unexported mvsReqs
struct, making the dependency on the global build list more explicit.

For #36460
For #40775

Change-Id: I8674442f2a86416b0bf9c3395cb591c1e724c9d2
Reviewed-on: https://go-review.googlesource.com/c/go/+/272129
Trust: Bryan C. Mills <bcmills@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
diff --git a/src/cmd/go/internal/modload/init.go b/src/cmd/go/internal/modload/init.go
index b9345ac..a9b77c8 100644
--- a/src/cmd/go/internal/modload/init.go
+++ b/src/cmd/go/internal/modload/init.go
@@ -853,7 +853,7 @@
 			retain = append(retain, m.Path)
 		}
 	}
-	min, err := mvs.Req(Target, retain, Reqs())
+	min, err := mvs.Req(Target, retain, &mvsReqs{buildList: buildList})
 	if err != nil {
 		base.Fatalf("go: %v", err)
 	}
@@ -985,7 +985,7 @@
 	keep := make(map[module.Version]bool)
 	var mu sync.Mutex
 	reqs := &keepSumReqs{
-		Reqs: Reqs(),
+		Reqs: &mvsReqs{buildList: buildList},
 		visit: func(m module.Version) {
 			// If we build using a replacement module, keep the sum for the replacement,
 			// since that's the code we'll actually use during a build.
diff --git a/src/cmd/go/internal/modload/load.go b/src/cmd/go/internal/modload/load.go
index 3023302..732c4af 100644
--- a/src/cmd/go/internal/modload/load.go
+++ b/src/cmd/go/internal/modload/load.go
@@ -800,7 +800,7 @@
 	}
 
 	var err error
-	reqs := Reqs()
+	reqs := &mvsReqs{buildList: buildList}
 	buildList, err = mvs.BuildList(Target, reqs)
 	if err != nil {
 		base.Fatalf("go: %v", err)
@@ -842,7 +842,7 @@
 		}
 
 		// Recompute buildList with all our additions.
-		reqs = Reqs()
+		reqs = &mvsReqs{buildList: buildList}
 		buildList, err = mvs.BuildList(Target, reqs)
 		if err != nil {
 			// If an error was found in a newly added module, report the package
diff --git a/src/cmd/go/internal/modload/mvs.go b/src/cmd/go/internal/modload/mvs.go
index db57b3e..167d681 100644
--- a/src/cmd/go/internal/modload/mvs.go
+++ b/src/cmd/go/internal/modload/mvs.go
@@ -11,7 +11,6 @@
 	"sort"
 
 	"cmd/go/internal/modfetch"
-	"cmd/go/internal/mvs"
 
 	"golang.org/x/mod/module"
 	"golang.org/x/mod/semver"
@@ -23,16 +22,6 @@
 	buildList []module.Version
 }
 
-// Reqs returns the current module requirement graph.
-// Future calls to EditBuildList do not affect the operation
-// of the returned Reqs.
-func Reqs() mvs.Reqs {
-	r := &mvsReqs{
-		buildList: buildList,
-	}
-	return r
-}
-
 func (r *mvsReqs) Required(mod module.Version) ([]module.Version, error) {
 	if mod == Target {
 		// Use the build list as it existed when r was constructed, not the current
diff --git a/src/cmd/go/internal/modload/mvs_test.go b/src/cmd/go/internal/modload/mvs_test.go
index 0cb376e..50e93c3 100644
--- a/src/cmd/go/internal/modload/mvs_test.go
+++ b/src/cmd/go/internal/modload/mvs_test.go
@@ -2,19 +2,17 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
-package modload_test
+package modload
 
 import (
 	"testing"
-
-	"cmd/go/internal/modload"
 )
 
 func TestReqsMax(t *testing.T) {
 	type testCase struct {
 		a, b, want string
 	}
-	reqs := modload.Reqs()
+	reqs := new(mvsReqs)
 	for _, tc := range []testCase{
 		{a: "v0.1.0", b: "v0.2.0", want: "v0.2.0"},
 		{a: "v0.2.0", b: "v0.1.0", want: "v0.2.0"},
@@ -27,7 +25,7 @@
 	} {
 		max := reqs.Max(tc.a, tc.b)
 		if max != tc.want {
-			t.Errorf("Reqs().Max(%q, %q) = %q; want %q", tc.a, tc.b, max, tc.want)
+			t.Errorf("(%T).Max(%q, %q) = %q; want %q", reqs, tc.a, tc.b, max, tc.want)
 		}
 	}
 }