aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/packages
diff options
context:
space:
mode:
authorGravatar cparsons <cparsons@google.com>2017-11-04 01:00:59 +0100
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2017-11-06 20:20:21 +0100
commitcaceacd984a3f86b623ea726f4df36bd81998d25 (patch)
treefe7ec2dbd11dfdb10abc2994335c34972c26b77b /src/main/java/com/google/devtools/build/lib/packages
parente8d32b7c922f65539b74357711d5ad6b70934115 (diff)
Expose late-bound-attributes to Skylark.
RELNOTES: Late-bound attributes are exposed to skylark. This is a new API (`configuration_field()`) to depend on certain configuration-defined targets from skylark rules. PiperOrigin-RevId: 174534104
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/packages')
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/Attribute.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClass.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java6
4 files changed, 33 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
index 8b99d8182b..ec03962931 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java
@@ -58,6 +58,8 @@ public abstract class AbstractAttributeMapper implements AttributeMap {
Object value = attributes.getAttributeValue(index);
if (value instanceof Attribute.ComputedDefault) {
value = ((Attribute.ComputedDefault) value).getDefault(this);
+ } else if (value instanceof Attribute.LateBoundDefault) {
+ value = ((Attribute.LateBoundDefault) value).getDefault();
}
try {
return type.cast(value);
@@ -87,6 +89,25 @@ public abstract class AbstractAttributeMapper implements AttributeMap {
}
}
+ /**
+ * Returns the given attribute if it's a {@link Attribute.LateBoundDefault}, null otherwise.
+ *
+ * @throws IllegalArgumentException if the given attribute doesn't exist with the specified
+ * type. This happens whether or not it's a late bound default.
+ */
+ @Nullable
+ @SuppressWarnings("unchecked")
+ public <T> Attribute.LateBoundDefault<?, T> getLateBoundDefault(
+ String attributeName, Type<T> type) {
+ int index = getIndexWithTypeCheck(attributeName, type);
+ Object value = attributes.getAttributeValue(index);
+ if (value instanceof Attribute.LateBoundDefault) {
+ return (Attribute.LateBoundDefault<?, T>) value;
+ } else {
+ return null;
+ }
+ }
+
@Override
public Iterable<String> getAttributeNames() {
ImmutableList.Builder<String> names = ImmutableList.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
index 54f6255226..9b158e6a58 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Attribute.java
@@ -680,7 +680,6 @@ public final class Attribute implements Comparable<Attribute> {
*/
public Builder<TYPE> value(LateBoundDefault<?, ? extends TYPE> defaultValue) {
Preconditions.checkState(!valueSet, "the default value is already set");
- Preconditions.checkState(name.isEmpty() || isLateBound(name));
value = defaultValue;
valueSource = AttributeValueSource.LATE_BOUND;
valueSet = true;
@@ -1082,6 +1081,9 @@ public final class Attribute implements Comparable<Attribute> {
*/
public Attribute build(String name) {
Preconditions.checkState(!name.isEmpty(), "name has not been set");
+ if (valueSource == AttributeValueSource.LATE_BOUND) {
+ Preconditions.checkState(isLateBound(name));
+ }
// TODO(bazel-team): Set the default to be no file type, then remove this check, and also
// remove all allowedFileTypes() calls without parameters.
@@ -1715,7 +1717,7 @@ public final class Attribute implements Comparable<Attribute> {
private static final LateBoundDefault<Void, Void> ALWAYS_NULL =
new SimpleLateBoundDefault<>(false, Void.class, null, (rule, attributes, unused) -> null);
- private LateBoundDefault(
+ protected LateBoundDefault(
boolean useHostConfiguration,
Class<FragmentT> fragmentClass,
ValueT defaultValue) {
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 7dd8acba2d..bf99b43ade 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
@@ -1601,6 +1601,8 @@ public class RuleClass {
// that depends on non-computed default attribute values, and that condition predicate is
// evaluated by the call to Attribute#getDefaultValue.
attrsWithComputedDefaults.add(attr);
+ } else if (attr.isLateBound()) {
+ rule.setAttributeValue(attr, attr.getLateBoundDefault(), /*explicit=*/ false);
} else {
Object defaultValue = getAttributeNoncomputedDefaultValue(attr, pkgBuilder);
rule.setAttributeValue(attr, defaultValue, /*explicit=*/ false);
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
index 5235523d53..302b05bde2 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClassProvider.java
@@ -93,4 +93,10 @@ public interface RuleClassProvider {
* Retrieves an aspect from the aspect factory map using the key provided
*/
NativeAspectClass getNativeAspectClass(String key);
+
+ /**
+ * Retrieves a {@link Map} from skylark configuration fragment name to configuration fragment
+ * class.
+ */
+ Map<String, Class<?>> getConfigurationFragmentMap();
}