diff options
Diffstat (limited to 'src/main/java/com/google/devtools')
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" |