aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/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
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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java117
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java37
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java48
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java61
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java56
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java62
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java51
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java41
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java47
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java44
16 files changed, 213 insertions, 408 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index 253cb78cb9..4a927b8c8b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -399,17 +399,14 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
}
JavaRuleOutputJarsProvider ruleOutputJarsProvider = ruleOutputJarsProviderBuilder.build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider);
- common.addTransitiveInfoProviders(builder, skylarkApiProvider, filesToBuild, classJar);
- common.addGenJarsProvider(builder, skylarkApiProvider, genClassJar, genSourceJar);
+ common.addTransitiveInfoProviders(builder, filesToBuild, classJar);
+ common.addGenJarsProvider(builder, genClassJar, genSourceJar);
return builder
.setFilesToBuild(filesToBuild)
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
.add(RunfilesProvider.class, runfilesProvider)
// The executable to run (below) may be different from the executable for runfiles (the one
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 92e2ae5183..082552b9d4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -656,16 +656,13 @@ public class JavaCommon {
public void addTransitiveInfoProviders(
RuleConfiguredTargetBuilder builder,
- JavaSkylarkApiProvider.Builder skylarkApiProvider,
NestedSet<Artifact> filesToBuild,
@Nullable Artifact classJar) {
- addTransitiveInfoProviders(
- builder, skylarkApiProvider, filesToBuild, classJar, JAVA_COLLECTION_SPEC);
+ addTransitiveInfoProviders(builder, filesToBuild, classJar, JAVA_COLLECTION_SPEC);
}
public void addTransitiveInfoProviders(
RuleConfiguredTargetBuilder builder,
- JavaSkylarkApiProvider.Builder skylarkApiProvider,
NestedSet<Artifact> filesToBuild,
@Nullable Artifact classJar,
InstrumentationSpec instrumentationSpec) {
@@ -673,10 +670,6 @@ public class JavaCommon {
JavaCompilationInfoProvider compilationInfoProvider = createCompilationInfoProvider();
JavaExportsProvider exportsProvider = collectTransitiveExports();
- skylarkApiProvider
- .setCompilationInfoProvider(compilationInfoProvider)
- .setExportsProvider(exportsProvider);
-
builder
.add(
InstrumentedFilesProvider.class,
@@ -700,7 +693,6 @@ public class JavaCommon {
public void addGenJarsProvider(
RuleConfiguredTargetBuilder builder,
- JavaSkylarkApiProvider.Builder javaSkylarkApiProvider,
@Nullable Artifact genClassJar,
@Nullable Artifact genSourceJar) {
JavaGenJarsProvider genJarsProvider = collectTransitiveGenJars(
@@ -711,7 +703,6 @@ public class JavaCommon {
genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenClassJars());
genJarsBuilder.addTransitive(genJarsProvider.getTransitiveGenSourceJars());
- javaSkylarkApiProvider.setGenJarsProvider(genJarsProvider);
builder
.add(JavaGenJarsProvider.class, genJarsProvider)
.addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genJarsBuilder.build());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
index 837a270172..d93f4dba1e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
@@ -21,6 +21,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import java.util.List;
/**
* An interface for objects that provide information on how to include them in
@@ -86,7 +87,11 @@ public abstract class JavaCompilationArgsProvider implements TransitiveInfoProvi
*/
public abstract NestedSet<Artifact> getRunTimeJavaDependencyArtifacts();
- public static JavaCompilationArgsProvider merge(Iterable<JavaCompilationArgsProvider> providers) {
+ public static JavaCompilationArgsProvider merge(List<JavaCompilationArgsProvider> providers) {
+ if (providers.size() == 1) {
+ return providers.get(0);
+ }
+
JavaCompilationArgs.Builder javaCompilationArgs = JavaCompilationArgs.builder();
JavaCompilationArgs.Builder recursiveJavaCompilationArgs = JavaCompilationArgs.builder();
NestedSetBuilder<Artifact> compileTimeJavaDepArtifacts = NestedSetBuilder.stableOrder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index a3393c9d44..5fd09b5ca9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -155,12 +155,7 @@ public class JavaImport implements RuleConfiguredTargetFactory {
JavaSourceJarsProvider.create(transitiveJavaSourceJars, srcJars);
JavaCompilationArgsProvider compilationArgsProvider =
JavaCompilationArgsProvider.create(javaCompilationArgs, recursiveJavaCompilationArgs);
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(compilationArgsProvider);
- common.addTransitiveInfoProviders(ruleBuilder, skylarkApiProvider, filesToBuild, null);
+ common.addTransitiveInfoProviders(ruleBuilder, filesToBuild, null);
JavaProvider javaProvider = JavaProvider.Builder.create()
.addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider)
.addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
@@ -168,7 +163,8 @@ public class JavaImport implements RuleConfiguredTargetFactory {
.build();
return ruleBuilder
.setFilesToBuild(filesToBuild)
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addNativeDeclaredProvider(javaProvider)
.addProvider(JavaProvider.class, javaProvider)
.add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 0ce54d643a..c08ddb7f2c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -203,15 +203,10 @@ public class JavaLibrary implements RuleConfiguredTargetFactory {
compileTimeJavaDepArtifacts, runTimeJavaDepArtifacts);
JavaSourceJarsProvider sourceJarsProvider = sourceJarsProviderBuilder.build();
JavaRuleOutputJarsProvider ruleOutputJarsProvider = ruleOutputJarsProviderBuilder.build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(compilationArgsProvider);
NestedSet<Artifact> filesToBuild = filesBuilder.build();
- common.addTransitiveInfoProviders(builder, skylarkApiProvider, filesToBuild, classJar);
- common.addGenJarsProvider(builder, skylarkApiProvider, genClassJar, genSourceJar);
+ common.addTransitiveInfoProviders(builder, filesToBuild, classJar);
+ common.addGenJarsProvider(builder, genClassJar, genSourceJar);
NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs();
@@ -224,7 +219,8 @@ public class JavaLibrary implements RuleConfiguredTargetFactory {
// java_library doesn't need to return JavaRunfilesProvider
.build();
builder
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
.addProvider(ruleOutputJarsProvider)
.addProvider(new JavaRuntimeJarProvider(javaArtifacts.getRuntimeJars()))
.addProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
index 0cc5dfd2a8..7d799325da 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiProvider.java
@@ -14,9 +14,9 @@
package com.google.devtools.build.lib.rules.java;
-import static com.google.common.base.Preconditions.checkNotNull;
-
import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -47,26 +47,31 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
public static final SkylarkProviderIdentifier PROTO_NAME =
SkylarkProviderIdentifier.forLegacy("proto_java");
- private final JavaRuleOutputJarsProvider ruleOutputJarsProvider;
- @Nullable private final JavaSourceJarsProvider sourceJarsProvider;
- @Nullable private final JavaGenJarsProvider genJarsProvider;
- @Nullable private final JavaCompilationInfoProvider compilationInfoProvider;
- @Nullable private final JavaCompilationArgsProvider compilationArgsProvider;
- @Nullable private final JavaExportsProvider exportsProvider;
-
- private JavaSkylarkApiProvider(
- JavaRuleOutputJarsProvider ruleOutputJarsProvider,
- @Nullable JavaSourceJarsProvider sourceJarsProvider,
- @Nullable JavaGenJarsProvider genJarsProvider,
- @Nullable JavaCompilationInfoProvider compilationInfoProvider,
- @Nullable JavaCompilationArgsProvider compilationArgsProvider,
- @Nullable JavaExportsProvider exportsProvider) {
- this.compilationInfoProvider = compilationInfoProvider;
- this.ruleOutputJarsProvider = ruleOutputJarsProvider;
- this.sourceJarsProvider = sourceJarsProvider;
- this.genJarsProvider = genJarsProvider;
- this.compilationArgsProvider = compilationArgsProvider;
- this.exportsProvider = exportsProvider;
+ @Nullable private final TransitiveInfoProviderMap transitiveInfoProviderMap;
+
+ public static JavaSkylarkApiProvider fromRuleContext() {
+ return new JavaSkylarkApiProvider();
+ }
+
+ public static JavaSkylarkApiProvider fromProviderMap(
+ TransitiveInfoProviderMap transitiveInfoProviderMap) {
+ return new JavaSkylarkApiProvider(transitiveInfoProviderMap);
+ }
+
+ private JavaSkylarkApiProvider() {
+ this.transitiveInfoProviderMap = null;
+ }
+
+ private JavaSkylarkApiProvider(TransitiveInfoProviderMap transitiveInfoProviderMap) {
+ this.transitiveInfoProviderMap = transitiveInfoProviderMap;
+ }
+
+ @Nullable
+ private <P extends TransitiveInfoProvider> P getProvider(Class<P> provider) {
+ if (transitiveInfoProviderMap != null) {
+ return transitiveInfoProviderMap.getProvider(provider);
+ }
+ return getInfo().getProvider(provider);
}
@SkylarkCallable(
@@ -75,6 +80,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getSourceJars() {
+ JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
if (sourceJarsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -87,6 +93,8 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getTransitiveDeps() {
+ JavaCompilationArgsProvider compilationArgsProvider =
+ getProvider(JavaCompilationArgsProvider.class);
if (compilationArgsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -99,6 +107,8 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getTransitiveRuntimeDeps() {
+ JavaCompilationArgsProvider compilationArgsProvider =
+ getProvider(JavaCompilationArgsProvider.class);
if (compilationArgsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -113,6 +123,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public NestedSet<Artifact> getTransitiveSourceJars() {
+ JavaSourceJarsProvider sourceJarsProvider = getProvider(JavaSourceJarsProvider.class);
if (sourceJarsProvider == null) {
return NestedSetBuilder.emptySet(Order.STABLE_ORDER);
}
@@ -125,7 +136,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
structField = true
)
public JavaRuleOutputJarsProvider getOutputJars() {
- return ruleOutputJarsProvider;
+ return getProvider(JavaRuleOutputJarsProvider.class);
}
@SkylarkCallable(
@@ -134,6 +145,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns transitive set of labels that are being exported from this rule."
)
public NestedSet<Label> getTransitiveExports() {
+ JavaExportsProvider exportsProvider = getProvider(JavaExportsProvider.class);
if (exportsProvider != null) {
return exportsProvider.getTransitiveExports();
} else {
@@ -148,7 +160,7 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns information about annotation processing for this Java target."
)
public JavaGenJarsProvider getGenJarsProvider() {
- return genJarsProvider;
+ return getProvider(JavaGenJarsProvider.class);
}
@SkylarkCallable(
@@ -158,61 +170,6 @@ public final class JavaSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns compilation information for this Java target."
)
public JavaCompilationInfoProvider getCompilationInfoProvider() {
- return compilationInfoProvider;
- }
-
- public static Builder builder() {
- return new Builder();
- }
-
- /** Builder for {@link JavaSkylarkApiProvider} */
- public static class Builder {
- private JavaRuleOutputJarsProvider ruleOutputJarsProvider;
- private JavaSourceJarsProvider sourceJarsProvider;
- private JavaGenJarsProvider genJarsProvider;
- private JavaCompilationInfoProvider compilationInfoProvider;
- private JavaCompilationArgsProvider compilationArgsProvider;
- private JavaExportsProvider exportsProvider;
-
- public Builder setRuleOutputJarsProvider(JavaRuleOutputJarsProvider ruleOutputJarsProvider) {
- this.ruleOutputJarsProvider = ruleOutputJarsProvider;
- return this;
- }
-
- public Builder setSourceJarsProvider(JavaSourceJarsProvider sourceJarsProvider) {
- this.sourceJarsProvider = sourceJarsProvider;
- return this;
- }
-
- public Builder setGenJarsProvider(JavaGenJarsProvider genJarsProvider) {
- this.genJarsProvider = genJarsProvider;
- return this;
- }
-
- public Builder setCompilationInfoProvider(JavaCompilationInfoProvider compilationInfoProvider) {
- this.compilationInfoProvider = compilationInfoProvider;
- return this;
- }
-
- public Builder setCompilationArgsProvider(JavaCompilationArgsProvider compilationArgsProvider) {
- this.compilationArgsProvider = compilationArgsProvider;
- return this;
- }
-
- public Builder setExportsProvider(JavaExportsProvider exportsProvider) {
- this.exportsProvider = exportsProvider;
- return this;
- }
-
- public JavaSkylarkApiProvider build() {
- checkNotNull(ruleOutputJarsProvider, "Must provide JavaRuleOutputJarsProvider");
- return new JavaSkylarkApiProvider(
- ruleOutputJarsProvider,
- sourceJarsProvider,
- genJarsProvider,
- compilationInfoProvider,
- compilationArgsProvider,
- exportsProvider);
- }
+ return getProvider(JavaCompilationInfoProvider.class);
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java
index 122ead0ca8..2907e26fb7 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import java.util.List;
/** The collection of source jars from the transitive closure. */
@AutoValue
@@ -45,7 +46,10 @@ public abstract class JavaSourceJarsProvider implements TransitiveInfoProvider {
/** Return the source jars that are to be built when the target is on the command line. */
public abstract ImmutableList<Artifact> getSourceJars();
- public static JavaSourceJarsProvider merge(Iterable<JavaSourceJarsProvider> providers) {
+ public static JavaSourceJarsProvider merge(List<JavaSourceJarsProvider> providers) {
+ if (providers.size() == 1) {
+ return providers.get(0);
+ }
JavaSourceJarsProvider.Builder result = builder();
for (JavaSourceJarsProvider provider : providers) {
result.mergeFrom(provider);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java
index bb75a937d5..b58923fb65 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/ActionReuser.java
@@ -17,17 +17,16 @@ 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.isEmpty;
-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.rules.java.JavaCompilationArgs.ClasspathType.BOTH;
-import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTransitiveFilesToBuildProvider.GET_JARS;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredAspect;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.RuleContext;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgs;
@@ -75,28 +74,26 @@ public class ActionReuser {
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER));
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(
- createOutputJarProvider(outputJar, compileTimeJar, sourceJar))
- .setSourceJarsProvider(createSrcJarProvider(sourceJar))
- .setCompilationArgsProvider(compilationArgsProvider);
+ TransitiveInfoProviderMapBuilder javaProvidersBuilder =
+ new TransitiveInfoProviderMapBuilder()
+ .add(createOutputJarProvider(outputJar, compileTimeJar, sourceJar))
+ .add(createSrcJarProvider(sourceJar))
+ .add(compilationArgsProvider);
- NestedSet<Artifact> transitiveOutputJars =
- NestedSetBuilder.fromNestedSets(
- transform(
- ruleContext.getPrerequisites(
- "deps", TARGET, JavaProtoLibraryTransitiveFilesToBuildProvider.class),
- GET_JARS))
- .add(outputJar)
- .build();
+ NestedSetBuilder<Artifact> transitiveOutputJars = NestedSetBuilder.stableOrder();
+ for (JavaProtoLibraryAspectProvider provider :
+ ruleContext.getPrerequisites("deps", TARGET, JavaProtoLibraryAspectProvider.class)) {
+ transitiveOutputJars.addTransitive(provider.getJars());
+ }
+ transitiveOutputJars.add(outputJar);
+ TransitiveInfoProviderMap javaProviders = javaProvidersBuilder.build();
aspect
.addSkylarkTransitiveInfo(
- JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), skylarkApiProvider.build())
+ JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(),
+ JavaSkylarkApiProvider.fromProviderMap(javaProviders))
.addProviders(
- new JavaProtoLibraryTransitiveFilesToBuildProvider(transitiveOutputJars),
- new JavaCompilationArgsAspectProvider(compilationArgsProvider));
+ new JavaProtoLibraryAspectProvider(javaProviders, transitiveOutputJars.build()));
return true;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java
deleted file mode 100644
index 1169eb4193..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaCompilationArgsAspectProvider.java
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright 2016 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.java.proto;
-
-import com.google.common.base.Function;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
-
-import javax.annotation.Nullable;
-
-/**
- * A wrapper around {@link JavaCompilationArgsProvider}.
- */
-public class JavaCompilationArgsAspectProvider implements TransitiveInfoProvider {
-
- /**
- * A long way to say (wrapper) -> wrapper.provider.
- */
- public static final Function<
- ? super JavaCompilationArgsAspectProvider, ? extends JavaCompilationArgsProvider>
- GET_PROVIDER =
- new Function<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>() {
- @Nullable
- @Override
- public JavaCompilationArgsProvider apply(
- @Nullable JavaCompilationArgsAspectProvider wrapper) {
- return wrapper == null ? null : wrapper.provider;
- }
- };
-
- public final JavaCompilationArgsProvider provider;
-
- public JavaCompilationArgsAspectProvider(JavaCompilationArgsProvider provider) {
- this.provider = provider;
- }
-}
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);
- }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
index de91377b10..83178e8149 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
@@ -20,7 +20,6 @@ import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER
import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_ATTR;
import com.google.common.collect.ImmutableMultimap;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
@@ -30,7 +29,7 @@ import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.WrappingProviderHelper;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
@@ -53,42 +52,37 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
public ConfiguredTarget create(final RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
+ Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, JavaProtoLibraryAspectProvider.class);
+
JavaCompilationArgsProvider dependencyArgsProviders =
JavaCompilationArgsProvider.merge(
- Iterables.<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>transform(
- getDeps(ruleContext, JavaCompilationArgsAspectProvider.class),
- JavaCompilationArgsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaCompilationArgsProvider.class));
if (!StrictDepsUtils.isStrictDepsJavaProtoLibrary(ruleContext)) {
dependencyArgsProviders = StrictDepsUtils.makeNonStrict(dependencyArgsProviders);
}
- Runfiles runfiles = new Runfiles.Builder(ruleContext.getWorkspaceName()).addArtifacts(
- dependencyArgsProviders.getRecursiveJavaCompilationArgs().getRuntimeJars()).build();
+ Runfiles runfiles =
+ new Runfiles.Builder(ruleContext.getWorkspaceName())
+ .addArtifacts(
+ dependencyArgsProviders.getRecursiveJavaCompilationArgs().getRuntimeJars())
+ .build();
JavaSourceJarsProvider sourceJarsProvider =
JavaSourceJarsProvider.merge(
- Iterables.<JavaSourceJarsAspectProvider, JavaSourceJarsProvider>transform(
- getDeps(ruleContext, JavaSourceJarsAspectProvider.class),
- JavaSourceJarsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaSourceJarsProvider.class));
NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
filesToBuild.addAll(sourceJarsProvider.getSourceJars());
- for (JavaProtoLibraryTransitiveFilesToBuildProvider provider : ruleContext.getPrerequisites(
- "deps", Mode.TARGET, JavaProtoLibraryTransitiveFilesToBuildProvider.class)) {
+ for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) {
filesToBuild.addTransitive(provider.getJars());
}
- JavaRuleOutputJarsProvider javaRuleOutputJarsProvider =
- JavaRuleOutputJarsProvider.builder().build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(javaRuleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(dependencyArgsProviders);
-
JavaRunfilesProvider javaRunfilesProvider = new JavaRunfilesProvider(runfiles);
JavaProvider javaProvider =
@@ -104,15 +98,16 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(filesToBuild.build())
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
- .addProvider(RunfilesProvider.class, RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
+ .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
.addOutputGroup(
OutputGroupProvider.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
- .add(JavaCompilationArgsProvider.class, dependencyArgsProviders)
- .add(JavaSourceJarsProvider.class, sourceJarsProvider)
- .add(JavaRunfilesProvider.class, javaRunfilesProvider)
- .add(ProguardSpecProvider.class, getJavaLiteRuntimeSpec(ruleContext))
- .add(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProvider)
+ .addProvider(dependencyArgsProviders)
+ .addProvider(sourceJarsProvider)
+ .addProvider(javaRunfilesProvider)
+ .addProvider(getJavaLiteRuntimeSpec(ruleContext))
+ .addProvider(JavaRuleOutputJarsProvider.EMPTY)
.addProvider(javaProvider)
.addNativeDeclaredProvider(javaProvider)
.build();
@@ -123,17 +118,12 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
ProtoJavaApiInfoAspectProvider.Builder protoJavaApiInfoAspectProvider =
ProtoJavaApiInfoAspectProvider.builder();
for (ProtoJavaApiInfoProvider protoJavaApiInfoProvider :
- getDeps(ruleContext, ProtoJavaApiInfoProvider.class)) {
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ProtoJavaApiInfoProvider.class)) {
protoJavaApiInfoAspectProvider.add(protoJavaApiInfoProvider).build();
}
return protoJavaApiInfoAspectProvider.build();
}
- private <C extends TransitiveInfoProvider> Iterable<C> getDeps(
- RuleContext ruleContext, Class<C> clazz) {
- return ruleContext.getPrerequisites("deps", TARGET, clazz);
- }
-
private ProguardSpecProvider getJavaLiteRuntimeSpec(RuleContext ruleContext) {
NestedSet<Artifact> specs =
new ProguardLibrary(ruleContext).collectProguardSpecs(ImmutableMultimap.<Mode, String>of());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
index 36be8ab52c..7e0b23d7cf 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoAspect.java
@@ -16,24 +16,23 @@ 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;
@@ -102,8 +101,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
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);
if (!rpcSupport.checkAttributes(ruleContext, parameters)) {
return aspect.build();
@@ -128,7 +126,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
.propagateAlongAttribute("deps")
.requiresConfigurationFragments(JavaConfiguration.class, ProtoConfiguration.class)
.requireProviders(ProtoSourcesProvider.class)
- .advertiseProvider(JavaCompilationArgsAspectProvider.class)
+ .advertiseProvider(JavaProtoLibraryAspectProvider.class)
.advertiseProvider(ImmutableList.of(JavaSkylarkApiProvider.PROTO_NAME))
.add(
attr(SPEED_PROTO_TOOLCHAIN_ATTR, LABEL)
@@ -167,6 +165,8 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
*/
private final JavaCompilationArgsProvider dependencyCompilationArgs;
+ private final Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders;
+
Impl(
final RuleContext ruleContext,
final SupportData supportData,
@@ -176,13 +176,14 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
this.supportData = supportData;
this.javaSemantics = javaSemantics;
this.rpcSupport = rpcSupport;
+ 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) {
@@ -192,11 +193,13 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
// 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 (shouldGenerateCode()) {
Artifact sourceJar = getSourceJarArtifact();
@@ -221,25 +224,20 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
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));
+ .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.PROTO_NAME.getLegacyId(), javaProviders)
+ .addProvider(
+ new JavaProtoLibraryAspectProvider(javaProviders, transitiveOutputJars.build()));
}
/**
@@ -286,9 +284,7 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
.setOutput(outputJar)
.addSourceJars(sourceJar)
.setJavacOpts(ProtoJavacOpts.constructJavacOpts(ruleContext));
- helper
- .addDep(dependencyCompilationArgs)
- .setCompilationStrictDepsMode(StrictDepsMode.OFF);
+ helper.addDep(dependencyCompilationArgs).setCompilationStrictDepsMode(StrictDepsMode.OFF);
TransitiveInfoCollection runtime = getProtoToolchainProvider().runtime();
if (runtime != null) {
helper.addDep(runtime.getProvider(JavaCompilationArgsProvider.class));
@@ -316,9 +312,5 @@ public class JavaProtoAspect extends NativeAspectClass implements ConfiguredAspe
private Artifact getOutputJarArtifact() {
return ruleContext.getBinArtifact("lib" + ruleContext.getLabel().getName() + "-speed.jar");
}
-
- private <C extends TransitiveInfoProvider> Iterable<C> getDeps(Class<C> clazz) {
- return ruleContext.getPrerequisites("deps", TARGET, clazz);
- }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
index 68c92f489f..545f2c6d4b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java
@@ -14,10 +14,8 @@
package com.google.devtools.build.lib.rules.java.proto;
-import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER;
-import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
@@ -26,7 +24,7 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.Runfiles;
import com.google.devtools.build.lib.analysis.RunfilesProvider;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.WrappingProviderHelper;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
@@ -45,12 +43,13 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
public ConfiguredTarget create(final RuleContext ruleContext)
throws InterruptedException, RuleErrorException {
+ Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders =
+ ruleContext.getPrerequisites("deps", Mode.TARGET, JavaProtoLibraryAspectProvider.class);
+
JavaCompilationArgsProvider dependencyArgsProviders =
JavaCompilationArgsProvider.merge(
- Iterables.<JavaCompilationArgsAspectProvider, JavaCompilationArgsProvider>transform(
- this.<JavaCompilationArgsAspectProvider>getDeps(
- ruleContext, JavaCompilationArgsAspectProvider.class),
- JavaCompilationArgsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaCompilationArgsProvider.class));
if (!StrictDepsUtils.isStrictDepsJavaProtoLibrary(ruleContext)) {
dependencyArgsProviders = StrictDepsUtils.makeNonStrict(dependencyArgsProviders);
@@ -64,29 +63,17 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
JavaSourceJarsProvider sourceJarsProvider =
JavaSourceJarsProvider.merge(
- Iterables.<JavaSourceJarsAspectProvider, JavaSourceJarsProvider>transform(
- this.<JavaSourceJarsAspectProvider>getDeps(
- ruleContext, JavaSourceJarsAspectProvider.class),
- JavaSourceJarsAspectProvider.GET_PROVIDER));
+ WrappingProviderHelper.unwrapProviders(
+ javaProtoLibraryAspectProviders, JavaSourceJarsProvider.class));
NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder();
filesToBuild.addAll(sourceJarsProvider.getSourceJars());
- for (JavaProtoLibraryTransitiveFilesToBuildProvider provider :
- ruleContext.getPrerequisites(
- "deps", Mode.TARGET, JavaProtoLibraryTransitiveFilesToBuildProvider.class)) {
+ for (JavaProtoLibraryAspectProvider provider : javaProtoLibraryAspectProviders) {
filesToBuild.addTransitive(provider.getJars());
}
- JavaRuleOutputJarsProvider ruleOutputJarsProvider =
- JavaRuleOutputJarsProvider.builder().build();
- JavaSkylarkApiProvider.Builder skylarkApiProvider =
- JavaSkylarkApiProvider.builder()
- .setRuleOutputJarsProvider(ruleOutputJarsProvider)
- .setSourceJarsProvider(sourceJarsProvider)
- .setCompilationArgsProvider(dependencyArgsProviders);
-
JavaRunfilesProvider javaRunfilesProvider = new JavaRunfilesProvider(runfiles);
JavaProvider javaProvider =
@@ -102,14 +89,15 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(filesToBuild.build())
- .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, skylarkApiProvider.build())
- .addProvider(RunfilesProvider.class, RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
+ .addSkylarkTransitiveInfo(
+ JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext())
+ .addProvider(RunfilesProvider.withData(Runfiles.EMPTY, runfiles))
.addOutputGroup(
OutputGroupProvider.DEFAULT, NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
- .add(JavaCompilationArgsProvider.class, dependencyArgsProviders)
- .add(JavaSourceJarsProvider.class, sourceJarsProvider)
- .add(JavaRunfilesProvider.class, javaRunfilesProvider)
- .add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider)
+ .addProvider(dependencyArgsProviders)
+ .addProvider(sourceJarsProvider)
+ .addProvider(javaRunfilesProvider)
+ .addProvider(JavaRuleOutputJarsProvider.EMPTY)
.addProvider(javaProvider)
.addNativeDeclaredProvider(javaProvider)
.build();
@@ -120,14 +108,9 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory {
ProtoJavaApiInfoAspectProvider.Builder protoJavaApiInfoAspectProvider =
ProtoJavaApiInfoAspectProvider.builder();
for (ProtoJavaApiInfoProvider protoJavaApiInfoProvider :
- getDeps(ruleContext, ProtoJavaApiInfoProvider.class)) {
+ ruleContext.getPrerequisites("deps", Mode.TARGET, ProtoJavaApiInfoProvider.class)) {
protoJavaApiInfoAspectProvider.add(protoJavaApiInfoProvider).build();
}
return protoJavaApiInfoAspectProvider.build();
}
-
- private <C extends TransitiveInfoProvider> Iterable<C> getDeps(
- RuleContext ruleContext, Class<C> clazz) {
- return ruleContext.getPrerequisites("deps", TARGET, clazz);
- }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java
new file mode 100644
index 0000000000..3124e54515
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryAspectProvider.java
@@ -0,0 +1,41 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.rules.java.proto;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
+import com.google.devtools.build.lib.analysis.WrappingProvider;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+
+/** A provider used to communicate information between java_proto_library and its aspect. */
+public class JavaProtoLibraryAspectProvider implements WrappingProvider {
+ private final TransitiveInfoProviderMap transitiveInfoProviderMap;
+ private final NestedSet<Artifact> jars;
+
+ public JavaProtoLibraryAspectProvider(
+ TransitiveInfoProviderMap transitiveInfoProviderMap, NestedSet<Artifact> jars) {
+ this.transitiveInfoProviderMap = transitiveInfoProviderMap;
+ this.jars = jars;
+ }
+
+ @Override
+ public TransitiveInfoProviderMap getTransitiveInfoProviderMap() {
+ return transitiveInfoProviderMap;
+ }
+
+ public NestedSet<Artifact> getJars() {
+ return jars;
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java
deleted file mode 100644
index aaf4ee26d2..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibraryTransitiveFilesToBuildProvider.java
+++ /dev/null
@@ -1,47 +0,0 @@
-// Copyright 2016 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.java.proto;
-
-import com.google.common.base.Function;
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-
-import javax.annotation.Nullable;
-
-/** Used by java_{lite,...}_proto_library to roll up jars to build. */
-public class JavaProtoLibraryTransitiveFilesToBuildProvider implements TransitiveInfoProvider {
- private final NestedSet<Artifact> jars;
-
- /** A long way to say (JavaProtoLibraryTransitiveFilesToBuildProvider p) -> p.getJars() */
- public static final Function<JavaProtoLibraryTransitiveFilesToBuildProvider, NestedSet<Artifact>>
- GET_JARS =
- new Function<JavaProtoLibraryTransitiveFilesToBuildProvider, NestedSet<Artifact>>() {
- @Nullable
- @Override
- public NestedSet<Artifact> apply(
- @Nullable JavaProtoLibraryTransitiveFilesToBuildProvider p) {
- return p == null ? null : p.getJars();
- }
- };
-
- public JavaProtoLibraryTransitiveFilesToBuildProvider(NestedSet<Artifact> jars) {
- this.jars = jars;
- }
-
- public NestedSet<Artifact> getJars() {
- return jars;
- }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java
deleted file mode 100644
index 962f93dfb6..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaSourceJarsAspectProvider.java
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright 2016 The Bazel Authors. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.java.proto;
-
-import com.google.common.base.Function;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
-
-import javax.annotation.Nullable;
-
-/** A wrapper around {@link JavaSourceJarsProvider}. */
-public class JavaSourceJarsAspectProvider implements TransitiveInfoProvider {
- /**
- * A long way to say (wrapper) -> wrapper.provider.
- */
- public static final Function<
- ? super JavaSourceJarsAspectProvider, ? extends JavaSourceJarsProvider>
- GET_PROVIDER =
- new Function<JavaSourceJarsAspectProvider, JavaSourceJarsProvider>() {
- @Nullable
- @Override
- public JavaSourceJarsProvider apply(@Nullable JavaSourceJarsAspectProvider wrapper) {
- return wrapper == null ? null : wrapper.provider;
- }
- };
-
- public final JavaSourceJarsProvider provider;
-
- public JavaSourceJarsAspectProvider(JavaSourceJarsProvider provider) {
- this.provider = provider;
- }
-}