aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClass.java151
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java7
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java5
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java6
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java6
12 files changed, 117 insertions, 109 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java
index 8f6d2b5e66..6463077887 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java
@@ -20,10 +20,10 @@ import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTr
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleTransitionFactory;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-/**
- * A {@link RuleTransitionFactory} that composes other {@link RuleTransitionFactory}s.
- */
+/** A {@link RuleTransitionFactory} that composes other {@link RuleTransitionFactory}s. */
+@AutoCodec
public class ComposingRuleTransitionFactory implements RuleTransitionFactory {
private final RuleTransitionFactory rtf1;
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index c45ec3c66d..e6e6e9c637 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -556,7 +556,8 @@ public class SkylarkRuleClassFunctions {
RuleClassType type = test ? RuleClassType.TEST : RuleClassType.NORMAL;
RuleClass parent =
test
- ? getTestBaseRule(SkylarkUtils.getToolsRepository(funcallEnv),
+ ? getTestBaseRule(
+ SkylarkUtils.getToolsRepository(funcallEnv),
(PatchTransition) SkylarkUtils.getLipoDataTransition(funcallEnv))
: (executable ? binaryBaseRule : baseRule);
@@ -609,7 +610,9 @@ public class SkylarkRuleClassFunctions {
.requiresHostConfigurationFragmentsBySkylarkModuleName(
hostFragments.getContents(String.class, "host_fragments"));
builder.setConfiguredTargetFunction(implementation);
- builder.setRuleDefinitionEnvironment(funcallEnv);
+ builder.setRuleDefinitionEnvironmentLabelAndHashCode(
+ funcallEnv.getGlobals().getTransitiveLabel(),
+ funcallEnv.getTransitiveContentHashCode());
builder.addRequiredToolchains(collectToolchainLabels(toolchains, ast));
return new SkylarkRuleFunction(builder, type, attributes, ast.getLocation());
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
index ebb131cd36..678188560e 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
@@ -126,8 +126,8 @@ public class SkylarkRepositoryModule {
Builder builder = new Builder("", RuleClassType.WORKSPACE, true);
builder.addOrOverrideAttribute(attr("$local", BOOLEAN).defaultValue(local).build());
- builder.addOrOverrideAttribute(attr("$environ", STRING_LIST)
- .defaultValue(environ).build());
+ builder.addOrOverrideAttribute(
+ attr("$environ", STRING_LIST).defaultValue(environ).build());
BaseRuleClasses.nameAttribute(builder);
BaseRuleClasses.commonCoreAndSkylarkAttributes(builder);
builder.add(attr("expect_failure", STRING));
@@ -141,7 +141,9 @@ public class SkylarkRepositoryModule {
}
}
builder.setConfiguredTargetFunction(implementation);
- builder.setRuleDefinitionEnvironment(funcallEnv);
+ builder.setRuleDefinitionEnvironmentLabelAndHashCode(
+ funcallEnv.getGlobals().getTransitiveLabel(),
+ funcallEnv.getTransitiveContentHashCode());
builder.setWorkspaceOnly();
return new RepositoryRuleFunction(builder);
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index 81dfd14e22..0147fd1be6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -29,6 +29,7 @@ import com.google.common.escape.Escapers;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Runtime;
@@ -75,9 +76,8 @@ public abstract class ImplicitOutputsFunction {
}
}
- /**
- * Implicit output functions executing Skylark code.
- */
+ /** Implicit output functions executing Skylark code. */
+ @AutoCodec
public static final class SkylarkImplicitOutputsFunctionWithCallback
extends SkylarkImplicitOutputsFunction {
@@ -138,9 +138,8 @@ public abstract class ImplicitOutputsFunction {
}
}
- /**
- * Implicit output functions using a simple an output map.
- */
+ /** Implicit output functions using a simple an output map. */
+ @AutoCodec
public static final class SkylarkImplicitOutputsFunctionWithMap
extends SkylarkImplicitOutputsFunction {
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index ebb6f12bb3..4795e615e1 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -47,7 +47,6 @@ import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
import com.google.devtools.build.lib.syntax.Argument;
import com.google.devtools.build.lib.syntax.BaseFunction;
-import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.FuncallExpression;
import com.google.devtools.build.lib.syntax.GlobList;
@@ -78,42 +77,47 @@ import javax.annotation.concurrent.Immutable;
* Instances of RuleClass encapsulate the set of attributes of a given "class" of rule, such as
* <code>cc_binary</code>.
*
- * <p>This is an instance of the "meta-class" pattern for Rules: we achieve using <i>values</i>
- * what subclasses achieve using <i>types</i>. (The "Design Patterns" book doesn't include this
- * pattern, so think of it as something like a cross between a Flyweight and a State pattern. Like
- * Flyweight, we avoid repeatedly storing data that belongs to many instances. Like State, we
- * delegate from Rule to RuleClass for the specific behavior of that rule (though unlike state, a
- * Rule object never changes its RuleClass). This avoids the need to declare one Java class per
- * class of Rule, yet achieves the same behavior.)
+ * <p>This is an instance of the "meta-class" pattern for Rules: we achieve using <i>values</i> what
+ * subclasses achieve using <i>types</i>. (The "Design Patterns" book doesn't include this pattern,
+ * so think of it as something like a cross between a Flyweight and a State pattern. Like Flyweight,
+ * we avoid repeatedly storing data that belongs to many instances. Like State, we delegate from
+ * Rule to RuleClass for the specific behavior of that rule (though unlike state, a Rule object
+ * never changes its RuleClass). This avoids the need to declare one Java class per class of Rule,
+ * yet achieves the same behavior.)
*
* <p>The use of a metaclass also allows us to compute a mapping from Attributes to small integers
- * and share this between all rules of the same metaclass. This means we can save the attribute
+ * and share this between all rules of the same metaclass. This means we can save the attribute
* dictionary for each rule instance using an array, which is much more compact than a hashtable.
*
* <p>Rule classes whose names start with "$" are considered "abstract"; since they are not valid
* identifiers, they cannot be named in the build language. However, they are useful for grouping
* related attributes which are inherited.
*
- * <p>The exact values in this class are important. In particular:
+ * <p>The exact values in this class are important. In particular:
+ *
* <ul>
- * <li>Changing an attribute from MANDATORY to OPTIONAL creates the potential for null-pointer
- * exceptions in code that expects a value.
- * <li>Attributes whose names are preceded by a "$" or a ":" are "hidden", and cannot be redefined
- * in a BUILD file. They are a useful way of adding a special dependency. By convention,
- * attributes starting with "$" are implicit dependencies, and those starting with a ":" are
- * late-bound implicit dependencies, i.e. dependencies that can only be resolved when the
- * configuration is known.
- * <li>Attributes should not be introduced into the hierarchy higher then necessary.
- * <li>The 'deps' and 'data' attributes are treated specially by the code that builds the runfiles
- * tree. All targets appearing in these attributes appears beneath the ".runfiles" tree; in
- * addition, "deps" may have rule-specific semantics.
+ * <li>Changing an attribute from MANDATORY to OPTIONAL creates the potential for null-pointer
+ * exceptions in code that expects a value.
+ * <li>Attributes whose names are preceded by a "$" or a ":" are "hidden", and cannot be redefined
+ * in a BUILD file. They are a useful way of adding a special dependency. By convention,
+ * attributes starting with "$" are implicit dependencies, and those starting with a ":" are
+ * late-bound implicit dependencies, i.e. dependencies that can only be resolved when the
+ * configuration is known.
+ * <li>Attributes should not be introduced into the hierarchy higher then necessary.
+ * <li>The 'deps' and 'data' attributes are treated specially by the code that builds the runfiles
+ * tree. All targets appearing in these attributes appears beneath the ".runfiles" tree; in
+ * addition, "deps" may have rule-specific semantics.
* </ul>
*/
// Non-final only for mocking in tests. Do not subclass!
@Immutable
+@AutoCodec
public class RuleClass {
+ @AutoCodec
static final Function<? super Rule, Map<String, Label>> NO_EXTERNAL_BINDINGS =
Functions.<Map<String, Label>>constant(ImmutableMap.<String, Label>of());
+
+ @AutoCodec
static final Function<? super Rule, Set<String>> NO_OPTION_REFERENCE =
Functions.<Set<String>>constant(ImmutableSet.<String>of());
@@ -545,13 +549,14 @@ public class RuleClass {
}
}
- /**
- * A RuleTransitionFactory which always returns the same transition.
- */
- private static final class FixedTransitionFactory implements RuleTransitionFactory {
+ /** A RuleTransitionFactory which always returns the same transition. */
+ @AutoCodec.VisibleForSerialization
+ @AutoCodec
+ static final class FixedTransitionFactory implements RuleTransitionFactory {
private final ConfigurationTransition transition;
- private FixedTransitionFactory(ConfigurationTransition transition) {
+ @AutoCodec.VisibleForSerialization
+ FixedTransitionFactory(ConfigurationTransition transition) {
this.transition = transition;
}
@@ -597,7 +602,9 @@ public class RuleClass {
NO_EXTERNAL_BINDINGS;
private Function<? super Rule, ? extends Set<String>> optionReferenceFunction =
NO_OPTION_REFERENCE;
- @Nullable private Environment ruleDefinitionEnvironment = null;
+ /** This field and the next are null iff the rule is native. */
+ @Nullable private Label ruleDefinitionEnvironmentLabel;
+
@Nullable private String ruleDefinitionEnvironmentHashCode = null;
private ConfigurationFragmentPolicy.Builder configurationFragmentPolicy =
new ConfigurationFragmentPolicy.Builder();
@@ -681,8 +688,6 @@ public class RuleClass {
Preconditions.checkArgument(this.name.isEmpty() || this.name.equals(name));
type.checkName(name);
type.checkAttributes(attributes);
- boolean skylarkExecutable =
- skylark && (type == RuleClassType.NORMAL || type == RuleClassType.TEST);
Preconditions.checkState(
(type == RuleClassType.ABSTRACT)
== (configuredTargetFactory == null && configuredTargetFunction == null),
@@ -692,8 +697,10 @@ public class RuleClass {
configuredTargetFactory,
configuredTargetFunction);
if (!workspaceOnly) {
- Preconditions.checkState(skylarkExecutable == (configuredTargetFunction != null));
- Preconditions.checkState(skylarkExecutable == (ruleDefinitionEnvironment != null));
+ if (skylark) {
+ assertSkylarkRuleClassHasImplementationFunction();
+ assertSkylarkRuleClassHasEnvironmentLabel();
+ }
Preconditions.checkState(externalBindingsFunction == NO_EXTERNAL_BINDINGS);
}
if (type == RuleClassType.PLACEHOLDER) {
@@ -704,7 +711,6 @@ public class RuleClass {
key,
type,
skylark,
- skylarkExecutable,
skylarkTestable,
documented,
publicByDefault,
@@ -721,13 +727,33 @@ public class RuleClass {
configuredTargetFunction,
externalBindingsFunction,
optionReferenceFunction,
- ruleDefinitionEnvironment,
+ ruleDefinitionEnvironmentLabel,
ruleDefinitionEnvironmentHashCode,
configurationFragmentPolicy.build(),
supportsConstraintChecking,
requiredToolchains,
supportsPlatforms,
- attributes.values().toArray(new Attribute[0]));
+ attributes.values());
+ }
+
+ private void assertSkylarkRuleClassHasImplementationFunction() {
+ Preconditions.checkState(
+ (type == RuleClassType.NORMAL || type == RuleClassType.TEST)
+ == (configuredTargetFunction != null),
+ "%s %s",
+ type,
+ configuredTargetFunction);
+ }
+
+ private void assertSkylarkRuleClassHasEnvironmentLabel() {
+ Preconditions.checkState(
+ (type == RuleClassType.NORMAL
+ || type == RuleClassType.TEST
+ || type == RuleClassType.PLACEHOLDER)
+ == (ruleDefinitionEnvironmentLabel != null),
+ "Concrete Skylark rule classes can't have null labels: %s %s",
+ ruleDefinitionEnvironmentLabel,
+ type);
}
/**
@@ -1027,18 +1053,9 @@ public class RuleClass {
return this;
}
- /** Sets the rule definition environment. Meant for Skylark usage. */
- public Builder setRuleDefinitionEnvironment(Environment env) {
- this.ruleDefinitionEnvironment = Preconditions.checkNotNull(env, this.name);
- this.ruleDefinitionEnvironmentHashCode =
- this.ruleDefinitionEnvironment.getTransitiveContentHashCode();
- return this;
- }
-
- /** Sets the rule definition environment hash code for deserialized rule classes. */
- Builder setRuleDefinitionEnvironmentHashCode(String hashCode) {
- Preconditions.checkState(ruleDefinitionEnvironment == null, ruleDefinitionEnvironment);
- Preconditions.checkState(type == RuleClassType.PLACEHOLDER, type);
+ /** Sets the rule definition environment label and hash code. Meant for Skylark usage. */
+ public Builder setRuleDefinitionEnvironmentLabelAndHashCode(Label label, String hashCode) {
+ this.ruleDefinitionEnvironmentLabel = Preconditions.checkNotNull(label, this.name);
this.ruleDefinitionEnvironmentHashCode = Preconditions.checkNotNull(hashCode, this.name);
return this;
}
@@ -1175,7 +1192,6 @@ public class RuleClass {
private final RuleClassType type;
private final boolean isSkylark;
- private final boolean skylarkExecutable;
private final boolean skylarkTestable;
private final boolean documented;
private final boolean publicByDefault;
@@ -1245,10 +1261,11 @@ public class RuleClass {
private final Function<? super Rule, ? extends Set<String>> optionReferenceFunction;
/**
- * The Skylark rule definition environment of this RuleClass.
- * Null for non Skylark executable RuleClasses.
+ * The Skylark rule definition environment's label and hash code of this RuleClass. Null for non
+ * Skylark executable RuleClasses.
*/
- @Nullable private final Environment ruleDefinitionEnvironment;
+ @Nullable private final Label ruleDefinitionEnvironmentLabel;
+
@Nullable private final String ruleDefinitionEnvironmentHashCode;
/**
@@ -1292,7 +1309,6 @@ public class RuleClass {
String key,
RuleClassType type,
boolean isSkylark,
- boolean skylarkExecutable,
boolean skylarkTestable,
boolean documented,
boolean publicByDefault,
@@ -1309,19 +1325,18 @@ public class RuleClass {
@Nullable BaseFunction configuredTargetFunction,
Function<? super Rule, Map<String, Label>> externalBindingsFunction,
Function<? super Rule, ? extends Set<String>> optionReferenceFunction,
- @Nullable Environment ruleDefinitionEnvironment,
+ @Nullable Label ruleDefinitionEnvironmentLabel,
String ruleDefinitionEnvironmentHashCode,
ConfigurationFragmentPolicy configurationFragmentPolicy,
boolean supportsConstraintChecking,
Set<Label> requiredToolchains,
boolean supportsPlatforms,
- Attribute... attributes) {
+ Collection<Attribute> attributes) {
this.name = name;
this.key = key;
this.type = type;
this.isSkylark = isSkylark;
this.targetKind = name + Rule.targetKindSuffix();
- this.skylarkExecutable = skylarkExecutable;
this.skylarkTestable = skylarkTestable;
this.documented = documented;
this.publicByDefault = publicByDefault;
@@ -1336,7 +1351,7 @@ public class RuleClass {
this.configuredTargetFunction = configuredTargetFunction;
this.externalBindingsFunction = externalBindingsFunction;
this.optionReferenceFunction = optionReferenceFunction;
- this.ruleDefinitionEnvironment = ruleDefinitionEnvironment;
+ this.ruleDefinitionEnvironmentLabel = ruleDefinitionEnvironmentLabel;
this.ruleDefinitionEnvironmentHashCode = ruleDefinitionEnvironmentHashCode;
validateNoClashInPublicNames(attributes);
this.attributes = ImmutableList.copyOf(attributes);
@@ -1349,7 +1364,7 @@ public class RuleClass {
// Create the index and collect non-configurable attributes.
int index = 0;
- attributeIndex = new HashMap<>(attributes.length);
+ attributeIndex = new HashMap<>(attributes.size());
ImmutableList.Builder<String> nonConfigurableAttributesBuilder = ImmutableList.builder();
for (Attribute attribute : attributes) {
attributeIndex.put(attribute.getName(), index++);
@@ -1360,7 +1375,7 @@ public class RuleClass {
this.nonConfigurableAttributes = nonConfigurableAttributesBuilder.build();
}
- private void validateNoClashInPublicNames(Attribute[] attributes) {
+ private void validateNoClashInPublicNames(Iterable<Attribute> attributes) {
Map<String, Attribute> publicToPrivateNames = new HashMap<>();
for (Attribute attribute : attributes) {
String publicName = attribute.getPublicName();
@@ -2117,19 +2132,17 @@ public class RuleClass {
}
/**
- * Returns this RuleClass's rule definition environment. Is null for native rules' RuleClass
- * objects and deserialized Skylark rules. Deserialized rules do provide a hash code encapsulating
- * their behavior, available at {@link #getRuleDefinitionEnvironmentHashCode}.
+ * For Skylark rule classes, returns this RuleClass's rule definition environment's label, which
+ * is never null. Is null for native rules' RuleClass objects.
*/
@Nullable
- public Environment getRuleDefinitionEnvironment() {
- return ruleDefinitionEnvironment;
+ public Label getRuleDefinitionEnvironmentLabel() {
+ return ruleDefinitionEnvironmentLabel;
}
/**
- * Returns the hash code for the RuleClass's rule definition environment. In deserialization,
- * this RuleClass may not actually contain its environment, in which case the hash code is all
- * that is available. Will be null for native rules' RuleClass objects.
+ * Returns the hash code for the RuleClass's rule definition environment. Will be null for native
+ * rules' RuleClass objects.
*/
@Nullable
public String getRuleDefinitionEnvironmentHashCode() {
@@ -2142,14 +2155,6 @@ public class RuleClass {
}
/**
- * Returns true if this RuleClass is an executable Skylark RuleClass (i.e. it is
- * Skylark and Normal or Test RuleClass).
- */
- public boolean isSkylarkExecutable() {
- return skylarkExecutable;
- }
-
- /**
* Returns true if this RuleClass is Skylark-defined and is subject to analysis-time
* tests.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
index a179df0c00..ce152820e4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFormatter.java
@@ -44,10 +44,7 @@ public class RuleFormatter {
if (isSkylark) {
builder.setSkylarkEnvironmentHashCode(
Preconditions.checkNotNull(
- rule.getRuleClassObject()
- .getRuleDefinitionEnvironment()
- .getTransitiveContentHashCode(),
- rule));
+ rule.getRuleClassObject().getRuleDefinitionEnvironmentHashCode(), rule));
}
for (Attribute attr : rule.getAttributes()) {
Object rawAttributeValue = rawAttributeMapper.getRawAttributeValue(rule, attr);
@@ -116,4 +113,3 @@ public class RuleFormatter {
return null;
}
}
-
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
index edb0796fff..ef5c31a073 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/ProtoOutputFormatter.java
@@ -52,7 +52,6 @@ import com.google.devtools.build.lib.query2.proto.proto2api.Build;
import com.google.devtools.build.lib.query2.proto.proto2api.Build.GeneratedFile;
import com.google.devtools.build.lib.query2.proto.proto2api.Build.QueryResult.Builder;
import com.google.devtools.build.lib.query2.proto.proto2api.Build.SourceFile;
-import com.google.devtools.build.lib.syntax.Environment;
import com.google.devtools.build.lib.syntax.Type;
import java.io.IOException;
import java.io.OutputStream;
@@ -211,15 +210,15 @@ public class ProtoOutputFormatter extends AbstractUnorderedFormatter {
postProcess(rule, rulePb, serializedAttributes);
- Environment env = rule.getRuleClassObject().getRuleDefinitionEnvironment();
- if (env != null && includeRuleDefinitionEnvironment()) {
+ String transitiveHashCode = rule.getRuleClassObject().getRuleDefinitionEnvironmentHashCode();
+ if (transitiveHashCode != null && includeRuleDefinitionEnvironment()) {
// The RuleDefinitionEnvironment is always defined for Skylark rules and
// always null for non Skylark rules.
rulePb.addAttribute(
Build.Attribute.newBuilder()
.setName(RULE_IMPLEMENTATION_HASH_ATTR_NAME)
.setType(ProtoUtils.getDiscriminatorFromType(Type.STRING))
- .setStringValue(env.getTransitiveContentHashCode()));
+ .setStringValue(transitiveHashCode));
}
ImmutableMultimap<Attribute, Label> aspectsDependencies =
diff --git a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
index c3ae5f91cc..c82b2aeb25 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/RuleClassTest.java
@@ -867,7 +867,6 @@ public class RuleClassTest extends PackageLoadingTestCase {
name,
RuleClassType.NORMAL,
/*isSkylark=*/ skylarkExecutable,
- skylarkExecutable,
/*skylarkTestable=*/ false,
documented,
publicByDefault,
@@ -884,7 +883,9 @@ public class RuleClassTest extends PackageLoadingTestCase {
configuredTargetFunction,
externalBindingsFunction,
/*optionReferenceFunction=*/ RuleClass.NO_OPTION_REFERENCE,
- ruleDefinitionEnvironment,
+ ruleDefinitionEnvironment == null
+ ? null
+ : ruleDefinitionEnvironment.getGlobals().getLabel(),
ruleDefinitionEnvironmentHashCode,
new ConfigurationFragmentPolicy.Builder()
.requiresConfigurationFragments(allowedConfigurationFragments)
@@ -893,7 +894,7 @@ public class RuleClassTest extends PackageLoadingTestCase {
supportsConstraintChecking,
/*requiredToolchains=*/ ImmutableSet.<Label>of(),
/*supportsPlatforms=*/ true,
- attributes);
+ ImmutableList.copyOf(attributes));
}
private static RuleClass createParentRuleClass() {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java
index 7105d917ef..6ce769d074 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithTrimmedConfigurationsTest.java
@@ -39,6 +39,7 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleTransitionFactory;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.testutil.Suite;
import com.google.devtools.build.lib.testutil.TestSpec;
import com.google.devtools.build.lib.util.FileTypeSet;
@@ -141,8 +142,9 @@ public class ConfigurationsForTargetsWithTrimmedConfigurationsTest
}
}
- private static class SetsTestFilterFromAttributeTransitionFactory
- implements RuleTransitionFactory {
+ @AutoCodec.VisibleForSerialization
+ @AutoCodec
+ static class SetsTestFilterFromAttributeTransitionFactory implements RuleTransitionFactory {
@Override
public ConfigurationTransition buildTransitionFor(Rule rule) {
NonconfigurableAttributeMapper attributes = NonconfigurableAttributeMapper.of(rule);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
index 172ec3964a..458adbff56 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkylarkFileContentHashTests.java
@@ -183,10 +183,7 @@ public class SkylarkFileContentHashTests extends BuildViewTestCase {
Collection<Target> targets = result.get(pkgLookupKey).getPackage().getTargets().values();
for (Target target : targets) {
if (target.getName().equals(name)) {
- return ((Rule) target)
- .getRuleClassObject()
- .getRuleDefinitionEnvironment()
- .getTransitiveContentHashCode();
+ return ((Rule) target).getRuleClassObject().getRuleDefinitionEnvironmentHashCode();
}
}
throw new IllegalStateException("target not found: " + name);
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 6f6a561d84..b13d64ac8b 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -484,16 +484,16 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase {
public void testLabelAttrDefaultValueAsStringBadValue() throws Exception {
checkErrorContains(
"invalid label '/foo:bar' in parameter 'default' of attribute 'label': "
- + "invalid label: /foo:bar",
+ + "invalid target name '/foo:bar'",
"attr.label(default = '/foo:bar')");
checkErrorContains(
"invalid label '/bar:foo' in element 1 of parameter 'default' of attribute "
- + "'label_list': invalid label: /bar:foo",
+ + "'label_list': invalid target name '/bar:foo'",
"attr.label_list(default = ['//foo:bar', '/bar:foo'])");
checkErrorContains(
- "invalid label '/bar:foo' in dict key element: invalid label: /bar:foo",
+ "invalid label '/bar:foo' in dict key element: invalid target name '/bar:foo'",
"attr.label_keyed_string_dict(default = {'//foo:bar': 'a', '/bar:foo': 'b'})");
}
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
index b42214062c..38d32e5e29 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/util/SkylarkTestCase.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.skylark.SkylarkModules;
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.PackageFactory;
import com.google.devtools.build.lib.packages.PackageFactory.PackageContext;
import com.google.devtools.build.lib.rules.platform.PlatformCommon;
@@ -63,7 +64,10 @@ public abstract class SkylarkTestCase extends BuildViewTestCase {
Environment.builder(mutability)
.useDefaultSemantics()
.setEventHandler(getEventHandler())
- .setGlobals(SkylarkModules.getGlobals(modules))
+ .setGlobals(
+ SkylarkModules.getGlobals(modules)
+ .withLabel(
+ Label.parseAbsoluteUnchecked("//test:label", /*defaultToMain=*/ false)))
.setPhase(Phase.LOADING)
.build()
.setupDynamic(