Set the workspace suffix for runfiles

This CL covers the "easy" cases.  Followup CLs will take care of couple dozen remaining gnarly ones.

--
MOS_MIGRATED_REVID=100479410
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
index ac83eca..0aa3f48 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/Runfiles.java
@@ -221,7 +221,7 @@
       NestedSet<SymlinkEntry> rootSymlinks,
       NestedSet<PruningManifest> pruningManifests,
       EmptyFilesSupplier emptyFilesSupplier) {
-    this.suffix = suffix == null ? Constants.DEFAULT_RUNFILES_PREFIX : suffix;
+    this.suffix = suffix.isEmpty() ? Constants.DEFAULT_RUNFILES_PREFIX : suffix;
     this.unconditionalArtifacts = Preconditions.checkNotNull(artifacts);
     this.symlinks = Preconditions.checkNotNull(symlinks);
     this.rootSymlinks = Preconditions.checkNotNull(rootSymlinks);
@@ -503,6 +503,17 @@
     private EmptyFilesSupplier emptyFilesSupplier = DUMMY_EMPTY_FILES_SUPPLIER;
 
     /**
+     * Only used for Runfiles.EMPTY.
+     */
+    public Builder() {
+      this.suffix = "";
+    }
+
+    public Builder(String suffix) {
+      this.suffix = suffix;
+    }
+
+    /**
      * Builds a new Runfiles object.
      */
     public Runfiles build() {
@@ -645,7 +656,6 @@
         Function<TransitiveInfoCollection, Runfiles> mapping) {
       Preconditions.checkNotNull(mapping);
       Preconditions.checkNotNull(ruleContext);
-      suffix = ruleContext.getWorkspaceName();
       addDataDeps(ruleContext);
       addNonDataDeps(ruleContext, mapping);
       return this;
@@ -660,7 +670,6 @@
         Function<TransitiveInfoCollection, Runfiles> mapping) {
       Preconditions.checkNotNull(ruleContext);
       Preconditions.checkNotNull(mapping);
-      suffix = ruleContext.getWorkspaceName();
       for (TransitiveInfoCollection dep : getNonDataDeps(ruleContext)) {
         Runfiles runfiles = mapping.apply(dep);
         if (runfiles != null) {
@@ -675,7 +684,6 @@
      * Collects runfiles from data dependencies of a target.
      */
     public Builder addDataDeps(RuleContext ruleContext) {
-      suffix = ruleContext.getWorkspaceName();
       addTargets(getPrerequisites(ruleContext, "data", Mode.DATA), RunfilesProvider.DATA_RUNFILES);
       return this;
     }
@@ -685,7 +693,6 @@
      */
     public Builder addNonDataDeps(RuleContext ruleContext,
         Function<TransitiveInfoCollection, Runfiles> mapping) {
-      suffix = ruleContext.getWorkspaceName();
       for (TransitiveInfoCollection target : getNonDataDeps(ruleContext)) {
         addTargetExceptFileTargets(target, mapping);
       }
@@ -757,15 +764,6 @@
     }
 
     /**
-     * Sets the directory name to put runfiles under. "" is the default and puts the runfiles
-     * immediately under the &lt;target&gt;.runfiles directory.
-     */
-    public Builder setSuffix(String workspaceName) {
-      suffix = workspaceName;
-      return this;
-    }
-
-    /**
      * Add the other {@link Runfiles} object transitively, with the option to include or exclude
      * pruning manifests in the merge.
      */
@@ -773,7 +771,7 @@
       artifactsBuilder.addTransitive(runfiles.getUnconditionalArtifacts());
       symlinksBuilder.addTransitive(runfiles.getSymlinks());
       rootSymlinksBuilder.addTransitive(runfiles.getRootSymlinks());
-      if (suffix == null) {
+      if (suffix.isEmpty()) {
         suffix = runfiles.suffix;
       }
       if (includePruningManifests) {