aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis
diff options
context:
space:
mode:
authorGravatar cparsons <cparsons@google.com>2018-07-27 14:09:35 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-27 14:11:16 -0700
commitbe88b8539b30d1c36c68b0f6acfe1e9ae010db3b (patch)
treefd71ae0545427341011839d672129f5ed3df487d /src/main/java/com/google/devtools/build/lib/analysis
parentb6bf51dfc36007aa89aa6eb8fef0e1a158c91064 (diff)
Throw a rule error when a skylark rule implementation returns multiple providers of the same type.
RELNOTES: A rule error is now thrown if a Skylark rule implementation function returns multiple providers of the same type. PiperOrigin-RevId: 206371385
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java22
1 files changed, 16 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
index 1f2a184844..86dc965765 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
@@ -36,6 +36,7 @@ import com.google.devtools.build.lib.events.Location;
import com.google.devtools.build.lib.packages.AdvertisedProviderSet;
import com.google.devtools.build.lib.packages.Info;
import com.google.devtools.build.lib.packages.NativeProvider;
+import com.google.devtools.build.lib.packages.Provider;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.packages.SkylarkProviderIdentifier;
@@ -57,8 +58,8 @@ import com.google.devtools.build.lib.syntax.SkylarkType;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.util.FileTypeSet;
-import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Nullable;
@@ -290,7 +291,7 @@ public final class SkylarkRuleConfiguredTargetUtil {
throws EvalException {
Info oldStyleProviders = StructProvider.STRUCT.createEmpty(loc);
- ArrayList<Info> declaredProviders = new ArrayList<>();
+ Map<Provider.Key, Info> declaredProviders = new LinkedHashMap<>();
if (target instanceof Info) {
// Either an old-style struct or a single declared provider (not in a list)
@@ -310,12 +311,17 @@ public final class SkylarkRuleConfiguredTargetUtil {
Info.class,
loc,
"The value of 'providers' should be a sequence of declared providers");
- declaredProviders.add(declaredProvider);
+ Provider.Key providerKey = declaredProvider.getProvider().getKey();
+ if (declaredProviders.put(providerKey, declaredProvider) != null) {
+ context.getRuleContext().ruleError(
+ "Multiple conflicting returned providers with key " + providerKey);
+ }
}
}
} else {
+ Provider.Key providerKey = struct.getProvider().getKey();
// Single declared provider
- declaredProviders.add(struct);
+ declaredProviders.put(providerKey, struct);
}
} else if (target instanceof Iterable) {
// Sequence of declared providers
@@ -327,13 +333,17 @@ public final class SkylarkRuleConfiguredTargetUtil {
loc,
"A return value of a rule implementation function should be "
+ "a sequence of declared providers");
- declaredProviders.add(declaredProvider);
+ Provider.Key providerKey = declaredProvider.getProvider().getKey();
+ if (declaredProviders.put(providerKey, declaredProvider) != null) {
+ context.getRuleContext().ruleError(
+ "Multiple conflicting returned providers with key " + providerKey);
+ }
}
}
boolean defaultProviderProvidedExplicitly = false;
- for (Info declaredProvider : declaredProviders) {
+ for (Info declaredProvider : declaredProviders.values()) {
if (declaredProvider
.getProvider()
.getKey()