Show "did you mean" suggestion for `{override,inject}_repo`

Fixes #23981

Closes #23982.

PiperOrigin-RevId: 686486627
Change-Id: I5f03b63601a535f8d551c005b00bf040846a324d
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD
index d422935..8edaa29 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD
@@ -191,6 +191,7 @@
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/main/java/net/starlark/java/annot",
         "//src/main/java/net/starlark/java/eval",
+        "//src/main/java/net/starlark/java/spelling",
         "//src/main/java/net/starlark/java/syntax",
         "//src/main/protobuf:failure_details_java_proto",
         "//third_party:auto_value",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleThreadContext.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleThreadContext.java
index 20cb8d2..98067f0 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleThreadContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleThreadContext.java
@@ -38,6 +38,7 @@
 import net.starlark.java.eval.EvalException;
 import net.starlark.java.eval.Starlark;
 import net.starlark.java.eval.StarlarkThread;
+import net.starlark.java.spelling.SpellChecker;
 import net.starlark.java.syntax.Location;
 
 /** Context object for a Starlark thread evaluating the MODULE.bazel file and files it includes. */
@@ -255,8 +256,11 @@
         if (!context.repoNameUsages.containsKey(overridingRepoName)) {
           throw Starlark.errorf(
                   "The repo exported as '%s' by module extension '%s' is overridden with '%s', but"
-                      + " no repo is visible under this name",
-                  overriddenRepoName, extensionName, overridingRepoName)
+                      + " no repo is visible under this name%s",
+                  overriddenRepoName,
+                  extensionName,
+                  overridingRepoName,
+                  SpellChecker.didYouMean(overridingRepoName, context.repoNameUsages.keySet()))
               .withCallStack(override.getValue().stack);
         }
         String importedAs = imports.inverse().get(overriddenRepoName);