Changed mandatoryProviders to mandatoryProvidersList
"mandatoryProvidersList" is a list of sets of providers. For any rule, if it provides
all the providers from one of those sets, we consider the dependency valid.
--
MOS_MIGRATED_REVID=115221394
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 f0fecff..9fd4fd4 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
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.analysis;
+import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
@@ -1660,12 +1661,40 @@
}
private void validateMandatoryProviders(ConfiguredTarget prerequisite, Attribute attribute) {
- for (String provider : attribute.getMandatoryProviders()) {
- if (prerequisite.get(provider) == null) {
- attributeError(attribute.getName(), "'" + prerequisite.getLabel()
- + "' does not have mandatory provider '" + provider + "'");
+ List<ImmutableSet<String>> mandatoryProvidersList = attribute.getMandatoryProvidersList();
+ if (mandatoryProvidersList.isEmpty()) {
+ return;
+ }
+ List<List<String>> missingProvidersList = new ArrayList<>();
+ for (ImmutableSet<String> providers : mandatoryProvidersList) {
+ List<String> missing = new ArrayList<>();
+ for (String provider : providers) {
+ if (prerequisite.get(provider) == null) {
+ missing.add(provider);
+ }
+ }
+ if (missing.isEmpty()) {
+ return;
+ } else {
+ missingProvidersList.add(missing);
}
}
+ StringBuilder missingProviders = new StringBuilder();
+ Joiner joinProvider = Joiner.on("', '");
+ for (List<String> providers : missingProvidersList) {
+ if (missingProviders.length() > 0) {
+ missingProviders.append(" or ");
+ }
+ missingProviders.append((providers.size() > 1) ? "[" : "")
+ .append("'");
+ joinProvider.appendTo(missingProviders, providers);
+ missingProviders.append("'")
+ .append((providers.size() > 1) ? "]" : "");
+ }
+ attributeError(
+ attribute.getName(),
+ "'" + prerequisite.getLabel() + "' does not have mandatory provider "
+ + missingProviders);
}
private void validateDirectPrerequisite(Attribute attribute, ConfiguredTarget prerequisite) {