Do not execute aspect implementation if target advertizes but fails to provide a provider.
Previously we always executed the function, but didn't add the aspect to
the deps.
--
PiperOrigin-RevId: 148887089
MOS_MIGRATED_REVID=148887089
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
index 8339c8a..f1dc77d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java
@@ -98,6 +98,10 @@
return new ConfiguredAspect(real.descriptor, real.getProviders());
}
+ public static ConfiguredAspect forNonapplicableTarget(AspectDescriptor descriptor) {
+ return new ConfiguredAspect(descriptor, TransitiveInfoProviderMap.of());
+ }
+
/**
* Builder for {@link ConfiguredAspect}.
*/
diff --git a/src/main/java/com/google/devtools/build/lib/rules/Alias.java b/src/main/java/com/google/devtools/build/lib/rules/Alias.java
index 5b91f47..3a4570c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/Alias.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/Alias.java
@@ -63,8 +63,7 @@
.allowedFileTypes(FileTypeSet.ANY_FILE)
.allowedRuleClasses(ANY_RULE)
.mandatory())
- // Stopgap until b/35213665 is fixed: should be canHaveAnyProvider()
- .advertiseProvider(AliasProvider.class)
+ .canHaveAnyProvider()
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
index 20fe22d..b3f5cc5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java
@@ -50,7 +50,6 @@
import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.TriState;
-import com.google.devtools.build.lib.rules.AliasProvider;
import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
import com.google.devtools.build.lib.rules.java.JavaCompilationInfoProvider;
@@ -130,9 +129,7 @@
// For proto_lang_toolchain rules, where we just want to get at their runtime deps.
ImmutableSet.<Class<?>>of(ProtoLangToolchainProvider.class),
// For android_sdk rules, where we just want to get at aidl runtime deps.
- ImmutableSet.<Class<?>>of(AndroidSdkProvider.class),
- // Let this aspect "see through" alias targets until b/35213665 is fixed
- ImmutableSet.<Class<?>>of(AliasProvider.class)))
+ ImmutableSet.<Class<?>>of(AndroidSdkProvider.class)))
// Parse labels since we don't have RuleDefinitionEnvironment.getLabel like in a rule
.add(attr(ASPECT_DESUGAR_PREREQ, LABEL).cfg(HOST).exec()
.value(Label.parseAbsoluteUnchecked(toolsRepository + "//tools/android:desugar_java8")))
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
index 71f6912..8437ab9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java
@@ -427,17 +427,21 @@
return null;
}
- ConfiguredAspect configuredAspect =
- view.getConfiguredTargetFactory().createAspect(
- analysisEnvironment,
- associatedTarget,
- aspectPath,
- aspectFactory,
- aspect,
- directDeps,
- configConditions,
- aspectConfiguration,
- view.getHostConfiguration(aspectConfiguration));
+ ConfiguredAspect configuredAspect;
+ if (ConfiguredTargetFunction.aspectMatchesConfiguredTarget(associatedTarget, aspect)) {
+ configuredAspect = view.getConfiguredTargetFactory().createAspect(
+ analysisEnvironment,
+ associatedTarget,
+ aspectPath,
+ aspectFactory,
+ aspect,
+ directDeps,
+ configConditions,
+ aspectConfiguration,
+ view.getHostConfiguration(aspectConfiguration));
+ } else {
+ configuredAspect = ConfiguredAspect.forNonapplicableTarget(aspect.getDescriptor());
+ }
events.replayOn(env.getListener());
if (events.hasErrors()) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index c19e3c0..b0eaf3c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -91,7 +91,6 @@
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.Semaphore;
@@ -943,7 +942,7 @@
return aspectKey;
}
- private static boolean aspectMatchesConfiguredTarget(final ConfiguredTarget dep, Aspect aspect) {
+ static boolean aspectMatchesConfiguredTarget(final ConfiguredTarget dep, Aspect aspect) {
return aspect.getDefinition().getRequiredProviders().isSatisfiedBy(
new Predicate<Class<?>>() {
@Override