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/java/proto/JavaLiteProtoAspect.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/java/proto/JavaLiteProtoAspect.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java | 61 |
1 files changed, 28 insertions, 33 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java index 967756c490..05c0ad02d5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java @@ -16,24 +16,24 @@ package com.google.devtools.build.lib.rules.java.proto; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.Iterables.getOnlyElement; -import static com.google.common.collect.Iterables.transform; import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET; import static com.google.devtools.build.lib.cmdline.Label.parseAbsoluteUnchecked; import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST; import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; -import static com.google.devtools.build.lib.rules.java.proto.JavaCompilationArgsAspectProvider.GET_PROVIDER; -import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTransitiveFilesToBuildProvider.GET_JARS; import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap; +import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder; +import com.google.devtools.build.lib.analysis.WrappingProviderHelper; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode; import com.google.devtools.build.lib.cmdline.Label; @@ -98,8 +98,7 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured public ConfiguredAspect create( ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) throws InterruptedException { - ConfiguredAspect.Builder aspect = - new ConfiguredAspect.Builder(this, parameters, ruleContext); + ConfiguredAspect.Builder aspect = new ConfiguredAspect.Builder(this, parameters, ruleContext); // Get SupportData, which is provided by the proto_library rule we attach to. SupportData supportData = @@ -118,7 +117,7 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured .propagateAlongAttribute("deps") .requiresConfigurationFragments(JavaConfiguration.class, ProtoConfiguration.class) .requireProviders(ProtoSourcesProvider.class) - .advertiseProvider(JavaCompilationArgsAspectProvider.class) + .advertiseProvider(JavaProtoLibraryAspectProvider.class) .advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.PROTO_NAME)) .add( attr(PROTO_TOOLCHAIN_ATTR, LABEL) @@ -151,22 +150,23 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured * Java compilation action. */ private final JavaCompilationArgsProvider dependencyCompilationArgs; + private final JavaSemantics javaSemantics; + private final Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders; Impl( - final RuleContext ruleContext, - final SupportData supportData, - JavaSemantics javaSemantics) { + final RuleContext ruleContext, final SupportData supportData, JavaSemantics javaSemantics) { this.ruleContext = ruleContext; this.supportData = supportData; this.javaSemantics = javaSemantics; + this.javaProtoLibraryAspectProviders = + ruleContext.getPrerequisites( + "deps", RuleConfiguredTarget.Mode.TARGET, JavaProtoLibraryAspectProvider.class); dependencyCompilationArgs = JavaCompilationArgsProvider.merge( - Iterables.<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>transform( - this.<JavaCompilationArgsAspectProvider>getDeps( - JavaCompilationArgsAspectProvider.class), - GET_PROVIDER)); + WrappingProviderHelper.unwrapProviders( + javaProtoLibraryAspectProviders, JavaCompilationArgsProvider.class)); } void addProviders(ConfiguredAspect.Builder aspect) { @@ -176,11 +176,13 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured // The jars that this proto and its dependencies produce. Used to roll-up jars up to the // java_proto_library, to be put into filesToBuild. - NestedSetBuilder<Artifact> transitiveOutputJars = - NestedSetBuilder.fromNestedSets( - transform(getDeps(JavaProtoLibraryTransitiveFilesToBuildProvider.class), GET_JARS)); + NestedSetBuilder<Artifact> transitiveOutputJars = NestedSetBuilder.stableOrder(); + for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) { + transitiveOutputJars.addTransitive(provider.getJars()); + } - JavaSkylarkApiProvider.Builder skylarkApiProvider = JavaSkylarkApiProvider.builder(); + TransitiveInfoProviderMapBuilder javaProvidersBuilder = + new TransitiveInfoProviderMapBuilder(); if (supportData.hasProtoSources()) { Artifact sourceJar = getSourceJarArtifact(); @@ -205,26 +207,23 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured JavaSourceJarsProvider.create( NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), javaSourceJars); - skylarkApiProvider - .setRuleOutputJarsProvider(ruleOutputJarsProvider) - .setSourceJarsProvider(sourceJarsProvider); - - aspect.addProvider(new JavaSourceJarsAspectProvider(sourceJarsProvider)); + javaProvidersBuilder.add(ruleOutputJarsProvider).add(sourceJarsProvider); } else { // No sources - this proto_library is an alias library, which exports its dependencies. // Simply propagate the compilation-args from its dependencies. generatedCompilationArgsProvider = dependencyCompilationArgs; - skylarkApiProvider.setRuleOutputJarsProvider(JavaRuleOutputJarsProvider.builder().build()); + javaProvidersBuilder.add(JavaRuleOutputJarsProvider.EMPTY); } - skylarkApiProvider.setCompilationArgsProvider(generatedCompilationArgsProvider); + javaProvidersBuilder.add(generatedCompilationArgsProvider); + TransitiveInfoProviderMap javaProviders = javaProvidersBuilder.build(); aspect .addSkylarkTransitiveInfo( - JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), skylarkApiProvider.build()) - .addProviders( - new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars.build()), - new JavaCompilationArgsAspectProvider(generatedCompilationArgsProvider)); + JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), + JavaSkylarkApiProvider.fromProviderMap(javaProviders)) + .addProvider( + new JavaProtoLibraryAspectProvider(javaProviders, transitiveOutputJars.build())); } private void createProtoCompileAction(Artifact sourceJar) { @@ -277,9 +276,5 @@ public class JavaLiteProtoAspect extends NativeAspectClass implements Configured private Artifact getOutputJarArtifact() { return ruleContext.getBinArtifact("lib" + ruleContext.getLabel().getName() + "-lite.jar"); } - - private <C extends TransitiveInfoProvider> Iterable<C> getDeps(Class<C> clazz) { - return ruleContext.getPrerequisites("deps", TARGET, clazz); - } } } |