RepoContext & PackageContext for Label constructors

RepoContext = RepositoryName + RepositoryMapping
PackageContext = PackageIdentifier + RepositoryMapping
               = RepositoryName + PathFragment + RepositoryMapping
               = RepoContext + PathFragment

Making these one object stresses the fact that they often need to be used together for correctness.

Work towards https://github.com/bazelbuild/bazel/issues/14852

PiperOrigin-RevId: 458437385
Change-Id: I68c0f61ebfcfbb2f5ff929d985bdfa0ac45a912a
diff --git a/src/main/java/com/google/devtools/build/lib/packages/LabelConverter.java b/src/main/java/com/google/devtools/build/lib/packages/LabelConverter.java
index cf3b7d7..1fef168 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/LabelConverter.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/LabelConverter.java
@@ -38,23 +38,24 @@
   public static LabelConverter forBzlEvaluatingThread(StarlarkThread thread) {
     BazelModuleContext moduleContext =
         BazelModuleContext.of(Module.ofInnermostEnclosingStarlarkFunction(thread));
-    return new LabelConverter(
-        moduleContext.label().getPackageIdentifier(), moduleContext.repoMapping());
+    return new LabelConverter(moduleContext.packageContext());
   }
 
-  private final PackageIdentifier base;
-  private final RepositoryMapping repositoryMapping;
+  private final Label.PackageContext packageContext;
   private final Map<String, Label> labelCache = new HashMap<>();
 
+  public LabelConverter(Label.PackageContext packageContext) {
+    this.packageContext = packageContext;
+  }
+
   /** Creates a label converter using the given base package and repo mapping. */
   public LabelConverter(PackageIdentifier base, RepositoryMapping repositoryMapping) {
-    this.base = base;
-    this.repositoryMapping = repositoryMapping;
+    this(Label.PackageContext.of(base, repositoryMapping));
   }
 
   /** Returns the base package identifier that relative labels will be resolved against. */
   PackageIdentifier getBasePackage() {
-    return base;
+    return packageContext.packageIdentifier();
   }
 
   /** Returns the Label corresponding to the input, using the current conversion context. */
@@ -65,7 +66,7 @@
     // label-strings across all their attribute values.
     Label converted = labelCache.get(input);
     if (converted == null) {
-      converted = Label.parseWithPackageContext(input, base, repositoryMapping);
+      converted = Label.parseWithPackageContext(input, packageContext);
       labelCache.put(input, converted);
     }
     return converted;
@@ -73,6 +74,6 @@
 
   @Override
   public String toString() {
-    return base.toString();
+    return getBasePackage().toString();
   }
 }