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