Do not crash when aspects provide duplicate things.
--
MOS_MIGRATED_REVID=138860974
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
index 9a5317f..81f99e6 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/MergedConfiguredTarget.java
@@ -31,6 +31,17 @@
private final ConfiguredTarget base;
private final TransitiveInfoProviderMap providers;
+ /**
+ * This exception is thrown when configured targets and aspects
+ * being merged provide duplicate things that they shouldn't
+ * (output groups or providers).
+ */
+ public static final class DuplicateException extends Exception {
+ public DuplicateException(String message) {
+ super(message);
+ }
+ }
+
private MergedConfiguredTarget(ConfiguredTarget base, TransitiveInfoProviderMap providers) {
super(base.getTarget(), base.getConfiguration());
this.base = base;
@@ -62,7 +73,8 @@
}
/** Creates an instance based on a configured target and a set of aspects. */
- public static ConfiguredTarget of(ConfiguredTarget base, Iterable<ConfiguredAspect> aspects) {
+ public static ConfiguredTarget of(ConfiguredTarget base, Iterable<ConfiguredAspect> aspects)
+ throws DuplicateException {
if (Iterables.isEmpty(aspects)) {
// If there are no aspects, don't bother with creating a proxy object
return base;