Inject the default runfiles prefix from the rule class provider.

--
MOS_MIGRATED_REVID=102341264
diff --git a/src/main/java/com/google/devtools/build/lib/Constants.java b/src/main/java/com/google/devtools/build/lib/Constants.java
index 1925876..2db7d32 100644
--- a/src/main/java/com/google/devtools/build/lib/Constants.java
+++ b/src/main/java/com/google/devtools/build/lib/Constants.java
@@ -31,7 +31,6 @@
   public static final String MAIN_RULE_CLASS_PROVIDER =
       "com.google.devtools.build.lib.bazel.rules.BazelRuleClassProvider";
   public static final ImmutableList<String> IGNORED_TEST_WARNING_PREFIXES = ImmutableList.of();
-  public static final String DEFAULT_RUNFILES_PREFIX = "";
 
   public static final String NATIVE_DEPS_LIB_SUFFIX = "_nativedeps";
 
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 8f048f7..18d605d 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
@@ -80,6 +80,7 @@
   public static class Builder implements RuleDefinitionEnvironment {
     private final StringBuilder defaultWorkspaceFile = new StringBuilder();
     private PathFragment preludePath;
+    private String runfilesPrefix;
     private final List<ConfigurationFragmentFactory> configurationFragments = new ArrayList<>();
     private final List<BuildInfoFactory> buildInfoFactories = new ArrayList<>();
     private final List<Class<? extends FragmentOptions>> configurationOptions = new ArrayList<>();
@@ -110,6 +111,11 @@
       return this;
     }
 
+    public Builder setRunfilesPrefix(String runfilesPrefix) {
+      this.runfilesPrefix = runfilesPrefix;
+      return this;
+    }
+
     public Builder setPrerequisiteValidator(PrerequisiteValidator prerequisiteValidator) {
       this.prerequisiteValidator = prerequisiteValidator;
       return this;
@@ -219,6 +225,7 @@
 
       return new ConfiguredRuleClassProvider(
           preludePath,
+          runfilesPrefix,
           ImmutableMap.copyOf(ruleClassMap),
           ImmutableMap.copyOf(ruleDefinitionMap),
           ImmutableMap.copyOf(aspectFactoryMap),
@@ -265,6 +272,11 @@
   private final PathFragment preludePath;
 
   /**
+   * The default runfiles prefix.
+   */
+  private final String runfilesPrefix;
+
+  /**
    * Maps rule class name to the metaclass instance for that rule.
    */
   private final ImmutableMap<String, RuleClass> ruleClassMap;
@@ -304,6 +316,7 @@
 
   public ConfiguredRuleClassProvider(
       PathFragment preludePath,
+      String runfilesPrefix,
       ImmutableMap<String, RuleClass> ruleClassMap,
       ImmutableMap<String, Class<? extends RuleDefinition>> ruleDefinitionMap,
       ImmutableMap<String, Class<? extends AspectFactory<?, ?, ?>>> aspectFactoryMap,
@@ -315,6 +328,7 @@
       PrerequisiteValidator prerequisiteValidator,
       ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses) {
     this.preludePath = preludePath;
+    this.runfilesPrefix = runfilesPrefix;
     this.ruleClassMap = ruleClassMap;
     this.ruleDefinitionMap = ruleDefinitionMap;
     this.aspectFactoryMap = aspectFactoryMap;
@@ -340,6 +354,11 @@
   }
 
   @Override
+  public String getRunfilesPrefix() {
+    return runfilesPrefix;
+  }
+
+  @Override
   public Map<String, RuleClass> getRuleClassMap() {
     return ruleClassMap;
   }
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 2133bd5..605a15d 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
@@ -227,6 +227,7 @@
         .addBuildInfoFactory(new ObjcBuildInfoFactory())
         .setConfigurationCollectionFactory(new BazelConfigurationCollection())
         .setPrelude("tools/build_rules/prelude_bazel")
+        .setRunfilesPrefix("")
         .setPrerequisiteValidator(new BazelPrerequisiteValidator());
 
     for (Class<? extends FragmentOptions> fragmentOptions : BUILD_OPTIONS) {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
index 2e429ff..fda1a83 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ExternalPackage.java
@@ -41,8 +41,8 @@
 
   private Map<RepositoryName, Rule> repositoryMap;
 
-  ExternalPackage() {
-    super(PACKAGE_IDENTIFIER);
+  ExternalPackage(String runfilesPrefix) {
+    super(PACKAGE_IDENTIFIER, runfilesPrefix);
   }
 
   /**
@@ -59,8 +59,8 @@
   public static class Builder extends Package.Builder {
     private Map<RepositoryName, Rule> repositoryMap = Maps.newLinkedHashMap();
 
-    public Builder(Path workspacePath) {
-      super(new ExternalPackage());
+    public Builder(Path workspacePath, String runfilesPrefix) {
+      super(new ExternalPackage(runfilesPrefix));
       setFilename(workspacePath);
       setMakeEnv(new MakeEnvironment.Builder());
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java
index 92a24fb..2a6945c 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Package.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java
@@ -24,7 +24,6 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.google.devtools.build.lib.Constants;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.collect.CollectionUtils;
 import com.google.devtools.build.lib.collect.ImmutableSortedKeyMap;
@@ -107,7 +106,7 @@
    * The name of the workspace this package is in. Used as a prefix for the runfiles directory.
    * This can be set in the WORKSPACE file. This must be a valid target name.
    */
-  protected String workspaceName = Constants.DEFAULT_RUNFILES_PREFIX;
+  protected String workspaceName;
 
   /**
    * The root of the source tree in which this package was found. It is an invariant that
@@ -226,8 +225,9 @@
    * @precondition {@code name} must be a suffix of
    * {@code filename.getParentDirectory())}.
    */
-  protected Package(PackageIdentifier packageId) {
+  protected Package(PackageIdentifier packageId, String runfilesPrefix) {
     this.packageIdentifier = packageId;
+    this.workspaceName = runfilesPrefix;
     this.nameFragment = Canonicalizer.fragments().intern(packageId.getPackageFragment());
     this.name = nameFragment.getPathString();
   }
@@ -723,11 +723,10 @@
    * <p>Despite its name, this is the normal builder used when parsing BUILD files.
    */
   public static class LegacyBuilder extends Builder {
-
     private Globber globber = null;
 
-    LegacyBuilder(PackageIdentifier packageId) {
-      super(packageId);
+    LegacyBuilder(PackageIdentifier packageId, String runfilesPrefix) {
+      super(packageId, runfilesPrefix);
     }
 
     /**
@@ -761,8 +760,8 @@
   }
 
   static class Builder {
-    protected static Package newPackage(PackageIdentifier packageId) {
-      return new Package(packageId);
+    protected static Package newPackage(PackageIdentifier packageId, String runfilesPrefix) {
+      return new Package(packageId, runfilesPrefix);
     }
 
     /**
@@ -826,8 +825,8 @@
       }
     }
 
-    Builder(PackageIdentifier id) {
-      this(newPackage(id));
+    Builder(PackageIdentifier id, String runfilesPrefix) {
+      this(newPackage(id, runfilesPrefix));
     }
 
     protected PackageIdentifier getPackageIdentifier() {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index ad335aa..e0ee192 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -482,7 +482,8 @@
     Package.Builder builder;
     try {
       builder = new Package.Builder(
-          new PackageIdentifier(packagePb.getRepository(), new PathFragment(packagePb.getName())));
+          new PackageIdentifier(packagePb.getRepository(), new PathFragment(packagePb.getName())),
+          null);
     } catch (TargetParsingException e) {
       throw new PackageDeserializationException(e);
     }
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
index 2122d42..ffea0bd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageFactory.java
@@ -1055,7 +1055,8 @@
     Preprocessor.Result preprocessingResult =
         preprocess(packageId, buildFile, inputSource, globber, localReporter);
     ExternalPackage externalPkg =
-        new ExternalPackage.Builder(buildFile.getRelative("WORKSPACE")).build();
+        new ExternalPackage.Builder(
+            buildFile.getRelative("WORKSPACE"), ruleClassProvider.getRunfilesPrefix()).build();
 
     Package result =
         createPackageFromPreprocessingResult(
@@ -1261,7 +1262,8 @@
     Environment pkgEnv = new Environment(globalEnv, eventHandler);
     pkgEnv.setLoadingPhase();
 
-    Package.LegacyBuilder pkgBuilder = new Package.LegacyBuilder(packageId);
+    Package.LegacyBuilder pkgBuilder = new Package.LegacyBuilder(
+        packageId, ruleClassProvider.getRunfilesPrefix());
 
     pkgBuilder.setGlobber(globber)
         .setFilename(buildFilePath)
@@ -1331,7 +1333,8 @@
     Environment pkgEnv = new Environment();
     pkgEnv.setLoadingPhase();
 
-    Package.LegacyBuilder pkgBuilder = new Package.LegacyBuilder(packageId);
+    Package.LegacyBuilder pkgBuilder = new Package.LegacyBuilder(packageId,
+        ruleClassProvider.getRunfilesPrefix());
 
     pkgBuilder.setFilename(buildFilePath)
         .setMakeEnv(pkgMakeEnv)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index d153fa1..958d88a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -32,6 +32,11 @@
   PathFragment getPreludePath();
 
   /**
+   * The default runfiles prefix (may be overwritten by the WORKSPACE file).
+   */
+  String getRunfilesPrefix();
+
+  /**
    * Returns a map from rule names to rule class objects.
    */
   Map<String, RuleClass> getRuleClassMap();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
index 945ce42..30f0c6a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunction.java
@@ -60,7 +60,8 @@
     }
 
     Path repoWorkspace = workspaceRoot.getRoot().getRelative(workspaceRoot.getRelativePath());
-    Builder builder = new Builder(repoWorkspace);
+    Builder builder = new Builder(repoWorkspace,
+        packageFactory.getRuleClassProvider().getRunfilesPrefix());
     WorkspaceFactory parser = new WorkspaceFactory(
         builder, packageFactory.getRuleClassProvider(), installDir.getPathString());
     parser.parse(ParserInputSource.create(
diff --git a/src/main/java/com/google/devtools/build/workspace/Resolver.java b/src/main/java/com/google/devtools/build/workspace/Resolver.java
index 3527d1c..2fd1ffe 100644
--- a/src/main/java/com/google/devtools/build/workspace/Resolver.java
+++ b/src/main/java/com/google/devtools/build/workspace/Resolver.java
@@ -67,7 +67,8 @@
    */
   public ExternalPackage parse(Path workspacePath) {
     resolver.addHeader(workspacePath.getPathString());
-    ExternalPackage.Builder builder = new ExternalPackage.Builder(workspacePath);
+    ExternalPackage.Builder builder = new ExternalPackage.Builder(workspacePath,
+        ruleClassProvider.getRunfilesPrefix());
     WorkspaceFactory parser = new WorkspaceFactory(builder, ruleClassProvider);
     try {
       parser.parse(ParserInputSource.create(workspacePath));
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index 8b1a198..8923373 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -205,7 +205,7 @@
   }
 
   private Package.Builder createDummyPackageBuilder() {
-    return new Builder(PackageIdentifier.createInDefaultRepo(TEST_PACKAGE_NAME))
+    return new Builder(PackageIdentifier.createInDefaultRepo(TEST_PACKAGE_NAME), "TESTING")
         .setFilename(testBuildfilePath)
         .setMakeEnv(new MakeEnvironment.Builder());
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
index 84c401d..24ac455 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/PackageFactoryApparatus.java
@@ -129,8 +129,8 @@
     GlobCache globCache = new GlobCache(
         buildFile.getParentDirectory(), packageId, locator, null, TestUtils.getPool());
     LegacyGlobber globber = new LegacyGlobber(globCache);
-    ExternalPackage externalPkg = (new ExternalPackage.Builder(
-        buildFile.getParentDirectory().getRelative("WORKSPACE"))).build();
+    ExternalPackage externalPkg = new ExternalPackage.Builder(
+        buildFile.getParentDirectory().getRelative("WORKSPACE"), "TESTING").build();
     LegacyBuilder resultBuilder = factory.evaluateBuildFile(
         externalPkg, packageId, buildFileAST, buildFile,
         globber, ImmutableList.<Event>of(), ConstantRuleVisibility.PUBLIC, false, false,