diff options
author | 2017-03-29 14:11:13 +0000 | |
---|---|---|
committer | 2017-03-29 19:28:25 +0200 | |
commit | 629eeccbd1bc0af3a2e682a1cf154a543d07c2ca (patch) | |
tree | 06721172da62dbd6112db96deccc55bee3486748 /src/main/java/com/google/devtools | |
parent | 052c2dc7468ebb7b7ad256a02572938d5f64df6a (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.java | 7 |
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()); } } |