diff options
author | 2017-08-07 16:11:04 +0200 | |
---|---|---|
committer | 2017-08-08 13:01:51 +0200 | |
commit | 65a173a3b833a24ba40ecdc6e8d84f3d8c7fdfbb (patch) | |
tree | e1b6065d5e4d749853bfc2013e3f9fe4ec7fc62f /src/main/java/com | |
parent | df7cc48622a17907b7f84d0a8e3dc2470d1a8460 (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.java | 25 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/packages/RuleFactory.java | 40 |
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()); |