aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java19
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/AbstractAttributeMapper.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java4
11 files changed, 68 insertions, 41 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java
index 6d95f55b24..db7d6f0f3c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectAwareAttributeMapper.java
@@ -86,12 +86,8 @@ class AspectAwareAttributeMapper implements AttributeMap {
}
@Override
- public <T> boolean isConfigurable(String attributeName, Type<T> type) {
- if (ruleAttributes.has(attributeName, type)) {
- return ruleAttributes.isConfigurable(attributeName, type);
- }
- // Any scenario aside from a "select(...)" in a BUILD file is not configurable.
- return false;
+ public boolean isConfigurable(String attributeName) {
+ return ruleAttributes.isConfigurable(attributeName);
}
@Override
@@ -154,7 +150,16 @@ class AspectAwareAttributeMapper implements AttributeMap {
}
@Override
- public boolean has(String attrName, Type<?> type) {
+ public boolean has(String attrName) {
+ if (ruleAttributes.has(attrName)) {
+ return true;
+ } else {
+ return aspectAttributes.containsKey(attrName);
+ }
+ }
+
+ @Override
+ public <T> boolean has(String attrName, Type<T> type) {
if (ruleAttributes.has(attrName, type)) {
return true;
} else {
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 a7b55b22db..7837317afb 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
@@ -166,8 +166,9 @@ public abstract class AbstractAttributeMapper implements AttributeMap {
}
@Override
- public final <T> boolean isConfigurable(String attributeName, Type<T> type) {
- return getSelectorList(attributeName, type) != null;
+ public final boolean isConfigurable(String attributeName) {
+ Attribute attrDef = getAttributeDefinition(attributeName);
+ return attrDef == null ? false : getSelectorList(attributeName, attrDef.getType()) != null;
}
public static <T> boolean isConfigurable(Rule rule, String attributeName, Type<T> type) {
@@ -244,8 +245,13 @@ public abstract class AbstractAttributeMapper implements AttributeMap {
}
@Override
- public boolean has(String attrName, Type<?> type) {
+ public boolean has(String attrName) {
Attribute attribute = ruleClass.getAttributeByNameMaybe(attrName);
- return attribute != null && attribute.getType() == type;
+ return attribute != null;
+ }
+
+ @Override
+ public <T> boolean has(String attrName, Type<T> type) {
+ return getAttributeType(attrName) == type;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
index 17f8dad21c..e3a390e958 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AggregatingAttributeMapper.java
@@ -16,7 +16,6 @@ package com.google.devtools.build.lib.packages;
import com.google.common.base.Verify;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableList.Builder;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -460,8 +459,8 @@ public class AggregatingAttributeMapper extends AbstractAttributeMapper {
}
@Override
- public <T> boolean isConfigurable(String attributeName, Type<T> type) {
- return owner.isConfigurable(attributeName, type);
+ public boolean isConfigurable(String attributeName) {
+ return owner.isConfigurable(attributeName);
}
@Override
@@ -525,7 +524,12 @@ public class AggregatingAttributeMapper extends AbstractAttributeMapper {
}
@Override
- public boolean has(String attrName, Type<?> type) {
+ public boolean has(String attrName) {
+ return owner.has(attrName);
+ }
+
+ @Override
+ public <T> boolean has(String attrName, Type<T> type) {
return owner.has(attrName, type);
}
};
diff --git a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
index 3e62f2947d..a573bf038a 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/AttributeMap.java
@@ -39,6 +39,18 @@ public interface AttributeMap {
Label getLabel();
/**
+ * Returns true if an attribute with the given name exists.
+ */
+ boolean has(String attrName);
+
+ /**
+ * Returns true if an attribute with the given name exists with the given type.
+ *
+ * <p>Don't use this version unless you really care about the type.
+ */
+ <T> boolean has(String attrName, Type<T> type);
+
+ /**
* Returns the value of the named rule attribute, which must be of the given type. This may
* be null (for example, for an attribute with no default value that isn't explicitly set in
* the rule - see {@link Type#getDefaultValue}).
@@ -51,9 +63,9 @@ public interface AttributeMap {
/**
* Returns true if the given attribute is configurable for this rule instance, false
- * otherwise.
+ * if it isn't configurable or doesn't exist.
*/
- <T> boolean isConfigurable(String attributeName, Type<T> type);
+ boolean isConfigurable(String attributeName);
/**
* Returns the names of all attributes covered by this map.
@@ -115,9 +127,4 @@ public interface AttributeMap {
String getPackageDefaultDeprecation();
ImmutableList<String> getPackageDefaultCopts();
-
- /**
- * @return true if an attribute with the given name and type is present
- */
- boolean has(String attrName, Type<?> type);
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java
index e57476c551..3f0d2b0eef 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/DelegatingAttributeMapper.java
@@ -46,8 +46,8 @@ public class DelegatingAttributeMapper implements AttributeMap {
}
@Override
- public <T> boolean isConfigurable(String attributeName, Type<T> type) {
- return delegate.isConfigurable(attributeName, type);
+ public boolean isConfigurable(String attributeName) {
+ return delegate.isConfigurable(attributeName);
}
@Override
@@ -98,7 +98,12 @@ public class DelegatingAttributeMapper implements AttributeMap {
}
@Override
- public boolean has(String attrName, Type<?> type) {
+ public boolean has(String attrName) {
+ return delegate.has(attrName);
+ }
+
+ @Override
+ public <T> boolean has(String attrName, Type<T> type) {
return delegate.has(attrName, type);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
index 89356a06f6..a2f0b6e4f6 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ImplicitOutputsFunction.java
@@ -89,7 +89,7 @@ public abstract class ImplicitOutputsFunction {
Type<?> attrType = map.getAttributeType(attrName);
// Don't include configurable attributes: we don't know which value they might take
// since we don't yet have a build configuration.
- if (!map.isConfigurable(attrName, attrType)) {
+ if (!map.isConfigurable(attrName)) {
Object value = map.get(attrName, attrType);
attrValues.put(attrName, value == null ? Runtime.NONE : value);
}
@@ -291,7 +291,9 @@ public abstract class ImplicitOutputsFunction {
}
Type<?> attrType = rule.getAttributeType(attrName);
- if (attrType == null) { return Collections.emptySet(); }
+ if (attrType == null) {
+ return Collections.emptySet();
+ }
// String attributes and lists are easy.
if (Type.STRING == attrType) {
return singleton(rule.get(attrName, Type.STRING));
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java b/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java
index cbe270238a..eedaae0747 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RawAttributeMapper.java
@@ -21,10 +21,8 @@ import com.google.devtools.build.lib.packages.BuildType.Selector;
import com.google.devtools.build.lib.packages.BuildType.SelectorList;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Preconditions;
-
import java.util.Collection;
import java.util.List;
-
import javax.annotation.Nullable;
/**
@@ -69,7 +67,7 @@ public class RawAttributeMapper extends AbstractAttributeMapper {
@Nullable
public <T> Collection<T> getMergedValues(String attributeName, Type<List<T>> type) {
Preconditions.checkState(type instanceof Type.ListType);
- if (!isConfigurable(attributeName, type)) {
+ if (!isConfigurable(attributeName)) {
return get(attributeName, type);
}
diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java b/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java
index ac54a67c87..dd2bcbd730 100644
--- a/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java
+++ b/src/main/java/com/google/devtools/build/lib/pkgcache/CompileOneDependencyTransformer.java
@@ -168,8 +168,8 @@ public final class CompileOneDependencyTransformer {
for (Rule rule : orderedRuleList) {
RawAttributeMapper attributes = RawAttributeMapper.of(rule);
// We don't know which path to follow for configurable attributes, so skip them.
- if (attributes.isConfigurable("deps", BuildType.LABEL_LIST)
- || attributes.isConfigurable("srcs", BuildType.LABEL_LIST)) {
+ if (attributes.isConfigurable("deps")
+ || attributes.isConfigurable("srcs")) {
continue;
}
RuleClass ruleClass = rule.getRuleClassObject();
diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
index 81f2dd1183..d20880c5ef 100644
--- a/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
+++ b/src/main/java/com/google/devtools/build/lib/query2/output/OutputFormatter.java
@@ -424,7 +424,7 @@ public abstract class OutputFormatter implements Serializable {
if ("name".equals(attr.getName())) {
continue;
}
- if (attributeMap.isConfigurable(attr.getName(), attr.getType())) {
+ if (attributeMap.isConfigurable(attr.getName())) {
continue; // TODO(bazel-team): handle configurable attributes.
}
PossibleAttributeValues values = getPossibleAttributeValues(rule, attr);
@@ -728,7 +728,7 @@ public abstract class OutputFormatter implements Serializable {
AggregatingAttributeMapper attributeMap = AggregatingAttributeMapper.of(rule);
if (attr.getType().equals(BuildType.LABEL_LIST)
- && attributeMap.isConfigurable(attr.getName(), attr.getType())) {
+ && attributeMap.isConfigurable(attr.getName())) {
// TODO(gregce): Expand this to all collection types (we don't do this for scalars because
// there's currently no syntax for expressing multiple scalar values). This unfortunately
// isn't trivial because Bazel's label visitation logic includes special methods built
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index 30ef96ef89..76b57efceb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -128,9 +128,9 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory {
.enableCcNativeLibrariesProvider()
.enableCompileProviders()
.enableInterfaceSharedObjects()
- // Generate .a and .so outputs even without object files to fulfill the rule class contract
- // wrt. implicit output files, if the contract says so. Behavior here differs between Bazel
- // and Blaze.
+ // Generate .a and .so outputs even without object files to fulfill the rule class
+ // contract wrt. implicit output files, if the contract says so. Behavior here differs
+ // between Bazel and Blaze.
.setGenerateLinkActionsIfEmpty(
ruleContext.getRule().getImplicitOutputsFunction() != ImplicitOutputsFunction.NONE)
.setLinkType(linkType)
@@ -188,7 +188,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory {
ruleContext.registerAction(new FailAction(ruleContext.getActionOwner(),
ImmutableList.of(solibArtifact), "Toolchain does not support dynamic linking"));
} else if (!createDynamicLibrary
- && ruleContext.attributes().isConfigurable("srcs", BuildType.LABEL_LIST)) {
+ && ruleContext.attributes().isConfigurable("srcs")) {
// If "srcs" is configurable, the .so output is always declared because the logic that
// determines implicit outs doesn't know which value of "srcs" will ultimately get chosen.
// Here, where we *do* have the correct value, it may not contain any source files to
@@ -375,7 +375,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory {
* name of a genrule that generates a source file.
*/
public static boolean appearsToHaveObjectFiles(AttributeMap rule) {
- if ((rule instanceof RawAttributeMapper) && rule.isConfigurable("srcs", BuildType.LABEL_LIST)) {
+ if ((rule instanceof RawAttributeMapper) && rule.isConfigurable("srcs")) {
// Since this method gets called by loading phase logic (e.g. the cc_library implicit outputs
// function), the attribute mapper may not be able to resolve configurable attributes. When
// that's the case, there's no way to know which value a configurable "srcs" will take, so
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
index e82f20ad25..7ed45de2ce 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JvmConfigurationLoader.java
@@ -122,7 +122,7 @@ public final class JvmConfigurationLoader implements ConfigurationFragmentFactor
NoSuchTargetException {
RawAttributeMapper javaHomeAttributes = RawAttributeMapper.of((Rule) javaHomeTarget);
- if (javaHomeAttributes.isConfigurable("srcs", BuildType.LABEL_LIST)) {
+ if (javaHomeAttributes.isConfigurable("srcs")) {
throw new InvalidConfigurationException(
String.format(
"\"srcs\" in %s is configurable. JAVABASE targets don't support configurable"
@@ -170,7 +170,7 @@ public final class JvmConfigurationLoader implements ConfigurationFragmentFactor
if ((jvmTarget instanceof Rule) && "filegroup".equals(((Rule) jvmTarget).getRuleClass())) {
RawAttributeMapper jvmTargetAttributes = RawAttributeMapper.of((Rule) jvmTarget);
- if (jvmTargetAttributes.isConfigurable("path", Type.STRING)) {
+ if (jvmTargetAttributes.isConfigurable("path")) {
throw new InvalidConfigurationException(
String.format(
"\"path\" in %s is configurable. JVM targets don't support configurable"