aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java17
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java82
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java45
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceJarsProvider.java63
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java72
9 files changed, 255 insertions, 63 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index d15c3f2aec..beec6e6cf2 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -830,6 +830,7 @@ java_library(
"rules/java/NativeLibraryNestedSetBuilder.java",
"rules/java/SingleJarActionBuilder.java",
"rules/java/WriteBuildInfoPropertiesAction.java",
+ "rules/java/proto/GeneratedExtensionRegistryProvider.java",
],
deps = [
":build-base",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
index ffbca763fa..c3c85e68ad 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/BazelJavaSemantics.java
@@ -43,11 +43,14 @@ import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
import com.google.devtools.build.lib.rules.java.JavaCompilationHelper;
import com.google.devtools.build.lib.rules.java.JavaConfiguration;
import com.google.devtools.build.lib.rules.java.JavaHelper;
+import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaRunfilesProvider;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
+import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
import com.google.devtools.build.lib.rules.java.JavaUtil;
import com.google.devtools.build.lib.rules.java.Jvm;
+import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.util.ShellEscaper;
@@ -57,6 +60,7 @@ import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import javax.annotation.Nullable;
/**
* Semantics for Bazel Java rules
@@ -458,4 +462,17 @@ public class BazelJavaSemantics implements JavaSemantics {
public Artifact getProtoMapping(RuleContext ruleContext) throws InterruptedException {
return null;
}
+
+ @Nullable
+ @Override
+ public GeneratedExtensionRegistryProvider createGeneratedExtensionRegistry(
+ RuleContext ruleContext,
+ JavaCommon common,
+ NestedSetBuilder<Artifact> filesBuilder,
+ JavaCompilationArtifacts.Builder javaCompilationArtifactsBuilder,
+ JavaRuleOutputJarsProvider.Builder javaRuleOutputJarsProviderBuilder,
+ JavaSourceJarsProvider.Builder javaSourceJarsProviderBuilder)
+ throws InterruptedException {
+ return null;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 4f42250a97..11d64c95a8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -68,6 +68,7 @@ import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
import com.google.devtools.build.lib.rules.java.JavaUtil;
+import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
import com.google.devtools.build.lib.rules.test.InstrumentedFilesCollector.InstrumentationSpec;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.util.Preconditions;
@@ -125,8 +126,6 @@ public class AndroidCommon {
private NestedSet<Artifact> filesToBuild;
private NestedSet<Artifact> transitiveNeverlinkLibraries =
NestedSetBuilder.emptySet(Order.STABLE_ORDER);
- private Iterable<Artifact> topLevelSourceJars = ImmutableList.of();
- private NestedSet<Artifact> transitiveSourceJars = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
private JavaCompilationArgs javaCompilationArgs = JavaCompilationArgs.EMPTY_ARGS;
private JavaCompilationArgs recursiveJavaCompilationArgs = JavaCompilationArgs.EMPTY_ARGS;
private JackCompilationHelper jackCompilationHelper;
@@ -139,7 +138,11 @@ public class AndroidCommon {
private Artifact resourceClassJar;
private Artifact resourceSourceJar;
private Artifact outputDepsProto;
-
+ private GeneratedExtensionRegistryProvider generatedExtensionRegistryProvider;
+ private final JavaSourceJarsProvider.Builder javaSourceJarsProviderBuilder =
+ JavaSourceJarsProvider.builder();
+ private final JavaRuleOutputJarsProvider.Builder javaRuleOutputJarsProviderBuilder =
+ JavaRuleOutputJarsProvider.builder();
private Artifact manifestProtoOutput;
private AndroidIdlHelper idlHelper;
@@ -507,9 +510,12 @@ public class AndroidCommon {
}
public JavaTargetAttributes init(
- JavaSemantics javaSemantics, AndroidSemantics androidSemantics,
+ JavaSemantics javaSemantics,
+ AndroidSemantics androidSemantics,
ResourceApk resourceApk,
- boolean addCoverageSupport, boolean collectJavaCompilationArgs, boolean isBinary)
+ boolean addCoverageSupport,
+ boolean collectJavaCompilationArgs,
+ boolean isBinary)
throws InterruptedException {
classJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_CLASS_JAR);
@@ -565,7 +571,13 @@ public class AndroidCommon {
return null;
}
- initJava(helper, artifactsBuilder, collectJavaCompilationArgs, filesBuilder);
+ initJava(
+ javaSemantics,
+ helper,
+ artifactsBuilder,
+ collectJavaCompilationArgs,
+ filesBuilder,
+ isBinary);
if (ruleContext.hasErrors()) {
return null;
}
@@ -622,11 +634,13 @@ public class AndroidCommon {
}
private void initJava(
+ JavaSemantics javaSemantics,
JavaCompilationHelper helper,
JavaCompilationArtifacts.Builder javaArtifactsBuilder,
boolean collectJavaCompilationArgs,
- NestedSetBuilder<Artifact> filesBuilder) throws InterruptedException {
-
+ NestedSetBuilder<Artifact> filesBuilder,
+ boolean isBinary)
+ throws InterruptedException {
JavaTargetAttributes attributes = helper.getAttributes();
if (ruleContext.hasErrors()) {
// Avoid leaving filesToBuild set to null, otherwise we'll get a NullPointerException masking
@@ -655,12 +669,26 @@ public class AndroidCommon {
}
srcJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_SOURCE_JAR);
+ javaSourceJarsProviderBuilder
+ .addSourceJar(srcJar)
+ .addAllTransitiveSourceJars(javaCommon.collectTransitiveSourceJars(srcJar));
helper.createSourceJarAction(srcJar, genSourceJar);
outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
helper.createCompileActionWithInstrumentation(classJar, manifestProtoOutput, genSourceJar,
outputDepsProto, javaArtifactsBuilder);
+ if (isBinary) {
+ generatedExtensionRegistryProvider =
+ javaSemantics.createGeneratedExtensionRegistry(
+ ruleContext,
+ javaCommon,
+ filesBuilder,
+ javaArtifactsBuilder,
+ javaRuleOutputJarsProviderBuilder,
+ javaSourceJarsProviderBuilder);
+ }
+
filesToBuild = filesBuilder.build();
if ((attributes.hasSourceFiles() || attributes.hasSourceJars()) && jar != null) {
@@ -684,9 +712,6 @@ public class AndroidCommon {
ruleContext,
javaCommon.getDependencies(),
javaCommon.getJavaCompilationArtifacts().getRuntimeJars());
- topLevelSourceJars = ImmutableList.of(srcJar);
- transitiveSourceJars = javaCommon.collectTransitiveSourceJars(srcJar);
-
if (collectJavaCompilationArgs) {
boolean hasSources = attributes.hasSourceFiles() || attributes.hasSourceJars();
this.javaCompilationArgs =
@@ -703,23 +728,30 @@ public class AndroidCommon {
ResourceApk resourceApk,
Artifact zipAlignedApk,
Iterable<Artifact> apksUnderTest) {
-
javaCommon.addTransitiveInfoProviders(builder, filesToBuild, classJar, ANDROID_COLLECTION_SPEC);
javaCommon.addGenJarsProvider(builder, genClassJar, genSourceJar);
idlHelper.addTransitiveInfoProviders(builder, classJar, manifestProtoOutput);
- JavaRuleOutputJarsProvider.Builder outputJarsBuilder = JavaRuleOutputJarsProvider.builder()
- .addOutputJar(classJar, iJar, srcJar)
- .setJdeps(outputDepsProto);
+ if (generatedExtensionRegistryProvider != null) {
+ builder.add(GeneratedExtensionRegistryProvider.class, generatedExtensionRegistryProvider);
+ }
OutputJar resourceJar = null;
if (resourceClassJar != null && resourceSourceJar != null) {
resourceJar = new OutputJar(resourceClassJar, null, resourceSourceJar);
- outputJarsBuilder.addOutputJar(resourceJar);
+ javaRuleOutputJarsProviderBuilder.addOutputJar(resourceJar);
}
+ JavaSourceJarsProvider javaSourceJarsProvider = javaSourceJarsProviderBuilder.build();
+
return builder
.setFilesToBuild(filesToBuild)
- .add(JavaRuleOutputJarsProvider.class, outputJarsBuilder.build())
+ .add(
+ JavaRuleOutputJarsProvider.class,
+ javaRuleOutputJarsProviderBuilder
+ .addOutputJar(classJar, iJar, srcJar)
+ .setJdeps(outputDepsProto)
+ .build())
+ .add(JavaSourceJarsProvider.class, javaSourceJarsProvider)
.add(
JavaRuntimeJarProvider.class,
new JavaRuntimeJarProvider(javaCommon.getJavaCompilationArtifacts().getRuntimeJars()))
@@ -751,7 +783,9 @@ public class AndroidCommon {
.addSkylarkTransitiveInfo(AndroidSkylarkApiProvider.NAME, new AndroidSkylarkApiProvider())
.addOutputGroup(
OutputGroupProvider.HIDDEN_TOP_LEVEL, collectHiddenTopLevelArtifacts(ruleContext))
- .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars);
+ .addOutputGroup(
+ JavaSemantics.SOURCE_JARS_OUTPUT_GROUP,
+ javaSourceJarsProvider.getTransitiveSourceJars());
}
private Runfiles getRunfiles() {
@@ -871,18 +905,6 @@ public class AndroidCommon {
return transitiveNeverlinkLibraries;
}
- public Iterable<Artifact> getTopLevelSourceJars() {
- return topLevelSourceJars;
- }
-
- public NestedSet<Artifact> getTransitiveSourceJars() {
- return transitiveSourceJars;
- }
-
- public JavaSourceJarsProvider getJavaSourceJarsProvider() {
- return JavaSourceJarsProvider.create(getTransitiveSourceJars(), getTopLevelSourceJars());
- }
-
public boolean isNeverLink() {
return asNeverLink;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
index fbe88ff92f..edb490a95f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java
@@ -35,7 +35,6 @@ import com.google.devtools.build.lib.rules.java.JavaNeverlinkInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
-import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;
import com.google.devtools.build.lib.rules.java.ProguardLibrary;
import com.google.devtools.build.lib.rules.java.ProguardSpecProvider;
@@ -206,7 +205,6 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory {
.add(
JavaSourceInfoProvider.class,
JavaSourceInfoProvider.fromJavaTargetAttributes(javaTargetAttributes, javaSemantics))
- .add(JavaSourceJarsProvider.class, androidCommon.getJavaSourceJarsProvider())
.add(
AndroidCcLinkParamsProvider.class,
AndroidCcLinkParamsProvider.create(androidCommon.getCcLinkParamsStore()))
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 7f6ba892e4..01de5495da 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
@@ -43,6 +43,7 @@ import com.google.devtools.build.lib.rules.cpp.CppHelper;
import com.google.devtools.build.lib.rules.cpp.LinkerInput;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType;
import com.google.devtools.build.lib.rules.java.ProguardHelper.ProguardOutput;
+import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.ArrayList;
@@ -116,13 +117,14 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
}
}
- Artifact srcJar =
- ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_SOURCE_JAR);
-
- Artifact classJar =
- ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_CLASS_JAR);
-
- ImmutableList<Artifact> srcJars = ImmutableList.of(srcJar);
+ Artifact srcJar = ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_SOURCE_JAR);
+ JavaSourceJarsProvider.Builder javaSourceJarsProviderBuilder = JavaSourceJarsProvider.builder()
+ .addSourceJar(srcJar)
+ .addAllTransitiveSourceJars(common.collectTransitiveSourceJars(srcJar));
+ Artifact classJar = ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_CLASS_JAR);
+ JavaRuleOutputJarsProvider.Builder javaRuleOutputJarsProviderBuilder =
+ JavaRuleOutputJarsProvider.builder()
+ .addOutputJar(classJar, null /* iJar */, srcJar);
CppConfiguration cppConfiguration = ruleContext.getConfiguration().getFragment(
CppConfiguration.class);
@@ -178,7 +180,16 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
javaArtifactsBuilder.addRuntimeJar(classJar);
}
+ GeneratedExtensionRegistryProvider generatedExtensionRegistryProvider =
+ semantics.createGeneratedExtensionRegistry(
+ ruleContext,
+ common,
+ filesBuilder,
+ javaArtifactsBuilder,
+ javaRuleOutputJarsProviderBuilder,
+ javaSourceJarsProviderBuilder);
Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
+ javaRuleOutputJarsProviderBuilder.setJdeps(outputDepsProto);
JavaCompilationArtifacts javaArtifacts = javaArtifactsBuilder.build();
common.setJavaCompilationArtifacts(javaArtifacts);
@@ -221,7 +232,8 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
JavaCommon.getJavaBinSubstitution(ruleContext, launcher));
}
- NestedSet<Artifact> transitiveSourceJars = common.collectTransitiveSourceJars(srcJar);
+ JavaSourceJarsProvider javaSourceJarsProvider = javaSourceJarsProviderBuilder.build();
+ NestedSet<Artifact> transitiveSourceJars = javaSourceJarsProvider.getTransitiveSourceJars();
// TODO(bazel-team): if (getOptions().sourceJars) then make this a dummy prerequisite for the
// DeployArchiveAction ? Needs a few changes there as we can't pass inputs
@@ -229,8 +241,7 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
ImmutableMap.<PathFragment, Artifact>of(), transitiveSourceJars.toCollection(),
ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_DEPLOY_SOURCE_JAR));
- RuleConfiguredTargetBuilder builder =
- new RuleConfiguredTargetBuilder(ruleContext);
+ RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext);
builder.add(
JavaPrimaryClassProvider.class,
new JavaPrimaryClassProvider(
@@ -238,6 +249,9 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
semantics.addProviders(ruleContext, common, jvmFlags, classJar, srcJar,
genClassJar, genSourceJar, ImmutableMap.<Artifact, Artifact>of(),
filesBuilder, builder);
+ if (generatedExtensionRegistryProvider != null) {
+ builder.add(GeneratedExtensionRegistryProvider.class, generatedExtensionRegistryProvider);
+ }
Artifact deployJar =
ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_DEPLOY_JAR);
@@ -337,12 +351,7 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
return builder
.setFilesToBuild(filesToBuild)
- .add(
- JavaRuleOutputJarsProvider.class,
- JavaRuleOutputJarsProvider.builder()
- .addOutputJar(classJar, null /* iJar */, srcJar)
- .setJdeps(outputDepsProto)
- .build())
+ .add(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProviderBuilder.build())
.add(RunfilesProvider.class, runfilesProvider)
.setRunfilesSupport(runfilesSupport, executable)
.add(
@@ -351,9 +360,7 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
.add(
JavaSourceInfoProvider.class,
JavaSourceInfoProvider.fromJavaTargetAttributes(attributes, semantics))
- .add(
- JavaSourceJarsProvider.class,
- JavaSourceJarsProvider.create(transitiveSourceJars, srcJars))
+ .add(JavaSourceJarsProvider.class, javaSourceJarsProviderBuilder.build())
.addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars)
.build();
}
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 cc70a43c8b..647fc45490 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
@@ -351,14 +351,24 @@ public class JavaCommon {
/**
* Collects transitive source jars for the current rule.
*
- * @param targetSrcJar The source jar artifact corresponding to the output of the current rule.
+ * @param targetSrcJars The source jar artifacts corresponding to the output of the current rule.
* @return A nested set containing all of the source jar artifacts on which the current rule
* transitively depends.
*/
- public NestedSet<Artifact> collectTransitiveSourceJars(Artifact targetSrcJar) {
- NestedSetBuilder<Artifact> builder = NestedSetBuilder.stableOrder();
+ public NestedSet<Artifact> collectTransitiveSourceJars(Artifact... targetSrcJars) {
+ return collectTransitiveSourceJars(ImmutableList.copyOf(targetSrcJars));
+ }
- builder.add(targetSrcJar);
+ /**
+ * Collects transitive source jars for the current rule.
+ *
+ * @param targetSrcJars The source jar artifacts corresponding to the output of the current rule.
+ * @return A nested set containing all of the source jar artifacts on which the current rule
+ * transitively depends.
+ */
+ public NestedSet<Artifact> collectTransitiveSourceJars(Iterable<Artifact> targetSrcJars) {
+ NestedSetBuilder<Artifact> builder = NestedSetBuilder.<Artifact>stableOrder()
+ .addAll(targetSrcJars);
for (JavaSourceJarsProvider dep : getDependencies(JavaSourceJarsProvider.class)) {
builder.addTransitive(dep.getTransitiveSourceJars());
}
@@ -817,7 +827,7 @@ public class JavaCommon {
public NestedSet<Artifact> getCompileTimeClasspath() {
return classpathFragment.getCompileTimeClasspath();
}
-
+
public RuleContext getRuleContext() {
return ruleContext;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
index c2f5e7c69b..c475c55498 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSemantics.java
@@ -37,6 +37,7 @@ import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction;
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.rules.java.DeployArchiveBuilder.Compression;
+import com.google.devtools.build.lib.rules.java.proto.GeneratedExtensionRegistryProvider;
import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.Collection;
@@ -379,10 +380,23 @@ public interface JavaSemantics {
*/
String getJavaBuilderMainClass();
-
/**
* @return An artifact representing the protobuf-format version of the
* proguard mapping, or null if the proguard version doesn't support this.
*/
Artifact getProtoMapping(RuleContext ruleContext) throws InterruptedException;
+
+ /**
+ * Produces the proto generated extension registry artifacts, or <tt>null</tt>
+ * if no registry needs to be generated for the provided <tt>ruleContext</tt>.
+ */
+ @Nullable
+ GeneratedExtensionRegistryProvider createGeneratedExtensionRegistry(
+ RuleContext ruleContext,
+ JavaCommon common,
+ NestedSetBuilder<Artifact> filesBuilder,
+ JavaCompilationArtifacts.Builder javaCompilationArtifactsBuilder,
+ JavaRuleOutputJarsProvider.Builder javaRuleOutputJarsProviderBuilder,
+ JavaSourceJarsProvider.Builder javaSourceJarsProviderBuilder)
+ throws InterruptedException;
}
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 9537899ec1..122ead0ca8 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
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.rules.java;
import com.google.auto.value.AutoValue;
+import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
@@ -45,13 +46,63 @@ public abstract class JavaSourceJarsProvider implements TransitiveInfoProvider {
public abstract ImmutableList<Artifact> getSourceJars();
public static JavaSourceJarsProvider merge(Iterable<JavaSourceJarsProvider> providers) {
- NestedSetBuilder<Artifact> transitiveSourceJars = NestedSetBuilder.stableOrder();
- ImmutableList.Builder<Artifact> sourceJars = ImmutableList.builder();
-
+ JavaSourceJarsProvider.Builder result = builder();
for (JavaSourceJarsProvider provider : providers) {
- transitiveSourceJars.addTransitive(provider.getTransitiveSourceJars());
- sourceJars.addAll(provider.getSourceJars());
+ result.mergeFrom(provider);
+ }
+ return result.build();
+ }
+
+ /** Returns a builder for a {@link JavaSourceJarsProvider}. */
+ public static Builder builder() {
+ return new Builder();
+ }
+
+ /** A builder for {@link JavaSourceJarsProvider}. */
+ public static final class Builder {
+
+ private final ImmutableList.Builder<Artifact> sourceJars = ImmutableList.builder();
+ private final NestedSetBuilder<Artifact> transitiveSourceJars = NestedSetBuilder.stableOrder();
+
+ /** Add a source jar that is to be built when the target is on the command line. */
+ public Builder addSourceJar(Artifact sourceJar) {
+ sourceJars.add(Preconditions.checkNotNull(sourceJar));
+ return this;
+ }
+
+ /** Add source jars to be built when the target is on the command line. */
+ public Builder addAllSourceJars(Iterable<Artifact> sourceJars) {
+ this.sourceJars.addAll(Preconditions.checkNotNull(sourceJars));
+ return this;
+ }
+
+ /**
+ * Add a source jar in the transitive closure, that can be reached by a chain of
+ * JavaSourceJarsProvider instances.
+ */
+ public Builder addTransitiveSourceJar(Artifact transitiveSourceJar) {
+ transitiveSourceJars.add(Preconditions.checkNotNull(transitiveSourceJar));
+ return this;
+ }
+
+ /**
+ * Add source jars in the transitive closure, that can be reached by a chain of
+ * JavaSourceJarsProvider instances.
+ */
+ public Builder addAllTransitiveSourceJars(NestedSet<Artifact> transitiveSourceJars) {
+ this.transitiveSourceJars.addTransitive(Preconditions.checkNotNull(transitiveSourceJars));
+ return this;
+ }
+
+ /** Merge the source jars and transitive source jars from the provider into this builder. */
+ public Builder mergeFrom(JavaSourceJarsProvider provider) {
+ addAllTransitiveSourceJars(provider.getTransitiveSourceJars());
+ addAllSourceJars(provider.getSourceJars());
+ return this;
+ }
+
+ public JavaSourceJarsProvider build() {
+ return JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars.build());
}
- return JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars.build());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
new file mode 100644
index 0000000000..1c1e04e6a9
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/GeneratedExtensionRegistryProvider.java
@@ -0,0 +1,72 @@
+// Copyright 2014 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.auto.value.AutoValue;
+import com.google.common.base.Verify;
+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 com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+
+/**
+ * A {@link TransitiveInfoProvider} for {@link Artifact}s created and used to generate the proto
+ * extension registry. This provider is used to ensure that if multiple registries are generated
+ * from a target, that the top most target produces a registry that is a superset of any child
+ * registries.
+ */
+@AutoValue
+@Immutable
+public abstract class GeneratedExtensionRegistryProvider implements TransitiveInfoProvider {
+
+ /** @return if this registry was generated for lite or full runtime. */
+ public abstract boolean isLite();
+
+ /** @return the class jar generated by the registry. */
+ public abstract Artifact getClassJar();
+
+ /** @return the source jar generated by the registry. */
+ public abstract Artifact getSrcJar();
+
+ /** @return the proto jars used to generate the registry. */
+ public abstract NestedSet<Artifact> getInputs();
+
+ public static Builder builder() {
+ return new AutoValue_GeneratedExtensionRegistryProvider.Builder();
+ }
+
+ /** A builder for {@link GeneratedExtensionRegistryProvider}. */
+ @AutoValue.Builder
+ public abstract static class Builder {
+ /** Indicates this registry was built for lite runtime if <tt>true</tt>, full otherwise. */
+ public abstract Builder setLite(boolean lite);
+
+ /** Sets the class jar containing the generated extension registry. */
+ public abstract Builder setClassJar(Artifact classJar);
+
+ /** Sets the source jar containing the generated extension registry. */
+ public abstract Builder setSrcJar(Artifact srcJar);
+
+ /** Sets the transitive set of protos used to produce the generated extension registry. */
+ public abstract Builder setInputs(NestedSet<Artifact> inputs);
+
+ abstract GeneratedExtensionRegistryProvider autoBuild();
+ public GeneratedExtensionRegistryProvider build() {
+ GeneratedExtensionRegistryProvider result = autoBuild();
+ Verify.verify(!result.getInputs().isEmpty());
+ return autoBuild();
+ }
+ }
+}