Encapsulates Target within ConfiguredTargetAndData.
Minor readability cleanups.
PiperOrigin-RevId: 494003401
Change-Id: I76e143c3229c568cac7a85b634d854477ee2292c
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 6c532fd..02f3225 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -71,10 +71,8 @@
import com.google.devtools.build.lib.packages.BuiltinProvider;
import com.google.devtools.build.lib.packages.ConfigurationFragmentPolicy;
import com.google.devtools.build.lib.packages.ConfiguredAttributeMapper;
-import com.google.devtools.build.lib.packages.FileTarget;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.Info;
-import com.google.devtools.build.lib.packages.InputFile;
import com.google.devtools.build.lib.packages.OutputFile;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.packages.Package.ConfigSettingVisibilityPolicy;
@@ -843,7 +841,7 @@
Map<String, Label> dict = attributes().get(attributeName, BuildType.LABEL_DICT_UNARY);
Map<Label, ConfiguredTarget> labelToDep = new HashMap<>();
for (ConfiguredTargetAndData dep : targetMap.get(attributeName)) {
- labelToDep.put(dep.getTarget().getLabel(), dep.getConfiguredTarget());
+ labelToDep.put(dep.getTargetLabel(), dep.getConfiguredTarget());
}
for (Map.Entry<String, Label> entry : dict.entrySet()) {
@@ -1947,11 +1945,9 @@
}
if (attribute.isSilentRuleClassFilter()) {
- Predicate<RuleClass> filter = attribute.getAllowedRuleClassesPredicate();
+ Predicate<String> filter = attribute.getAllowedRuleClassPredicate();
for (ConfiguredTargetAndData configuredTarget : entry.getValue()) {
- Target prerequisiteTarget = configuredTarget.getTarget();
- if ((prerequisiteTarget instanceof Rule)
- && filter.apply(((Rule) prerequisiteTarget).getRuleClassObject())) {
+ if (filter.apply(configuredTarget.getRuleClass())) {
validateDirectPrerequisite(attribute, configuredTarget);
mapBuilder.put(attribute.getName(), configuredTarget);
}
@@ -2019,52 +2015,45 @@
private void validateDirectPrerequisiteType(
ConfiguredTargetAndData prerequisite, Attribute attribute) {
- Target prerequisiteTarget = prerequisite.getTarget();
- Label prerequisiteLabel = prerequisiteTarget.getLabel();
-
- if (prerequisiteTarget instanceof Rule) {
- Rule prerequisiteRule = (Rule) prerequisiteTarget;
-
+ String ruleClass = prerequisite.getRuleClass();
+ if (!ruleClass.isEmpty()) {
String reason =
attribute
.getValidityPredicate()
- .checkValid(target.getAssociatedRule(), prerequisiteRule);
+ .checkValid(target.getAssociatedRule(), ruleClass, prerequisite.getRuleTags());
if (reason != null) {
reportBadPrerequisite(attribute, prerequisite, reason, false);
}
+ validateRuleDependency(prerequisite, attribute);
+ return;
}
- if (prerequisiteTarget instanceof Rule) {
- validateRuleDependency(prerequisite, attribute);
- } else if (prerequisiteTarget instanceof FileTarget) {
- if (attribute.isStrictLabelCheckingEnabled()) {
- if (!attribute
- .getAllowedFileTypesPredicate()
- .apply(((FileTarget) prerequisiteTarget).getFilename())) {
- if (prerequisiteTarget instanceof InputFile
- && !((InputFile) prerequisiteTarget).getPath().exists()) {
- // Misplaced labels, no corresponding target exists
- if (attribute.getAllowedFileTypesPredicate().isNone()
- && !((InputFile) prerequisiteTarget).getFilename().contains(".")) {
- // There are no allowed files in the attribute but it's not a valid rule,
- // and the filename doesn't contain a dot --> probably a misspelled rule
- attributeError(
- attribute.getName(), "rule '" + prerequisiteLabel + "' does not exist");
- } else {
- attributeError(
- attribute.getName(), "target '" + prerequisiteLabel + "' does not exist");
- }
- } else {
- // The file exists but has a bad extension
- reportBadPrerequisite(
- attribute,
- prerequisite,
- "expected " + attribute.getAllowedFileTypesPredicate(),
- false);
- }
- }
- }
+ if (!(prerequisite.isTargetFile() && attribute.isStrictLabelCheckingEnabled())) {
+ return;
}
+
+ Label prerequisiteTargetLabel = prerequisite.getTargetLabel();
+ if (attribute.getAllowedFileTypesPredicate().apply(prerequisiteTargetLabel.getName())) {
+ return;
+ }
+
+ if (prerequisite.isTargetInputFile() && !prerequisite.getInputPath().exists()) {
+ // Misplaced labels, no corresponding target exists
+ if (attribute.getAllowedFileTypesPredicate().isNone()
+ && !prerequisiteTargetLabel.getName().contains(".")) {
+ // There are no allowed files in the attribute but it's not a valid rule,
+ // and the filename doesn't contain a dot --> probably a misspelled rule
+ attributeError(
+ attribute.getName(), "rule '" + prerequisiteTargetLabel + "' does not exist");
+ } else {
+ attributeError(
+ attribute.getName(), "target '" + prerequisiteTargetLabel + "' does not exist");
+ }
+ return;
+ }
+ // The file exists but has a bad extension
+ reportBadPrerequisite(
+ attribute, prerequisite, "expected " + attribute.getAllowedFileTypesPredicate(), false);
}
/** Returns whether the context being constructed is for the evaluation of an aspect. */
@@ -2140,7 +2129,7 @@
if (attribute.isSingleArtifact() && !artifacts.isSingleton()) {
attributeError(
attribute.getName(),
- "'" + prerequisite.getTarget().getLabel() + "' must produce a single file");
+ "'" + prerequisite.getTargetLabel() + "' must produce a single file");
return;
}
for (Artifact sourceArtifact : artifacts.toList()) {
@@ -2154,7 +2143,7 @@
attributeError(
attribute.getName(),
"'"
- + prerequisite.getTarget().getLabel()
+ + prerequisite.getTargetLabel()
+ "' does not produce any "
+ getRuleClassNameForLogging()
+ " "
@@ -2197,19 +2186,21 @@
ConfiguredTargetAndData prerequisite,
Attribute attribute,
Set<String> unfulfilledRequirements) {
- if (attribute.getAllowedRuleClassesPredicate() != Predicates.<RuleClass>alwaysTrue()) {
- if (attribute
- .getAllowedRuleClassesPredicate()
- .apply(((Rule) prerequisite.getTarget()).getRuleClassObject())) {
- // prerequisite has an allowed rule class => accept.
- return true;
- }
- // remember that the rule class that was not allowed;
- // but maybe prerequisite provides required providers? do not reject yet.
- unfulfilledRequirements.add(
- badPrerequisiteMessage(
- prerequisite, "expected " + attribute.getAllowedRuleClassesPredicate(), false));
+ var predicate = attribute.getAllowedRuleClassPredicate();
+ if (predicate == Predicates.<String>alwaysTrue()) {
+ // alwaysTrue is a special sentinel value. See
+ // RuleClass.Builder.RuleClassNamePredicate.unspecified.
+ return false;
}
+
+ if (predicate.apply(prerequisite.getRuleClass())) {
+ // prerequisite has an allowed rule class => accept.
+ return true;
+ }
+ // remember that the rule class that was not allowed;
+ // but maybe prerequisite provides required providers? do not reject yet.
+ unfulfilledRequirements.add(
+ badPrerequisiteMessage(prerequisite, "expected " + predicate, false));
return false;
}
@@ -2220,21 +2211,20 @@
*/
private boolean checkRuleDependencyClassWarnings(
ConfiguredTargetAndData prerequisite, Attribute attribute) {
- if (attribute
- .getAllowedRuleClassesWarningPredicate()
- .apply(((Rule) prerequisite.getTarget()).getRuleClassObject())) {
- Predicate<RuleClass> allowedRuleClasses = attribute.getAllowedRuleClassesPredicate();
- reportBadPrerequisite(
- attribute,
- prerequisite,
- allowedRuleClasses == Predicates.<RuleClass>alwaysTrue()
- ? null
- : "expected " + allowedRuleClasses,
- true);
- // prerequisite has a rule class allowed with a warning => accept, emitting a warning.
- return true;
+ if (!attribute.getAllowedRuleClassWarningPredicate().apply(prerequisite.getRuleClass())) {
+ return false;
}
- return false;
+
+ Predicate<String> allowedRuleClasses = attribute.getAllowedRuleClassPredicate();
+ reportBadPrerequisite(
+ attribute,
+ prerequisite,
+ allowedRuleClasses == Predicates.<String>alwaysTrue()
+ ? null
+ : "expected " + allowedRuleClasses,
+ true);
+ // prerequisite has a rule class allowed with a warning => accept, emitting a warning.
+ return true;
}
/** Check if prerequisite should be allowed based on required providers on the attribute. */
@@ -2256,7 +2246,7 @@
unfulfilledRequirements.add(
String.format(
"'%s' does not have mandatory providers: %s",
- prerequisite.getTarget().getLabel(),
+ prerequisite.getTargetLabel(),
prerequisite
.getConfiguredTarget()
.missingProviders(requiredProviders)