aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar nharmata <nharmata@google.com>2017-08-07 16:11:04 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-08-08 13:01:51 +0200
commit65a173a3b833a24ba40ecdc6e8d84f3d8c7fdfbb (patch)
treee1b6065d5e4d749853bfc2013e3f9fe4ec7fc62f /src/main/java/com
parentdf7cc48622a17907b7f84d0a8e3dc2470d1a8460 (diff)
Slight refactor to AttributeValuesMap to permit multiple different efficient implementations.
RELNOTES: None PiperOrigin-RevId: 164456778
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClass.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java40
2 files changed, 38 insertions, 27 deletions
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 f979d8bf7b..625130f9f9 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
@@ -40,7 +40,7 @@ import com.google.devtools.build.lib.packages.Attribute.SkylarkComputedDefaultTe
import com.google.devtools.build.lib.packages.Attribute.Transition;
import com.google.devtools.build.lib.packages.BuildType.SelectorList;
import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy.MissingFragmentPolicy;
-import com.google.devtools.build.lib.packages.RuleFactory.AttributeValuesMap;
+import com.google.devtools.build.lib.packages.RuleFactory.AttributeValues;
import com.google.devtools.build.lib.syntax.Argument;
import com.google.devtools.build.lib.syntax.BaseFunction;
import com.google.devtools.build.lib.syntax.Environment;
@@ -1462,10 +1462,10 @@ public class RuleClass {
* {@link CannotPrecomputeDefaultsException}. All other errors are reported on {@code
* eventHandler}.
*/
- Rule createRule(
+ <T> Rule createRule(
Package.Builder pkgBuilder,
Label ruleLabel,
- AttributeValuesMap attributeValues,
+ AttributeValues<T> attributeValues,
EventHandler eventHandler,
@Nullable FuncallExpression ast,
Location location,
@@ -1491,10 +1491,10 @@ public class RuleClass {
*
* <p>Don't call this function unless you know what you're doing.
*/
- Rule createRuleUnchecked(
+ <T> Rule createRuleUnchecked(
Package.Builder pkgBuilder,
Label ruleLabel,
- AttributeValuesMap attributeValues,
+ AttributeValues<T> attributeValues,
Location location,
AttributeContainer attributeContainer,
ImplicitOutputsFunction implicitOutputsFunction)
@@ -1517,10 +1517,10 @@ public class RuleClass {
*
* <p>Errors are reported on {@code eventHandler}.
*/
- private void populateRuleAttributeValues(
+ private <T> void populateRuleAttributeValues(
Rule rule,
Package.Builder pkgBuilder,
- AttributeValuesMap attributeValues,
+ AttributeValues<T> attributeValues,
EventHandler eventHandler)
throws InterruptedException, CannotPrecomputeDefaultsException {
BitSet definedAttrIndices =
@@ -1541,11 +1541,12 @@ public class RuleClass {
* value for the attribute with index {@code i} in this {@link RuleClass}. Errors are reported
* on {@code eventHandler}.
*/
- private BitSet populateDefinedRuleAttributeValues(
- Rule rule, AttributeValuesMap attributeValues, EventHandler eventHandler) {
+ private <T> BitSet populateDefinedRuleAttributeValues(
+ Rule rule, AttributeValues<T> attributeValues, EventHandler eventHandler) {
BitSet definedAttrIndices = new BitSet();
- for (String attributeName : attributeValues.getAttributeNames()) {
- Object attributeValue = attributeValues.getAttributeValue(attributeName);
+ for (T attributeAccessor : attributeValues.getAttributeAccessors()) {
+ String attributeName = attributeValues.getName(attributeAccessor);
+ Object attributeValue = attributeValues.getValue(attributeAccessor);
// Ignore all None values.
if (attributeValue == Runtime.NONE) {
continue;
@@ -1575,7 +1576,7 @@ public class RuleClass {
nativeAttributeValue = attributeValue;
}
- boolean explicit = attributeValues.isAttributeExplicitlySpecified(attributeName);
+ boolean explicit = attributeValues.isExplicitlySpecified(attributeAccessor);
setRuleAttributeValue(rule, eventHandler, attr, nativeAttributeValue, explicit);
definedAttrIndices.set(attrIndex);
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
index 4795c7b1ac..930279b6a4 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java
@@ -249,7 +249,7 @@ public class RuleFactory {
* A wrapper around an map of named attribute values that specifies whether the map's values
* are of "build-language" or of "native" types.
*/
- public interface AttributeValuesMap {
+ public interface AttributeValues<T> {
/**
* Returns {@code true} if all the map's values are "build-language typed", i.e., resulting
* from the evaluation of an expression in the build language. Returns {@code false} if all
@@ -258,16 +258,16 @@ public class RuleFactory {
*/
boolean valuesAreBuildLanguageTyped();
- Iterable<String> getAttributeNames();
+ Iterable<T> getAttributeAccessors();
- Object getAttributeValue(String attributeName);
-
- boolean isAttributeExplicitlySpecified(String attributeName);
+ String getName(T attributeAccessor);
+ Object getValue(T attributeAccessor);
+ boolean isExplicitlySpecified(T attributeAccessor);
}
- /** A {@link AttributeValuesMap} of explicit "build-language" values. */
- public static final class BuildLangTypedAttributeValuesMap implements AttributeValuesMap {
-
+ /** A {@link AttributeValues} of explicit "build-language" values. */
+ public static final class BuildLangTypedAttributeValuesMap
+ implements AttributeValues<Map.Entry<String, Object>> {
private final Map<String, Object> attributeValues;
public BuildLangTypedAttributeValuesMap(Map<String, Object> attributeValues) {
@@ -278,23 +278,32 @@ public class RuleFactory {
return attributeValues.containsKey(attributeName);
}
+ private Object getAttributeValue(String attributeName) {
+ return attributeValues.get(attributeName);
+ }
+
@Override
public boolean valuesAreBuildLanguageTyped() {
return true;
}
@Override
- public Iterable<String> getAttributeNames() {
- return attributeValues.keySet();
+ public Iterable<Map.Entry<String, Object>> getAttributeAccessors() {
+ return attributeValues.entrySet();
}
@Override
- public Object getAttributeValue(String attributeName) {
- return attributeValues.get(attributeName);
+ public String getName(Map.Entry<String, Object> attributeAccessor) {
+ return attributeAccessor.getKey();
+ }
+
+ @Override
+ public Object getValue(Map.Entry<String, Object> attributeAccessor) {
+ return attributeAccessor.getValue();
}
@Override
- public boolean isAttributeExplicitlySpecified(String attributeName) {
+ public boolean isExplicitlySpecified(Map.Entry<String, Object> attributeAccessor) {
return true;
}
}
@@ -331,8 +340,9 @@ public class RuleFactory {
String name = generator.getNameArg();
ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
- for (String attributeName : args.getAttributeNames()) {
- builder.put(attributeName, args.getAttributeValue(attributeName));
+ for (Map.Entry<String, Object> attributeAccessor : args.getAttributeAccessors()) {
+ String attributeName = args.getName(attributeAccessor);
+ builder.put(attributeName, args.getValue(attributeAccessor));
}
builder.put("generator_name", (name == null) ? args.getAttributeValue("name") : name);
builder.put("generator_function", function.getName());