diff options
author | Googler <noreply@google.com> | 2017-06-19 15:31:04 -0400 |
---|---|---|
committer | Kristina Chodorow <kchodorow@google.com> | 2017-06-20 14:35:19 -0400 |
commit | 44dd226a540ace2ef1c348f778512616de82ce31 (patch) | |
tree | 909efeb0c6722e5a0917a7459bca58392b302c7e /src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java | |
parent | 42b2c9ab57c8e593623138f414b55bcc2339f64d (diff) |
Create a general WrappingProvider concept and use for java_proto_library and friends.
The wrapping provider contains its own provider map containing any providers that may conflict. This can be used generally for any aspect that wants to override its base providers (during migration), and due to the generality we should be able to cut down on code size and complexity.
Once we have this, we can more easily and uniformly bind aspects to Skylark for aspect-on-aspect functionality. The Skylark providers can be instantiated with a wrapping provider if one is present, or fall through to the base target if they aren't.
We will also likely save a bit of memory from cutting down on wrapping classes.
PiperOrigin-RevId: 159461325
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/android/DexArchiveAspect.java | 71 |
1 files changed, 44 insertions, 27 deletions
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 ff973cde35..101718ba8e 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 @@ -38,6 +38,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.analysis.WrappingProviderHelper; import com.google.devtools.build.lib.analysis.actions.CustomCommandLine; import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction; import com.google.devtools.build.lib.analysis.actions.SpawnAction; @@ -55,8 +56,8 @@ 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; import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; -import com.google.devtools.build.lib.rules.java.proto.JavaCompilationArgsAspectProvider; import com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect; +import com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryAspectProvider; import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider; import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; import java.util.HashMap; @@ -120,27 +121,39 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu @Override public AspectDefinition getDefinition(AspectParameters params) { - AspectDefinition.Builder result = new AspectDefinition.Builder(this) - .requireProviderSets( - ImmutableList.of( - // We care about JavaRuntimeJarProvider, but rules don't advertise that provider. - ImmutableSet.<Class<?>>of(JavaCompilationArgsProvider.class), - // For proto_library rules, where we care about JavaCompilationArgsAspectProvider. - ImmutableSet.<Class<?>>of(ProtoSourcesProvider.class), - // 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))) - // 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"))) - // Access to --android_sdk so we can stub in a bootclasspath for desugaring if missing - .add(attr(":dex_archive_android_sdk", LABEL) - .allowedRuleClasses("android_sdk", "filegroup") - .value(new AndroidRuleClasses.AndroidSdkLabel( - Label.parseAbsoluteUnchecked(toolsRepository + AndroidRuleClasses.DEFAULT_SDK)))) - .requiresConfigurationFragments(AndroidConfiguration.class) - .requireAspectsWithNativeProviders(JavaCompilationArgsAspectProvider.class); + AspectDefinition.Builder result = + new AspectDefinition.Builder(this) + .requireProviderSets( + ImmutableList.of( + // We care about JavaRuntimeJarProvider, but rules don't advertise that + // provider. + ImmutableSet.<Class<?>>of(JavaCompilationArgsProvider.class), + // For proto_library rules, where we care about + // JavaCompilationArgsAspectProvider. + ImmutableSet.<Class<?>>of(ProtoSourcesProvider.class), + // 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))) + // 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"))) + // Access to --android_sdk so we can stub in a bootclasspath for desugaring if missing + .add( + attr(":dex_archive_android_sdk", LABEL) + .allowedRuleClasses("android_sdk", "filegroup") + .value( + new AndroidRuleClasses.AndroidSdkLabel( + Label.parseAbsoluteUnchecked( + toolsRepository + AndroidRuleClasses.DEFAULT_SDK)))) + .requiresConfigurationFragments(AndroidConfiguration.class) + .requireAspectsWithNativeProviders(JavaProtoLibraryAspectProvider.class); if (TriState.valueOf(params.getOnlyValueOfAttribute("incremental_dexing")) != TriState.NO) { // Marginally improves "query2" precision for targets that disable incremental dexing result.add(attr(ASPECT_DEXBUILDER_PREREQ, LABEL).cfg(HOST).exec() @@ -250,10 +263,13 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu RuleContext ruleContext) { if (isProtoLibrary(ruleContext) && getAndroidConfig(ruleContext).incrementalDexingForLiteProtos()) { - JavaCompilationArgsAspectProvider javaProtos = - base.getProvider(JavaCompilationArgsAspectProvider.class); - if (javaProtos != null && !ruleContext.getPrerequisites("srcs", Mode.TARGET).isEmpty()) { - return javaProtos.provider.getJavaCompilationArgs().getRuntimeJars(); + if (!ruleContext.getPrerequisites("srcs", Mode.TARGET).isEmpty()) { + JavaCompilationArgsProvider javaCompilationArgsProvider = + WrappingProviderHelper.getWrappedProvider( + base, JavaProtoLibraryAspectProvider.class, JavaCompilationArgsProvider.class); + if (javaCompilationArgsProvider != null) { + return javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars(); + } } } else { JavaRuntimeJarProvider jarProvider = base.getProvider(JavaRuntimeJarProvider.class); @@ -267,7 +283,8 @@ public final class DexArchiveAspect extends NativeAspectClass implements Configu private static JavaCompilationArgsProvider getJavaCompilationArgsProvider(ConfiguredTarget base, RuleContext ruleContext) { if (isProtoLibrary(ruleContext)) { - return base.getProvider(JavaCompilationArgsAspectProvider.class).provider; + return WrappingProviderHelper.getWrappedProvider( + base, JavaProtoLibraryAspectProvider.class, JavaCompilationArgsProvider.class); } else { return base.getProvider(JavaCompilationArgsProvider.class); } |