Add a hook to Package.Builder.Helper that gets called by PackageFunction after the Package is fully loaded.

--
MOS_MIGRATED_REVID=124260910
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 cbfeb5b..44d9e30 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
@@ -691,14 +691,23 @@
     return b;
   }
 
-  /** A builder for {@link Package} objects. Only intended to be used by {@link PackageFactory}. */
+  /**
+   * A builder for {@link Package} objects. Only intended to be used by {@link PackageFactory} and
+   * {@link com.google.devtools.build.lib.skyframe.PackageFunction}.
+   */
   public static class Builder {
     public static interface Helper {
       /**
        * Returns a fresh {@link Package} instance that a {@link Builder} will internally mutate
-       * during package loading.
+       * during package loading. Called by {@link PackageFactory}.
        */
       Package createFreshPackage(PackageIdentifier packageId, String runfilesPrefix);
+
+      /**
+       * Called after {@link com.google.devtools.build.lib.skyframe.PackageFunction} is completely
+       * done loading the given {@link Package}.
+       */
+      void onLoadingComplete(Package pkg);
     }
 
     /** {@link Helper} that simply calls the {@link Package} constructor. */
@@ -712,6 +721,10 @@
       public Package createFreshPackage(PackageIdentifier packageId, String runfilesPrefix) {
         return new Package(packageId, runfilesPrefix);
       }
+
+      @Override
+      public void onLoadingComplete(Package pkg) {
+      }
     }
 
     /**
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 5a37b9d..5a20efc 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
@@ -1519,6 +1519,14 @@
   }
 
   /**
+   * Called by a caller of {@link #createPackageFromPreprocessingAst} after this caller has fully
+   * loaded the package.
+   */
+  public void afterDoneLoadingPackage(Package pkg) {
+    packageBuilderHelper.onLoadingComplete(pkg);
+  }
+
+  /**
    * Constructs a Package instance, evaluates the BUILD-file AST inside the
    * build environment, and populates the package with Rule instances as it
    * goes.  As with most programming languages, evaluation stops when an
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
index 743cff5..b6e5d45 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeModule.java
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.packages.PackageFactory;
 import com.google.devtools.build.lib.packages.Preprocessor;
 import com.google.devtools.build.lib.packages.RuleClass;
+import com.google.devtools.build.lib.packages.RuleClassProvider;
 import com.google.devtools.build.lib.query2.AbstractBlazeQueryEnvironment;
 import com.google.devtools.build.lib.query2.QueryEnvironmentFactory;
 import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryFunction;
@@ -344,10 +345,11 @@
 
   /**
    * Returns a helper that the {@link PackageFactory} will use during package loading. If the module
-   * does not provide any heloer, it should return null. Note that only one helper per Bazel/Blaze
+   * does not provide any helper, it should return null. Note that only one helper per Bazel/Blaze
    * runtime is allowed.
    */
-  public Package.Builder.Helper getPackageBuilderHelper() {
+  public Package.Builder.Helper getPackageBuilderHelper(RuleClassProvider ruleClassProvider,
+      FileSystem fs) {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
index 3a51bb7..4e9de80 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeRuntime.java
@@ -1262,7 +1262,8 @@
 
       Package.Builder.Helper packageBuilderHelper = null;
       for (BlazeModule module : blazeModules) {
-        Package.Builder.Helper candidateHelper = module.getPackageBuilderHelper();
+        Package.Builder.Helper candidateHelper =
+            module.getPackageBuilderHelper(ruleClassProvider, directories.getFileSystem());
         if (candidateHelper != null) {
           Preconditions.checkState(packageBuilderHelper == null,
               "more than one module defines a package builder helper");
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index cb0d288..7f4219a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -383,6 +383,7 @@
     Package pkg = workspace.getPackage();
     Event.replayEventsOn(env.getListener(), pkg.getEvents());
 
+    packageFactory.afterDoneLoadingPackage(pkg);
     return new PackageValue(pkg);
   }
 
@@ -539,6 +540,7 @@
     // We know this SkyFunction will not be called again, so we can remove the cache entry.
     packageFunctionCache.invalidate(packageId);
 
+    packageFactory.afterDoneLoadingPackage(pkg);
     return new PackageValue(pkg);
   }