Add a PackageArgs class in preparation for REPO.bazel
- Created a PackageArgs class that stores the values passed to the attrs of the `package()` function, so that they can be applied to a package builder in one go
- These attr values used to be applied as soon as each attr is processed (i.e. evaluated). We can't do that anymore for repo(), since at the time of REPO.bazel evaluation, the package hasn't started being built yet.
- Instead of storing the individual fields, Package now just holds on to a PackageArgs object.
- In a follow-up CL, we store all the repo() values in a PackageArgs class, and apply those before the package() ones.
- Also removed `Package#isDefaultVisibilitySet` as nobody calls it anymore.
Work towards https://github.com/bazelbuild/bazel/issues/18077
PiperOrigin-RevId: 539728608
Change-Id: Ie4a081fa0e52e833ac2a6be50033f95728da3a9b
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageCallable.java b/src/main/java/com/google/devtools/build/lib/packages/PackageCallable.java
index 3f8db53..3fae8da 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageCallable.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageCallable.java
@@ -14,18 +14,12 @@
package com.google.devtools.build.lib.packages;
-import com.google.devtools.build.lib.cmdline.Label;
-import com.google.devtools.build.lib.packages.License.DistributionType;
-import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code;
-import java.util.List;
import java.util.Map;
-import java.util.Set;
import net.starlark.java.annot.Param;
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Starlark;
import net.starlark.java.eval.StarlarkThread;
-import net.starlark.java.syntax.Location;
/**
* Utility class encapsulating the standard definition of the {@code package()} function of BUILD
@@ -54,12 +48,13 @@
throw new EvalException("at least one argument must be given to the 'package' function");
}
- Location loc = thread.getCallerLocation();
+ PackageArgs.Builder pkgArgsBuilder = PackageArgs.builder();
for (Map.Entry<String, Object> kwarg : kwargs.entrySet()) {
String name = kwarg.getKey();
Object rawValue = kwarg.getValue();
- processParam(name, rawValue, pkgBuilder, loc);
+ processParam(name, rawValue, pkgBuilder, pkgArgsBuilder);
}
+ pkgBuilder.mergePackageArgsFrom(pkgArgsBuilder);
return Starlark.NONE;
}
@@ -68,70 +63,13 @@
* back on the super method when the parameter does not match.
*/
protected void processParam(
- String name, Object rawValue, Package.Builder pkgBuilder, Location loc) throws EvalException {
- if (name.equals("default_visibility")) {
- List<Label> value = convert(BuildType.LABEL_LIST, rawValue, pkgBuilder);
- pkgBuilder.setDefaultVisibility(RuleVisibility.parse(value));
-
- } else if (name.equals("default_testonly")) {
- Boolean value = convert(Type.BOOLEAN, rawValue, pkgBuilder);
- pkgBuilder.setDefaultTestonly(value);
-
- } else if (name.equals("default_deprecation")) {
- String value = convert(Type.STRING, rawValue, pkgBuilder);
- pkgBuilder.setDefaultDeprecation(value);
-
- } else if (name.equals("features")) {
- List<String> value = convert(Type.STRING_LIST, rawValue, pkgBuilder);
- pkgBuilder.addFeatures(value);
-
- } else if (name.equals("licenses")) {
- License value = convert(BuildType.LICENSE, rawValue, pkgBuilder);
- pkgBuilder.setDefaultLicense(value);
-
- } else if (name.equals("distribs")) {
- Set<DistributionType> value = convert(BuildType.DISTRIBUTIONS, rawValue, pkgBuilder);
- pkgBuilder.setDefaultDistribs(value);
-
- } else if (name.equals("default_compatible_with")) {
- List<Label> value = convert(BuildType.LABEL_LIST, rawValue, pkgBuilder);
- pkgBuilder.setDefaultCompatibleWith(value, name, loc);
-
- } else if (name.equals("default_restricted_to")) {
- List<Label> value = convert(BuildType.LABEL_LIST, rawValue, pkgBuilder);
- pkgBuilder.setDefaultRestrictedTo(value, name, loc);
-
- } else if (name.equals("default_applicable_licenses")) {
- List<Label> value = convert(BuildType.LABEL_LIST, rawValue, pkgBuilder);
- if (!pkgBuilder.getDefaultPackageMetadata().isEmpty()) {
- pkgBuilder.addEvent(
- Package.error(
- loc,
- "Can not set both default_package_metadata and default_applicable_licenses."
- + " Move all declarations to default_package_metadata.",
- Code.INVALID_PACKAGE_SPECIFICATION));
- }
- pkgBuilder.setDefaultPackageMetadata(value, name, loc);
-
- } else if (name.equals("default_package_metadata")) {
- List<Label> value = convert(BuildType.LABEL_LIST, rawValue, pkgBuilder);
- if (!pkgBuilder.getDefaultPackageMetadata().isEmpty()) {
- pkgBuilder.addEvent(
- Package.error(
- loc,
- "Can not set both default_package_metadata and default_applicable_licenses."
- + " Move all declarations to default_package_metadata.",
- Code.INVALID_PACKAGE_SPECIFICATION));
- }
- pkgBuilder.setDefaultPackageMetadata(value, name, loc);
-
- } else {
- throw Starlark.errorf("unexpected keyword argument: %s", name);
- }
- }
-
- protected static <T> T convert(Type<T> type, Object value, Package.Builder pkgBuilder)
+ String name, Object rawValue, Package.Builder pkgBuilder, PackageArgs.Builder pkgArgsBuilder)
throws EvalException {
- return type.convert(value, "'package' argument", pkgBuilder.getLabelConverter());
+ PackageArgs.processParam(
+ name,
+ rawValue,
+ "package() argument '" + name + "'",
+ pkgBuilder.getLabelConverter(),
+ pkgArgsBuilder);
}
}