Skip building JackAspect when the base rule already provides Jack libraries.
Context:
AndroidLibrary provides JavaSourceInfoProvider, which JackAspect wants.
But it doesn't advertise it, so it will never have JackAspect applied.
This is good, because they both have an :android_sdk attribute and
want to provide JackLibraryProvider.
Rules in the external repository created with bind() don't have their
real advertisements, but instead are considered to advertise everything.
So, when an android_library depends on another android_library through
a bind() alias...
Boom.
This avoids the boom by making JackAspect bail out immediately if its
current target looks like an Android rule. It wouldn't be doing anything
useful anyway if the base rule already provides Jack libraries.
Fixes #1222.
--
MOS_MIGRATED_REVID=121401981
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
index 1f22fae..d08ece6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/JackAspect.java
@@ -75,6 +75,9 @@
@Override
public ConfiguredAspect create(
ConfiguredTarget base, RuleContext ruleContext, AspectParameters params) {
+ if (base.getProvider(JackLibraryProvider.class) != null) {
+ return new ConfiguredAspect.Builder(NAME, ruleContext).build();
+ }
JavaSourceInfoProvider sourceProvider = base.getProvider(JavaSourceInfoProvider.class);
PathFragment rulePath = ruleContext.getLabel().toPathFragment();
PathFragment jackLibraryPath = rulePath.replaceName("lib" + rulePath.getBaseName() + ".jack");