aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2017-06-19 15:31:04 -0400
committerGravatar Kristina Chodorow <kchodorow@google.com>2017-06-20 14:35:19 -0400
commit44dd226a540ace2ef1c348f778512616de82ce31 (patch)
tree909efeb0c6722e5a0917a7459bca58392b302c7e /src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
parent42b2c9ab57c8e593623138f414b55bcc2339f64d (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.java61
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);
- }
}
}