aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/packages
diff options
context:
space:
mode:
authorGravatar Miguel Alcon Pinto <malcon@google.com>2015-09-25 15:00:10 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-09-28 11:38:46 +0000
commit69b5a8664755f99e228dfa09dc4ec331221172cb (patch)
treea38790e555aad2bd670dc45b5ff0dfacbf248eff /src/main/java/com/google/devtools/build/lib/packages
parent7e81ada93368ee5592d8937d0c66c40c2501c245 (diff)
Make rules construction more flexible.
-- MOS_MIGRATED_REVID=103942367
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Package.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Rule.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClass.java7
5 files changed, 43 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java
index 039235088b..15917f6b8b 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeContainer.java
@@ -47,10 +47,14 @@ public class AttributeContainer {
* Create a container for a rule of the given rule class.
*/
AttributeContainer(RuleClass ruleClass) {
+ this(ruleClass, new Location[ruleClass.getAttributeCount()]);
+ }
+
+ AttributeContainer(RuleClass ruleClass, Location[] locations) {
this.ruleClass = ruleClass;
this.attributeValues = new Object[ruleClass.getAttributeCount()];
this.attributeValueExplicitlySpecified = new BitSet(ruleClass.getAttributeCount());
- this.attributeLocations = new Location[ruleClass.getAttributeCount()];
+ this.attributeLocations = locations;
}
/**
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 b244b27328..4e6da9609c 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
@@ -1040,7 +1040,13 @@ public class Package implements Serializable {
*/
Rule newRuleWithLabel(Label label, RuleClass ruleClass, FuncallExpression ast,
Location location) {
- return new Rule(pkg, label, ruleClass, ast, location);
+ return newRuleWithLabelAndAttrContainer(label, ruleClass, ast, location,
+ new AttributeContainer(ruleClass));
+ }
+
+ Rule newRuleWithLabelAndAttrContainer(Label label, RuleClass ruleClass, FuncallExpression ast,
+ Location location, AttributeContainer attributeContainer) {
+ return new Rule(pkg, label, ruleClass, ast, location, attributeContainer);
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
index 23951e8f2d..1cd8294e5a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageDeserializer.java
@@ -178,7 +178,7 @@ public class PackageDeserializer {
try {
Rule rule = ruleClass.createRuleWithParsedAttributeValues(
ruleLabel, context.packageBuilder, ruleLocation, attributeValues,
- NullEventHandler.INSTANCE);
+ NullEventHandler.INSTANCE, new AttributeContainerWithoutLocation(ruleClass));
context.packageBuilder.addRule(rule);
Preconditions.checkState(!rule.containsErrors());
@@ -620,4 +620,27 @@ public class PackageDeserializer {
throw new IllegalStateException();
}
}
+
+ private static class AttributeContainerWithoutLocation extends AttributeContainer {
+
+ private AttributeContainerWithoutLocation(RuleClass ruleClass) {
+ super(ruleClass, null);
+ }
+
+ @Override
+ public Location getAttributeLocation(String attrName) {
+ return EmptyLocation.INSTANCE;
+ }
+
+ @Override
+ void setAttributeLocation(int attrIndex, Location location) {
+ throw new UnsupportedOperationException("Setting location not supported");
+ }
+
+ @Override
+ void setAttributeLocation(Attribute attribute, Location location) {
+ throw new UnsupportedOperationException("Setting location not supported");
+ }
+ }
+
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Rule.java b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
index c62661d21d..6f8e60cbcd 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Rule.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Rule.java
@@ -157,12 +157,13 @@ public final class Rule implements Target {
private List<OutputFile> outputFiles;
private ListMultimap<String, OutputFile> outputFileMap;
- Rule(Package pkg, Label label, RuleClass ruleClass, FuncallExpression ast, Location location) {
+ Rule(Package pkg, Label label, RuleClass ruleClass, FuncallExpression ast, Location location,
+ AttributeContainer attributeContainer) {
this.pkg = Preconditions.checkNotNull(pkg);
this.label = label;
this.ruleClass = Preconditions.checkNotNull(ruleClass);
this.location = Preconditions.checkNotNull(location);
- this.attributes = new AttributeContainer(ruleClass);
+ this.attributes = attributeContainer;
this.attributeMap = new RawAttributeMapper(pkg, ruleClass, label, attributes);
this.containsErrors = false;
this.ast = ast;
@@ -185,10 +186,6 @@ public final class Rule implements Target {
attributes.setAttributeLocation(attrIndex, location);
}
- void setAttributeLocation(Attribute attribute, Location location) {
- attributes.setAttributeLocation(attribute, location);
- }
-
void setContainsErrors() {
this.containsErrors = true;
}
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 f561887d49..a806435457 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
@@ -1370,9 +1370,11 @@ public final class RuleClass {
@SuppressWarnings("unchecked")
Rule createRuleWithParsedAttributeValues(Label label,
Package.Builder pkgBuilder, Location ruleLocation,
- Map<String, ParsedAttributeValue> attributeValues, EventHandler eventHandler)
+ Map<String, ParsedAttributeValue> attributeValues, EventHandler eventHandler,
+ AttributeContainer attributeContainer)
throws LabelSyntaxException, InterruptedException {
- Rule rule = pkgBuilder.newRuleWithLabel(label, this, null, ruleLocation);
+ Rule rule = pkgBuilder.newRuleWithLabelAndAttrContainer(label, this, null, ruleLocation,
+ attributeContainer);
rule.checkValidityPredicate(eventHandler);
for (Attribute attribute : rule.getRuleClassObject().getAttributes()) {
@@ -1386,7 +1388,6 @@ public final class RuleClass {
}
rule.setAttributeValue(attribute, value.getValue(), value.getExplicitlySpecified());
- rule.setAttributeLocation(attribute, value.getLocation());
checkAllowedValues(rule, attribute, eventHandler);
if (attribute.getName().equals("visibility")) {