diff options
author | Googler <noreply@google.com> | 2016-09-12 20:35:24 +0000 |
---|---|---|
committer | Dmitry Lomov <dslomov@google.com> | 2016-09-13 12:25:16 +0000 |
commit | b78a2129d9371de9a174edfd4160bd1f8a4ba5a4 (patch) | |
tree | 798a662a8225e9918eff82e97946d80389994215 /src/main/java/com/google/devtools/build/lib | |
parent | b137868e5d8fb6cd16025fd0999424e88939aa65 (diff) |
Blaze support for ExtensionRegistryGenerator.
--
MOS_MIGRATED_REVID=132912013
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
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(); + } + } +} |