Use RepositoryName instead of String for the "toolsRepository" concept

This thing is often used to construct absolute labels (blegh). Fortunately RepositoryName is a drop-in replacement for String for these cases. Beyond that, this change also provides a bit of type safety, so hooray.

PiperOrigin-RevId: 415507946
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspectFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspectFactory.java
index 6b4c3cb..aef8a27 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspectFactory.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
 
@@ -28,14 +29,13 @@
    * @param context the context of the associated configured target plus all the attributes the
    *     aspect itself has defined
    * @param parameters information from attributes of the rule that have requested this
-   * @param toolsRepository string representing the name of the tools repository such as
-   *     "@bazel_tools"
+   * @param toolsRepository the name of the tools repository such as "{@literal @}bazel_tools"
    */
   ConfiguredAspect create(
       ConfiguredTargetAndData ctadBase,
       RuleContext context,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws ActionConflictException, InterruptedException;
 
   /** Adds any aspect implementation-specific requirements to the given builder. */
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 296ddf6..9cc3a14 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -44,6 +44,7 @@
 import com.google.devtools.build.lib.analysis.starlark.StarlarkModules;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.graph.Digraph;
 import com.google.devtools.build.lib.graph.Node;
 import com.google.devtools.build.lib.packages.BazelStarlarkContext;
@@ -132,7 +133,7 @@
     private final StringBuilder defaultWorkspaceFileSuffix = new StringBuilder();
     private Label preludeLabel;
     private String runfilesPrefix;
-    private String toolsRepository;
+    private RepositoryName toolsRepository;
     @Nullable private String builtinsBzlZipResource;
     private boolean useDummyBuiltinsBzlInsteadOfResource = false;
     @Nullable private String builtinsBzlPackagePathInSource;
@@ -202,7 +203,7 @@
       return this;
     }
 
-    public Builder setToolsRepository(String toolsRepository) {
+    public Builder setToolsRepository(RepositoryName toolsRepository) {
       this.toolsRepository = toolsRepository;
       return this;
     }
@@ -567,7 +568,7 @@
     }
 
     @Override
-    public String getToolsRepository() {
+    public RepositoryName getToolsRepository() {
       return toolsRepository;
     }
 
@@ -595,7 +596,7 @@
   private final String runfilesPrefix;
 
   /** The path to the tools repository. */
-  private final String toolsRepository;
+  private final RepositoryName toolsRepository;
 
   /**
    * Where the builtins bzl files are located (if not overridden by
@@ -662,7 +663,7 @@
   private ConfiguredRuleClassProvider(
       Label preludeLabel,
       String runfilesPrefix,
-      String toolsRepository,
+      RepositoryName toolsRepository,
       @Nullable Root bundledBuiltinsRoot,
       @Nullable String builtinsBzlPackagePathInSource,
       ImmutableMap<String, RuleClass> ruleClassMap,
@@ -729,7 +730,7 @@
   }
 
   @Override
-  public String getToolsRepository() {
+  public RepositoryName getToolsRepository() {
     return toolsRepository;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index 55408f8..a25cab7 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -351,9 +351,7 @@
           // TODO(bazel-team): maybe merge with RuleConfiguredTargetBuilder?
           ConfiguredTarget target =
               StarlarkRuleConfiguredTargetUtil.buildRule(
-                  ruleContext,
-                  ruleClass.getAdvertisedProviders(),
-                  ruleClassProvider.getToolsRepository());
+                  ruleContext, ruleClass.getAdvertisedProviders());
 
           return target != null ? target : erroredConfiguredTarget(ruleContext);
         }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java
index 6db1e4a..88c7411 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleDefinitionEnvironment.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.lib.analysis;
 
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import java.util.Optional;
 
 /**
@@ -25,7 +26,7 @@
 public interface RuleDefinitionEnvironment {
 
   /** Returns the name of the tools repository. */
-  String getToolsRepository();
+  RepositoryName getToolsRepository();
 
   /**
    * Prepends the tools repository path to the given string and parses the result using {@link
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java
index 7403ec8..159f332 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkLateBoundDefault.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.analysis.starlark.annotations.StarlarkConfigurationField;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.Attribute.AbstractLabelLateBoundDefault;
 import com.google.devtools.build.lib.packages.Attribute.LateBoundDefault;
 import com.google.devtools.build.lib.packages.AttributeMap;
@@ -65,7 +66,7 @@
 
   /** Returns the {@link StarlarkConfigurationField} annotation corresponding to this method. */
   private static Label getDefaultLabel(
-      StarlarkConfigurationField annotation, String toolsRepository) {
+      StarlarkConfigurationField annotation, RepositoryName toolsRepository) {
     if (annotation.defaultLabel().isEmpty()) {
       return null;
     }
@@ -80,7 +81,7 @@
       Class<FragmentT> fragmentClass,
       String fragmentName,
       Method method,
-      String toolsRepository) {
+      RepositoryName toolsRepository) {
     this(
         getDefaultLabel(annotation, toolsRepository),
         fragmentClass,
@@ -135,10 +136,9 @@
 
   private static class CacheKey {
     private final Class<?> fragmentClass;
-    private final String toolsRepository;
+    private final RepositoryName toolsRepository;
 
-    private CacheKey(Class<?> fragmentClass,
-        String toolsRepository) {
+    private CacheKey(Class<?> fragmentClass, RepositoryName toolsRepository) {
       this.fragmentClass = fragmentClass;
       this.toolsRepository = toolsRepository;
     }
@@ -225,7 +225,7 @@
    */
   @SuppressWarnings("unchecked")
   public static <FragmentT> StarlarkLateBoundDefault<FragmentT> forConfigurationField(
-      Class<FragmentT> fragmentClass, String fragmentFieldName, String toolsRepository)
+      Class<FragmentT> fragmentClass, String fragmentFieldName, RepositoryName toolsRepository)
       throws InvalidConfigurationFieldException {
       CacheKey cacheKey = new CacheKey(fragmentClass, toolsRepository);
       StarlarkLateBoundDefault<?> resolver = fieldCache.get(cacheKey).get(fragmentFieldName);
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
index 14ce51e..cd2b5fb 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleClassFunctions.java
@@ -53,6 +53,7 @@
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.LabelValidator;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.events.EventHandler;
 import com.google.devtools.build.lib.events.EventKind;
@@ -177,7 +178,7 @@
 
   /** Parent rule class for test Starlark rules. */
   public static RuleClass getTestBaseRule(RuleDefinitionEnvironment env) {
-    String toolsRepository = env.getToolsRepository();
+    RepositoryName toolsRepository = env.getToolsRepository();
     RuleClass.Builder builder =
         new RuleClass.Builder("$test_base_rule", RuleClassType.ABSTRACT, true, baseRule)
             .requiresConfigurationFragments(TestConfiguration.class)
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
index 5b1a22e..9a74ec1 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/StarlarkRuleConfiguredTargetUtil.java
@@ -77,7 +77,7 @@
    */
   @Nullable
   public static ConfiguredTarget buildRule(
-      RuleContext ruleContext, AdvertisedProviderSet advertisedProviders, String toolsRepository)
+      RuleContext ruleContext, AdvertisedProviderSet advertisedProviders)
       throws InterruptedException, RuleErrorException, ActionConflictException {
     RuleClass ruleClass = ruleContext.getRule().getRuleClassObject();
     if (ruleClass.getRuleClassType().equals(RuleClass.Builder.RuleClassType.WORKSPACE)) {
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 103513c..c0c3516 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -59,6 +59,7 @@
 import com.google.devtools.build.lib.bazel.rules.python.BazelPyTestRule;
 import com.google.devtools.build.lib.bazel.rules.python.BazelPythonConfiguration;
 import com.google.devtools.build.lib.cmdline.LabelConstants;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.RuleClass.Builder.ThirdPartyLicenseExistencePolicy;
 import com.google.devtools.build.lib.rules.android.AarImportBaseRule;
 import com.google.devtools.build.lib.rules.android.AndroidApplicationResourceInfo;
@@ -139,8 +140,6 @@
 
 /** A rule class provider implementing the rules Bazel knows. */
 public class BazelRuleClassProvider {
-  public static final String TOOLS_REPOSITORY = "@bazel_tools";
-
   /** Command-line options. */
   public static class StrictActionEnvOptions extends FragmentOptions {
     @Option(
@@ -241,7 +240,7 @@
 
   /** Adds this class's definitions to a builder. */
   public static void setup(ConfiguredRuleClassProvider.Builder builder) {
-    builder.setToolsRepository(TOOLS_REPOSITORY);
+    builder.setToolsRepository(RepositoryName.BAZEL_TOOLS);
     builder.setBuiltinsBzlZipResource(
         ResourceFileLoader.resolveResource(BazelRuleClassProvider.class, "builtins_bzl.zip"));
     builder.setBuiltinsBzlPackagePathInSource("src/main/starlark/builtins_bzl");
@@ -340,7 +339,7 @@
       new RuleSet() {
         @Override
         public void init(ConfiguredRuleClassProvider.Builder builder) {
-          String toolsRepository = checkNotNull(builder.getToolsRepository());
+          RepositoryName toolsRepository = checkNotNull(builder.getToolsRepository());
 
           builder.addConfigurationFragment(AndroidConfiguration.class);
           builder.addConfigurationFragment(AndroidLocalTestConfiguration.class);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
index ed6b38d..6a2b1f6 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/ObjcRules.java
@@ -23,6 +23,7 @@
 import com.google.devtools.build.lib.bazel.rules.objc.BazelAppleStaticLibraryRule;
 import com.google.devtools.build.lib.bazel.rules.objc.BazelObjcImportRule;
 import com.google.devtools.build.lib.bazel.rules.objc.BazelObjcLibraryRule;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.AppleToolchain;
 import com.google.devtools.build.lib.rules.apple.AvailableXcodesRule;
@@ -52,7 +53,7 @@
 
   @Override
   public void init(ConfiguredRuleClassProvider.Builder builder) {
-    String toolsRepository = checkNotNull(builder.getToolsRepository());
+    RepositoryName toolsRepository = checkNotNull(builder.getToolsRepository());
 
     builder.addConfigurationFragment(ObjcConfiguration.class);
     builder.addConfigurationFragment(AppleConfiguration.class);
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelDexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelDexArchiveAspect.java
index 54cc3f2..e93983b 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelDexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/BazelDexArchiveAspect.java
@@ -13,11 +13,12 @@
 // limitations under the License.
 package com.google.devtools.build.lib.bazel.rules.android;
 
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.rules.android.DexArchiveAspect;
 
 /** Fills {@link DexArchiveAspect} with appropriate Android tools and toolchain references. */
 public class BazelDexArchiveAspect extends DexArchiveAspect {
-  public BazelDexArchiveAspect(String toolsRepository) {
+  public BazelDexArchiveAspect(RepositoryName toolsRepository) {
     super(toolsRepository, BazelSdkToolchainRule.TOOLCHAIN_LABEL);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
index 03bb8cf..e13666e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BUILD
@@ -28,6 +28,7 @@
         "//src/main/java/com/google/devtools/build/lib/analysis:platform_configuration",
         "//src/main/java/com/google/devtools/build/lib/analysis:rule_definition_environment",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
+        "//src/main/java/com/google/devtools/build/lib/cmdline:cmdline-primitives",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
index fa8a30b..a503f18 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCppRuleClasses.java
@@ -45,6 +45,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.AttributeMap;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
@@ -382,7 +383,7 @@
                           // To avoid cycles in the dependency graph, return null for rules under
                           // @bazel_tools//third_party/def_parser and @bazel_tools//tools/cpp
                           String label = rule.getLabel().toString();
-                          String toolsRepository = env.getToolsRepository();
+                          RepositoryName toolsRepository = env.getToolsRepository();
                           return label.startsWith(toolsRepository + "//third_party/def_parser")
                                   // @bazel_tools//tools/cpp:malloc and @bazel_tools//tools/cpp:stl
                                   // are implicit dependencies of all cc rules,
diff --git a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
index 8a43420..6554547 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/BazelStarlarkContext.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.RepositoryMapping;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import java.util.HashMap;
 import java.util.Optional;
 import javax.annotation.Nullable;
@@ -61,7 +62,7 @@
 
   private final Phase phase;
   // Only necessary for loading phase threads.
-  @Nullable private final String toolsRepository;
+  @Nullable private final RepositoryName toolsRepository;
   // Only necessary for loading phase threads to construct configuration_field.
   @Nullable private final ImmutableMap<String, Class<?>> fragmentNameToClass;
   private final HashMap<String, Label> convertedLabelsInPackage;
@@ -93,7 +94,7 @@
   // analysis threads?
   public BazelStarlarkContext(
       Phase phase,
-      @Nullable String toolsRepository,
+      @Nullable RepositoryName toolsRepository,
       @Nullable ImmutableMap<String, Class<?>> fragmentNameToClass,
       HashMap<String, Label> convertedLabelsInPackage,
       SymbolGenerator<?> symbolGenerator,
@@ -111,7 +112,7 @@
   /** Returns the name of the tools repository, such as "@bazel_tools". */
   @Nullable
   @Override
-  public String getToolsRepository() {
+  public RepositoryName getToolsRepository() {
     return toolsRepository;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/BUILD b/src/main/java/com/google/devtools/build/lib/rules/BUILD
index ce75003..fe48f9f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/BUILD
@@ -62,6 +62,7 @@
         "//src/main/java/com/google/devtools/build/lib/analysis:analysis_cluster",
         "//src/main/java/com/google/devtools/build/lib/analysis:test/test_configuration",
         "//src/main/java/com/google/devtools/build/lib/analysis:test/test_trimming_transition_factory",
+        "//src/main/java/com/google/devtools/build/lib/cmdline:cmdline-primitives",
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_and_data",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
index 81f2d8a..2ce6a73 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
@@ -51,7 +52,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws ActionConflictException, InterruptedException {
     if (!JavaCommon.getConstraints(ruleContext).contains("android")
         && !ruleContext.getRule().getRuleClass().startsWith("android_")) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index f472770..f758ea5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -47,6 +47,7 @@
 import com.google.devtools.build.lib.analysis.config.ExecutionTransitionFactory;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.IterablesChain;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -130,10 +131,10 @@
       new FlagMatcher(
           ImmutableList.of("--no-locals", "--no-optimize", "--no-warnings", "--positions"));
 
-  private final String toolsRepository;
+  private final RepositoryName toolsRepository;
   private final String sdkToolchainLabel;
 
-  public DexArchiveAspect(String toolsRepository, String sdkToolchainLabel) {
+  public DexArchiveAspect(RepositoryName toolsRepository, String sdkToolchainLabel) {
     this.toolsRepository = toolsRepository;
     this.sdkToolchainLabel = sdkToolchainLabel;
   }
@@ -254,7 +255,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters params,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws InterruptedException, ActionConflictException {
     ConfiguredAspect.Builder result = new ConfiguredAspect.Builder(ruleContext);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
index caae836..d042ab8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/apple/AppleToolchain.java
@@ -22,6 +22,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.Attribute;
 import com.google.devtools.build.lib.packages.Attribute.LabelLateBoundDefault;
@@ -128,7 +129,7 @@
 
   /** The default label of the build-wide {@code xcode_config} configuration rule. */
   public static LabelLateBoundDefault<AppleConfiguration> getXcodeConfigLabel(
-      String toolsRepository) {
+      RepositoryName toolsRepository) {
     return LabelLateBoundDefault.fromTargetConfiguration(
         AppleConfiguration.class,
         Label.parseAbsoluteUnchecked(
@@ -170,9 +171,9 @@
    * Base rule definition to be ancestor for rules which may require an xcode toolchain.
    */
   public static class RequiresXcodeConfigRule implements RuleDefinition {
-    private final String toolsRepository;
+    private final RepositoryName toolsRepository;
 
-    public RequiresXcodeConfigRule(String toolsRepository) {
+    public RequiresXcodeConfigRule(RepositoryName toolsRepository) {
       this.toolsRepository = toolsRepository;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRuleClasses.java
index acf3e0f..467fb28 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigRuleClasses.java
@@ -151,7 +151,7 @@
                       new ComputedDefault() {
                         @Override
                         public Object getDefault(AttributeMap rule) {
-                          return env.getToolsRepository();
+                          return env.getToolsRepository().strippedName();
                         }
                       }))
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
index f0816a7..361bd27 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java
@@ -216,12 +216,8 @@
   }
 
   private static RepositoryName getToolsRepository(RuleContext ruleContext) {
-    try {
-      return RepositoryName.create(
-          ruleContext.attributes().get(ConfigSettingRule.TOOLS_REPOSITORY_ATTRIBUTE, Type.STRING));
-    } catch (LabelSyntaxException ex) {
-      throw new IllegalStateException(ex);
-    }
+    return RepositoryName.createFromValidStrippedName(
+        ruleContext.attributes().get(ConfigSettingRule.TOOLS_REPOSITORY_ATTRIBUTE, Type.STRING));
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/core/ValidateTarget.java b/src/main/java/com/google/devtools/build/lib/rules/core/ValidateTarget.java
index 88e53ab..5f12569 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/core/ValidateTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/core/ValidateTarget.java
@@ -19,6 +19,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.OutputGroupInfo;
 import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
@@ -47,7 +48,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext context,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws ActionConflictException, InterruptedException {
     OutputGroupInfo outputGroupInfo = OutputGroupInfo.get(ctadBase.getConfiguredTarget());
     if (outputGroupInfo != null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/GraphNodeAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/GraphNodeAspect.java
index 18bceb3..0f33339 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/GraphNodeAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/GraphNodeAspect.java
@@ -21,6 +21,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
@@ -63,7 +64,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters params,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws ActionConflictException, InterruptedException {
     ImmutableList.Builder<GraphNodeInfo> children = ImmutableList.builder();
     if (ruleContext.attributes().has("deps")) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
index 689d29f..cc122f1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
@@ -34,6 +34,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.packages.AspectDefinition;
@@ -102,7 +103,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws InterruptedException, ActionConflictException {
     ProtoInfo protoInfo = checkNotNull(ctadBase.getConfiguredTarget().get(ProtoInfo.PROVIDER));
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index f504e8c..1636b94 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.AspectDefinition;
@@ -83,7 +84,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws InterruptedException, ActionConflictException {
     ConfiguredAspect.Builder aspect = new ConfiguredAspect.Builder(ruleContext);
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
index 7db18a1..282d4ba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.AspectDefinition;
@@ -87,7 +88,6 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters parameters,
-      String toolsRepository,
       Iterable<String> additionalProtocOpts)
       throws InterruptedException, ActionConflictException {
     ConfiguredAspect.Builder aspect = new ConfiguredAspect.Builder(ruleContext);
@@ -110,10 +110,9 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws InterruptedException, ActionConflictException {
-    return createWithProtocOpts(
-        ctadBase, ruleContext, parameters, toolsRepository, ImmutableList.of());
+    return createWithProtocOpts(ctadBase, ruleContext, parameters, ImmutableList.of());
   }
 
   @Override
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
index b7728e4..8825101 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java
@@ -42,6 +42,7 @@
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.packages.AspectDefinition;
@@ -118,7 +119,7 @@
           null,
           (rule, attributes, j2objcConfig) -> j2objcConfig.deadCodeReport());
 
-  private final String toolsRepository;
+  private final RepositoryName toolsRepository;
   private final Label ccToolchainType;
   private final LabelLateBoundDefault<CppConfiguration> ccToolchain;
   private final Label javaToolchain;
@@ -240,7 +241,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws InterruptedException, ActionConflictException {
     ConfiguredTarget base = ctadBase.getConfiguredTarget();
     if (isProtoRule(base)) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
index 09633af..0361047 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkAspectFactory.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.analysis.StarlarkProviderValidationUtil;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleConfiguredTargetUtil;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Info;
 import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
@@ -45,7 +46,7 @@
       ConfiguredTargetAndData ctadBase,
       RuleContext ruleContext,
       AspectParameters parameters,
-      String toolsRepository)
+      RepositoryName toolsRepository)
       throws InterruptedException, ActionConflictException {
     StarlarkRuleContext ctx;
     try {
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
index 738b0fd..dc365a3 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectDefinitionTest.java
@@ -24,6 +24,7 @@
 import com.google.devtools.build.lib.analysis.config.HostTransition;
 import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.AdvertisedProviderSet;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
@@ -88,7 +89,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext context,
         AspectParameters parameters,
-        String toolsRepository) {
+        RepositoryName toolsRepository) {
       throw new IllegalStateException();
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
index 3e3a507..983019d 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/AspectTest.java
@@ -41,6 +41,7 @@
 import com.google.devtools.build.lib.analysis.util.TestAspects.RuleInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -462,7 +463,7 @@
           ConfiguredTargetAndData ctadBase,
           RuleContext ruleContext,
           AspectParameters parameters,
-          String toolsRepository)
+          RepositoryName toolsRepository)
           throws InterruptedException, ActionConflictException {
         Object lateBoundPrereq = ruleContext.getPrerequisite(":late");
         return new ConfiguredAspect.Builder(ruleContext)
@@ -535,7 +536,7 @@
           ConfiguredTargetAndData ctadBase,
           RuleContext ruleContext,
           AspectParameters parameters,
-          String toolsRepository)
+          RepositoryName toolsRepository)
           throws InterruptedException, ActionConflictException {
         ruleContext.registerAction(new NullAction(ruleContext.createOutputArtifact()));
         return new ConfiguredAspect.Builder(ruleContext).build();
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/RequiredConfigFragmentsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/RequiredConfigFragmentsTest.java
index d90476c..e60a2d1 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/RequiredConfigFragmentsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/RequiredConfigFragmentsTest.java
@@ -20,6 +20,7 @@
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.analysis.config.CoreOptions.IncludeConfigFragmentsEnum;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.NativeAspectClass;
@@ -160,7 +161,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters params,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       return new ConfiguredAspect.Builder(ruleContext).build();
     }
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index 7ab272e..521271f 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -41,6 +41,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.PackageGroupConfiguredTarget;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -241,7 +242,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       String information = parameters.isEmpty()
           ? ""
@@ -286,7 +287,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       return new ConfiguredAspect.Builder(ruleContext).addProvider(new FooProvider()).build();
     }
@@ -317,7 +318,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       return new ConfiguredAspect.Builder(ruleContext).addProvider(new FooProvider()).build();
     }
@@ -336,7 +337,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       return new ConfiguredAspect.Builder(ruleContext).addProvider(new BarProvider()).build();
     }
@@ -384,7 +385,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       TransitiveInfoCollection dep = ruleContext.getPrerequisite("$dep");
       if (dep == null) {
@@ -555,7 +556,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       return new ConfiguredAspect.Builder(ruleContext)
           .addStarlarkTransitiveInfo("native_aspect_prov", "native_aspect_val")
@@ -589,7 +590,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       return new ConfiguredAspect.Builder(ruleContext).addProvider(new FooProvider()).build();
     }
@@ -640,7 +641,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       StringBuilder information = new StringBuilder("aspect " + ruleContext.getLabel());
       if (!parameters.isEmpty()) {
@@ -690,7 +691,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws ActionConflictException, InterruptedException {
       ruleContext.ruleWarning("Aspect warning on " + ctadBase.getTarget().getLabel());
       return new ConfiguredAspect.Builder(ruleContext).build();
@@ -719,7 +720,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext ruleContext,
         AspectParameters parameters,
-        String toolsRepository) {
+        RepositoryName toolsRepository) {
       ruleContext.ruleError("Aspect error");
       return null;
     }
@@ -752,7 +753,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext context,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws InterruptedException, ActionConflictException {
       return new ConfiguredAspect.Builder(context).build();
     }
@@ -1023,7 +1024,7 @@
         ConfiguredTargetAndData ctadBase,
         RuleContext context,
         AspectParameters parameters,
-        String toolsRepository)
+        RepositoryName toolsRepository)
         throws InterruptedException, ActionConflictException {
       return ConfiguredAspect.builder(context)
           .addProvider(Provider.class, new Provider(ctadBase.getConfiguredTarget().getLabel()))
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/BUILD b/src/test/java/com/google/devtools/build/lib/bazel/rules/BUILD
index c0ed534..62f7a3e 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/BUILD
@@ -31,6 +31,7 @@
         "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment_class_set",
         "//src/main/java/com/google/devtools/build/lib/analysis:config/fragment_options",
         "//src/main/java/com/google/devtools/build/lib/bazel/rules",
+        "//src/main/java/com/google/devtools/build/lib/cmdline:cmdline-primitives",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/rules:core_rules",
         "//src/main/java/com/google/devtools/build/lib/rules:core_workspace_rules",
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java b/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
index 5e3020b..769b5ae 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProviderTest.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
 import com.google.devtools.build.lib.analysis.config.FragmentOptions;
 import com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider.StrictActionEnvOptions;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.rules.config.ConfigRules;
 import com.google.devtools.build.lib.rules.core.CoreRules;
@@ -71,7 +72,7 @@
 
   private static void checkModule(RuleSet top) {
     ConfiguredRuleClassProvider.Builder builder = new ConfiguredRuleClassProvider.Builder();
-    builder.setToolsRepository(BazelRuleClassProvider.TOOLS_REPOSITORY);
+    builder.setToolsRepository(RepositoryName.BAZEL_TOOLS);
     Set<RuleSet> result = new HashSet<>();
     result.add(BazelRuleClassProvider.BAZEL_SETUP);
     collectTransitiveClosure(result, top);
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
index 529c576..6c4cfa7 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockCcSupport.java
@@ -18,13 +18,10 @@
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
-import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
-import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.util.Crosstool.CcToolchainConfig;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.ExpansionException;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainVariables;
@@ -331,14 +328,8 @@
   public abstract String getMockCrosstoolPath();
 
   public static PackageIdentifier getMockCrosstoolsTop() {
-    try {
-      return PackageIdentifier.create(
-          RepositoryName.create(TestConstants.TOOLS_REPOSITORY),
-          PathFragment.create(TestConstants.MOCK_CC_CROSSTOOL_PATH));
-    } catch (LabelSyntaxException e) {
-      Verify.verify(false);
-      throw new AssertionError(e);
-    }
+    return PackageIdentifier.create(
+        TestConstants.TOOLS_REPOSITORY, PathFragment.create(TestConstants.MOCK_CC_CROSSTOOL_PATH));
   }
 
   protected String readCcToolchainConfigFile() throws IOException {
diff --git a/src/test/java/com/google/devtools/build/lib/query2/testutil/AbstractQueryTest.java b/src/test/java/com/google/devtools/build/lib/query2/testutil/AbstractQueryTest.java
index 9d0f1cb..c9b13a8 100644
--- a/src/test/java/com/google/devtools/build/lib/query2/testutil/AbstractQueryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/query2/testutil/AbstractQueryTest.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.analysis.util.DummyTestFragment;
 import com.google.devtools.build.lib.analysis.util.MockRule;
 import com.google.devtools.build.lib.analysis.util.TestAspects;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.events.Event;
 import com.google.devtools.build.lib.graph.Digraph;
 import com.google.devtools.build.lib.graph.DotOutputVisitor;
@@ -1063,7 +1064,7 @@
 
     // Works for implicit edges too.  This is for consistency with --output
     // xml, which exposes them too.
-    String toolsRepository = helper.getToolsRepository();
+    RepositoryName toolsRepository = helper.getToolsRepository();
     assertThat(eval("labels(\"$py_toolchain_type\", //k)"))
         .isEqualTo(eval(toolsRepository + "//tools/python:toolchain_type"));
 
@@ -2097,8 +2098,8 @@
       return evaluateQuery(query).results;
     }
 
-    default String getToolsRepository() {
-      return "";
+    default RepositoryName getToolsRepository() {
+      return RepositoryName.MAIN;
     }
 
     /**
diff --git a/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java b/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java
index c179864..8e49db3 100644
--- a/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java
+++ b/src/test/java/com/google/devtools/build/lib/query2/testutil/SkyframeQueryHelper.java
@@ -27,6 +27,7 @@
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.clock.BlazeClock;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.packages.ConstantRuleVisibility;
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.PackageFactory.EnvironmentExtension;
@@ -87,7 +88,7 @@
       new InMemoryFileSystem(BlazeClock.instance(), DigestHashFunction.SHA256);
   protected Path rootDirectory;
   protected BlazeDirectories directories;
-  private String toolsRepository;
+  private RepositoryName toolsRepository;
 
   protected AnalysisMock analysisMock;
   private QueryEnvironmentFactory queryEnvironmentFactory;
@@ -268,7 +269,7 @@
   }
 
   @Override
-  public String getToolsRepository() {
+  public RepositoryName getToolsRepository() {
     return toolsRepository;
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/AliasTest.java b/src/test/java/com/google/devtools/build/lib/rules/AliasTest.java
index 679061f..ece176a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/AliasTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/AliasTest.java
@@ -30,6 +30,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.License.LicenseType;
 import com.google.devtools.build.lib.packages.Provider;
@@ -411,7 +412,7 @@
 
   @Test
   public void testRedirectChasing() throws Exception {
-    String toolsRepository = ruleClassProvider.getToolsRepository();
+    RepositoryName toolsRepository = ruleClassProvider.getToolsRepository();
     scratch.file("a/BUILD",
         "alias(name='cc', actual='" + toolsRepository + "//tools/cpp:toolchain')",
         "cc_library(name='a', srcs=['a.cc'])");
diff --git a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java
index bfc8a07..19315ff 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/config/ConfigSettingTest.java
@@ -289,7 +289,7 @@
         String.format(
             "option 'nonselectable_allowlisted_option' cannot be used in a config_setting (it is "
                 + "allowlisted to %s//tools/... only)",
-            RepositoryName.create(TestConstants.TOOLS_REPOSITORY).getCanonicalForm()),
+            TestConstants.TOOLS_REPOSITORY.getCanonicalForm()),
         "config_setting(",
         "    name = 'badoption',",
         "    values = {",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryStarlarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryStarlarkApiTest.java
index 4c905f7..55b4b67 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryStarlarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryStarlarkApiTest.java
@@ -16,6 +16,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import java.io.IOException;
@@ -54,7 +55,7 @@
   @Before
   public final void setup() throws Exception  {
     scratch.file("test_starlark/BUILD");
-    String toolsRepo = TestConstants.TOOLS_REPOSITORY;
+    RepositoryName toolsRepo = TestConstants.TOOLS_REPOSITORY;
     String toolsLoc = toolsRepo + "//tools/objc";
 
     scratch.file(
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/BUILD b/src/test/java/com/google/devtools/build/lib/testutil/BUILD
index df88b12..b3c28bf 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/testutil/BUILD
@@ -185,6 +185,7 @@
         "TestConstants.java",
     ],
     deps = [
+        "//src/main/java/com/google/devtools/build/lib/cmdline:cmdline-primitives",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
         "//third_party:guava",
     ],
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
index 669db8f..c8381ac 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestConstants.java
@@ -17,6 +17,7 @@
 import static com.google.devtools.build.lib.rules.cpp.CppRuleClasses.CROSSTOOL_LABEL;
 
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 
 /**
  * Various constants required by the tests.
@@ -98,7 +99,7 @@
   public static final String MOCK_CC_CROSSTOOL_PATH = "tools/cpp";
 
   /** The workspace repository label under which built-in tools reside. */
-  public static final String TOOLS_REPOSITORY = "@bazel_tools";
+  public static final RepositoryName TOOLS_REPOSITORY = RepositoryName.BAZEL_TOOLS;
   /** The file path in which to create files so that they end up under {@link #TOOLS_REPOSITORY}. */
   public static final String TOOLS_REPOSITORY_SCRATCH = "embedded_tools/";
 
diff --git a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
index f81aad1..b0d8b4d 100644
--- a/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
+++ b/src/test/java/com/google/devtools/build/lib/testutil/TestRuleClassProvider.java
@@ -38,6 +38,7 @@
 import com.google.devtools.build.lib.analysis.config.CoreOptions;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
+import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.packages.RuleClass;
@@ -112,7 +113,7 @@
     // TODO(bazel-team): See also TrimmableTestConfigurationFragments#installFragmentsAndNativeRules
     // for alternative/additional setup. Consider factoring that one to use this method.
     builder
-        .setToolsRepository("@")
+        .setToolsRepository(RepositoryName.MAIN)
         .setRunfilesPrefix("test")
         .setPrerequisiteValidator(new MinimalPrerequisiteValidator());
     CoreRules.INSTANCE.init(builder);