diff options
11 files changed, 27 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java index 37f06c3bd4..3ded47d104 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java @@ -25,7 +25,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.TriState; import com.google.devtools.build.lib.packages.Type; import com.google.devtools.build.lib.syntax.Label; @@ -53,9 +52,7 @@ public final class AnalysisUtils { */ public static boolean isStampingEnabled(RuleContext ruleContext) { BuildConfiguration config = ruleContext.getConfiguration(); - Rule rule = ruleContext.getRule(); - if (config.isHostConfiguration() - || !rule.getRuleClassObject().hasAttr("stamp", Type.TRISTATE)) { + if (config.isHostConfiguration() || !ruleContext.attributes().has("stamp", Type.TRISTATE)) { return false; } TriState stamp = ruleContext.attributes().get("stamp", Type.TRISTATE); 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 f03ee6bf08..c13c362b28 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 @@ -209,4 +209,10 @@ public abstract class AbstractAttributeMapper implements AttributeMap { protected void checkType(String attrName, Type<?> type) { getIndexWithTypeCheck(attrName, type); } + + @Override + public boolean has(String attrName, Type<?> type) { + Attribute attribute = ruleClass.getAttributeByNameMaybe(attrName); + return attribute != null && attribute.getType() == 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 2aef2242bb..def32b58bb 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 @@ -213,6 +213,8 @@ public class AggregatingAttributeMapper extends AbstractAttributeMapper { @Override public boolean isAttributeValueExplicitlySpecified(String attributeName) { return owner.isAttributeValueExplicitlySpecified(attributeName); } + @Override + public boolean has(String attrName, Type<?> 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 eeb6951c39..52aecd1655 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 @@ -105,4 +105,9 @@ 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/Package.java b/src/main/java/com/google/devtools/build/lib/packages/Package.java index b65e35858f..900f901891 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/Package.java +++ b/src/main/java/com/google/devtools/build/lib/packages/Package.java @@ -1348,7 +1348,7 @@ public class Package implements Serializable { AttributeMap attributes = NonconfigurableAttributeMapper.of(rule); if (rule.getRuleClass().equals("test_suite") && attributes.get("tests", Type.LABEL_LIST).isEmpty() - && (!rule.getRuleClassObject().hasAttr("suites", Type.LABEL_LIST) + && (!attributes.has("suites", Type.LABEL_LIST) || attributes.get("suites", Type.LABEL_LIST).isEmpty())) { rule.setAttributeValueByName("$implicit_tests", allTests); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index c44aac0ce0..6f545ac0e4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -436,7 +436,7 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { * Returns "true" if the {@code linkshared} attribute exists and is set. */ private static final boolean isLinkShared(RuleContext context) { - return context.getRule().getRuleClassObject().hasAttr("linkshared", Type.BOOLEAN) + return context.attributes().has("linkshared", Type.BOOLEAN) && context.attributes().get("linkshared", Type.BOOLEAN); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java index b265d2362a..871053703c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java @@ -147,7 +147,7 @@ public final class CcCommon { } private boolean hasAttribute(String name, Type<?> type) { - return ruleContext.getRule().getRuleClassObject().hasAttr(name, type); + return ruleContext.attributes().has(name, type); } private static NestedSet<Artifact> collectExecutionDynamicLibraryArtifacts( @@ -179,10 +179,10 @@ public final class CcCommon { deps.addAll(ruleContext.getPrerequisites("deps", Mode.TARGET)); - if (ruleContext.getRule().getRuleClassObject().hasAttr("malloc", Type.LABEL)) { + if (ruleContext.attributes().has("malloc", Type.LABEL)) { deps.add(CppHelper.mallocForTarget(ruleContext)); } - if (ruleContext.getRule().getRuleClassObject().hasAttr("implementation", Type.LABEL_LIST)) { + if (ruleContext.attributes().has("implementation", Type.LABEL_LIST)) { deps.addAll(ruleContext.getPrerequisites("implementation", Mode.TARGET)); } @@ -596,7 +596,7 @@ public final class CcCommon { RuleContext ruleContext, CppCompilationContext context) { // TODO(bazel-team): Use context.getCompilationPrerequisites() instead. NestedSetBuilder<Artifact> prerequisites = NestedSetBuilder.stableOrder(); - if (ruleContext.getRule().getRuleClassObject().hasAttr("srcs", Type.LABEL_LIST)) { + if (ruleContext.attributes().has("srcs", Type.LABEL_LIST)) { for (FileProvider provider : ruleContext .getPrerequisites("srcs", Mode.TARGET, FileProvider.class)) { prerequisites.addAll(FileType.filter(provider.getFilesToBuild(), SOURCE_TYPES)); 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 e028cbb7be..fe93ba41d2 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 @@ -338,7 +338,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory { } private static ImmutableList<Label> getImplementedCcPublicLibraries(RuleContext context) { - if (context.getRule().getRuleClassObject().hasAttr("implements", Type.LABEL_LIST)) { + if (context.attributes().has("implements", Type.LABEL_LIST)) { return ImmutableList.copyOf(context.attributes().get("implements", Type.LABEL_LIST)); } else { return ImmutableList.of(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java index 62c7f1fdcc..1ff7dd3545 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppHelper.java @@ -346,7 +346,7 @@ public class CppHelper { scannableBuilder.addTransitive(dep.getTransitiveIncludeScannables()); } - if (ruleContext.getRule().getRuleClassObject().hasAttr("malloc", Type.LABEL)) { + if (ruleContext.attributes().has("malloc", Type.LABEL)) { TransitiveInfoCollection malloc = mallocForTarget(ruleContext); TransitiveLipoInfoProvider provider = malloc.getProvider(TransitiveLipoInfoProvider.class); if (provider != null) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java index 4b7ffacaf5..ee15d33cf6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java @@ -225,7 +225,7 @@ public class JavaCommon { public static List<TransitiveInfoCollection> getExports(RuleContext ruleContext) { // We need to check here because there are classes inheriting from this class that implement // rules that don't have this attribute. - if (ruleContext.getRule().getRuleClassObject().hasAttr("exports", Type.LABEL_LIST)) { + if (ruleContext.attributes().has("exports", Type.LABEL_LIST)) { return ImmutableList.copyOf(ruleContext.getPrerequisites("exports", Mode.TARGET)); } else { return ImmutableList.of(); @@ -391,7 +391,7 @@ public class JavaCommon { private static List<TransitiveInfoCollection> getRuntimeDeps(RuleContext ruleContext) { // We need to check here because there are classes inheriting from this class that implement // rules that don't have this attribute. - if (ruleContext.getRule().getRuleClassObject().hasAttr("runtime_deps", Type.LABEL_LIST)) { + if (ruleContext.attributes().has("runtime_deps", Type.LABEL_LIST)) { return ImmutableList.copyOf(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET)); } else { return ImmutableList.of(); @@ -573,7 +573,7 @@ public class JavaCommon { Iterable<JavaPluginInfoProvider> getPluginInfoProvidersForAttribute(String attribute, Mode mode) { - if (ruleContext.getRule().getRuleClassObject().hasAttr(attribute, Type.LABEL_LIST)) { + if (ruleContext.attributes().has(attribute, Type.LABEL_LIST)) { return ruleContext.getPrerequisites(attribute, mode, JavaPluginInfoProvider.class); } return ImmutableList.of(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java index b0cb6e9986..acf3ded639 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java @@ -88,7 +88,7 @@ public class TestSuite implements RuleConfiguredTargetFactory { private Iterable<? extends TransitiveInfoCollection> getPrerequisites( RuleContext ruleContext, String attributeName) { - if (ruleContext.getRule().getRuleClassObject().hasAttr(attributeName, Type.LABEL_LIST)) { + if (ruleContext.attributes().has(attributeName, Type.LABEL_LIST)) { return ruleContext.getPrerequisites(attributeName, Mode.TARGET); } else { return ImmutableList.<TransitiveInfoCollection>of(); @@ -96,7 +96,7 @@ public class TestSuite implements RuleConfiguredTargetFactory { } private void checkTestsAndSuites(RuleContext ruleContext, String attributeName) { - if (!ruleContext.getRule().getRuleClassObject().hasAttr(attributeName, Type.LABEL_LIST)) { + if (!ruleContext.attributes().has(attributeName, Type.LABEL_LIST)) { return; } for (TransitiveInfoCollection dep : ruleContext.getPrerequisites(attributeName, Mode.TARGET)) { |