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);
}