diff options
author | Miguel Alcon Pinto <malcon@google.com> | 2015-09-25 15:00:10 +0000 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@google.com> | 2015-09-28 11:38:46 +0000 |
commit | 69b5a8664755f99e228dfa09dc4ec331221172cb (patch) | |
tree | a38790e555aad2bd670dc45b5ff0dfacbf248eff /src/main/java/com/google/devtools/build/lib/packages | |
parent | 7e81ada93368ee5592d8937d0c66c40c2501c245 (diff) |
Make rules construction more flexible.
--
MOS_MIGRATED_REVID=103942367
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages')
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")) { |