aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar vladmos <vladmos@google.com>2017-03-29 14:11:13 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2017-03-29 19:28:25 +0200
commit629eeccbd1bc0af3a2e682a1cf154a543d07c2ca (patch)
tree06721172da62dbd6112db96deccc55bee3486748 /src/main/java/com/google/devtools
parent052c2dc7468ebb7b7ad256a02572938d5f64df6a (diff)
Resolve special provider names when checking for mandatory providers
If a rule requires a special provider that's (maybe) not provided explicitly but nevertheless available from a target, i.e. "files", the mandatory providers check should pass. Fixes #1490 PiperOrigin-RevId: 151571187
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java7
1 files changed, 6 insertions, 1 deletions
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 ca00f10ebb..8e195519b0 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
@@ -79,6 +79,7 @@ import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.rules.AliasProvider;
import com.google.devtools.build.lib.rules.fileset.FilesetProvider;
import com.google.devtools.build.lib.shell.ShellUtils;
+import com.google.devtools.build.lib.syntax.ClassObject;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.syntax.Type.LabelClass;
@@ -1818,7 +1819,11 @@ public final class RuleContext extends TargetContext
for (ImmutableSet<SkylarkProviderIdentifier> providers : mandatoryProvidersList) {
List<String> missing = new ArrayList<>();
for (SkylarkProviderIdentifier provider : providers) {
- if (prerequisite.get(provider) == null) {
+ // A rule may require a built-in provider that is always implicitly provided, e.g. "files"
+ ImmutableSet<String> availableKeys =
+ ImmutableSet.copyOf(((ClassObject) prerequisite).getKeys());
+ if ((prerequisite.get(provider) == null)
+ && !(provider.isLegacy() && availableKeys.contains(provider.getLegacyId()))) {
missing.add(provider.toString());
}
}