Add a source_jars variable to OutputJar. Having a correlation between an output jar and a source jar is not enough. There may be situations when an output jar is generated from more source jars, not just one. We need this flexibility especially in Skylark for the java sandwich, when the user can compile multiple source jars. -- PiperOrigin-RevId: 149510534 MOS_MIGRATED_REVID=149510534
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java index e1f31fa..a29dead 100644 --- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java
@@ -62,6 +62,7 @@ import com.google.devtools.build.lib.rules.cpp.CppConfiguration; import com.google.devtools.build.lib.rules.java.JavaExportsProvider; import com.google.devtools.build.lib.rules.java.JavaGenJarsProvider; +import com.google.devtools.build.lib.rules.java.JavaProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider; @@ -335,7 +336,7 @@ // Java rules JavaRuleOutputJarsProvider outputJarsProvider = - base.getProvider(JavaRuleOutputJarsProvider.class); + JavaProvider.getProvider(JavaRuleOutputJarsProvider.class, base); if (outputJarsProvider != null && !androidStudioInfoSemantics.suppressJavaRuleInfo(base)) { JavaIdeInfo javaIdeInfo = makeJavaIdeInfo(base, ruleContext, outputJarsProvider, providerBuilder);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index 256966f..7c34069 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider; import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts; import com.google.devtools.build.lib.rules.java.JavaHelper; +import com.google.devtools.build.lib.rules.java.JavaProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider; import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.rules.java.JavaRuntimeJarProvider; @@ -121,9 +122,10 @@ ruleContext.registerAction(createAarNativeLibsFilterActions(ruleContext, aar, nativeLibs)); JavaRuleOutputJarsProvider.Builder jarProviderBuilder = new JavaRuleOutputJarsProvider.Builder() - .addOutputJar(mergedJar, null, null); + .addOutputJar(mergedJar, null, ImmutableList.<Artifact>of()); for (TransitiveInfoCollection export : ruleContext.getPrerequisites("exports", Mode.TARGET)) { - for (OutputJar jar : export.getProvider(JavaRuleOutputJarsProvider.class).getOutputJars()) { + for (OutputJar jar : + JavaProvider.getProvider(JavaRuleOutputJarsProvider.class, export).getOutputJars()) { jarProviderBuilder.addOutputJar(jar); filesToBuildBuilder.add(jar.getClassJar()); }
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 d12728a..2ea11f5 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
@@ -746,13 +746,13 @@ } OutputJar resourceJar = null; if (resourceClassJar != null && resourceSourceJar != null) { - resourceJar = new OutputJar(resourceClassJar, null, resourceSourceJar); + resourceJar = new OutputJar(resourceClassJar, null, ImmutableList.of(resourceSourceJar)); javaRuleOutputJarsProviderBuilder.addOutputJar(resourceJar); } JavaRuleOutputJarsProvider ruleOutputJarsProvider = javaRuleOutputJarsProviderBuilder - .addOutputJar(classJar, iJar, srcJar) + .addOutputJar(classJar, iJar, ImmutableList.of(srcJar)) .setJdeps(outputDepsProto) .build(); JavaSourceJarsProvider sourceJarsProvider = javaSourceJarsProviderBuilder.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java index fd21c16..85d2450 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
@@ -15,6 +15,7 @@ import com.google.common.base.Function; import com.google.common.collect.ImmutableCollection; +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.collect.nestedset.NestedSet; @@ -215,10 +216,11 @@ return null; } + Artifact idlSourceJar = getIdeInfoProvider().getIdlSourceJar(); return new OutputJar( getIdeInfoProvider().getIdlClassJar(), null, - getIdeInfoProvider().getIdlSourceJar() + idlSourceJar == null ? ImmutableList.<Artifact>of() : ImmutableList.of(idlSourceJar) ); } }
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 03c6a59..0e3b272 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
@@ -128,7 +128,8 @@ .addAllTransitiveSourceJars(common.collectTransitiveSourceJars(srcJar)); Artifact classJar = ruleContext.getImplicitOutputArtifact(JavaSemantics.JAVA_BINARY_CLASS_JAR); JavaRuleOutputJarsProvider.Builder ruleOutputJarsProviderBuilder = - JavaRuleOutputJarsProvider.builder().addOutputJar(classJar, null /* iJar */, srcJar); + JavaRuleOutputJarsProvider.builder().addOutputJar( + classJar, null /* iJar */, ImmutableList.of(srcJar)); CppConfiguration cppConfiguration = ruleContext.getConfiguration().getFragment( CppConfiguration.class);
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 2d31f53..20b6eba 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
@@ -145,7 +145,7 @@ JavaRuleOutputJarsProvider.builder(); for (Artifact jar : jars) { ruleOutputJarsProviderBuilder.addOutputJar( - jar, compilationToRuntimeJarMap.inverse().get(jar), srcJar); + jar, compilationToRuntimeJarMap.inverse().get(jar), srcJars); } NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs();
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 b9fcd8d..408e4c2 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
@@ -174,7 +174,7 @@ JavaRuleOutputJarsProvider ruleOutputJarsProvider = JavaRuleOutputJarsProvider.builder() - .addOutputJar(classJar, iJar, srcJar) + .addOutputJar(classJar, iJar, ImmutableList.of(srcJar)) .setJdeps(outputDepsProto) .build(); JavaCompilationArgsProvider compilationArgsProvider =
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java index d66d440..e4f6c55 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java
@@ -41,7 +41,9 @@ ImmutableSet.of( JavaCompilationArgsProvider.class, JavaSourceJarsProvider.class, - ProtoJavaApiInfoAspectProvider.class); + ProtoJavaApiInfoAspectProvider.class, + JavaRuleOutputJarsProvider.class + ); private final TransitiveInfoProviderMap providers; @@ -77,6 +79,9 @@ .addProvider( ProtoJavaApiInfoAspectProvider.class, ProtoJavaApiInfoAspectProvider.merge(protoJavaApiInfoAspectProviders)) + // When a rule merges multiple JavaProviders, its purpose is to pass on information, so + // it doesn't have any output jars. + .addProvider(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder().build()) .build(); }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java index c254f80..c5fc21b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
@@ -15,12 +15,14 @@ package com.google.devtools.build.lib.rules.java; 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.TransitiveInfoProvider; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; +import com.google.devtools.build.lib.syntax.SkylarkList; import com.google.devtools.build.lib.util.Preconditions; import javax.annotation.Nullable; @@ -46,13 +48,15 @@ public static class OutputJar { @Nullable private final Artifact classJar; @Nullable private final Artifact iJar; - @Nullable private final Artifact srcJar; + @Nullable private final ImmutableList<Artifact> srcJars; public OutputJar( - @Nullable Artifact classJar, @Nullable Artifact iJar, @Nullable Artifact srcJar) { + @Nullable Artifact classJar, + @Nullable Artifact iJar, + @Nullable Iterable<Artifact> srcJars) { this.classJar = classJar; this.iJar = iJar; - this.srcJar = srcJar; + this.srcJars = ImmutableList.copyOf(srcJars); } @Nullable @@ -80,12 +84,25 @@ @Nullable @SkylarkCallable( name = "source_jar", - doc = "A sources archive file.", + doc = "A sources archive file. Deprecated. Kept for migration reasons. " + + "Please use source_jars instead.", allowReturnNones = true, structField = true ) + @Deprecated public Artifact getSrcJar() { - return srcJar; + return Iterables.getOnlyElement(srcJars, null); + } + + @Nullable + @SkylarkCallable( + name = "source_jars", + doc = "A list of sources archive files.", + allowReturnNones = true, + structField = true + ) + public SkylarkList<Artifact> getSrcJars() { + return SkylarkList.createImmutable(srcJars); } } @@ -128,9 +145,9 @@ public Builder addOutputJar( @Nullable Artifact classJar, @Nullable Artifact iJar, - @Nullable Artifact sourceJar) { - Preconditions.checkState(classJar != null || iJar != null || sourceJar != null); - outputJars.add(new OutputJar(classJar, iJar, sourceJar)); + @Nullable ImmutableList<Artifact> sourceJars) { + Preconditions.checkState(classJar != null || iJar != null || !sourceJars.isEmpty()); + outputJars.add(new OutputJar(classJar, iJar, sourceJars)); return this; }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java index c7b4134..f8c37f1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
@@ -133,7 +133,7 @@ MiddlemanProvider hostJavabaseProvider = hostJavabase.getProvider(MiddlemanProvider.class); NestedSet<Artifact> hostJavabaseArtifacts = - hostJavabase == null + hostJavabaseProvider == null ? NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER) : hostJavabaseProvider.getMiddlemanArtifact(); JavaToolchainProvider javaToolchainProvider = @@ -144,11 +144,16 @@ javaToolchainProvider, hostJavabaseArtifacts, SkylarkList.createImmutable(ImmutableList.<Artifact>of())); + JavaRuleOutputJarsProvider javaRuleOutputJarsProvider = + JavaRuleOutputJarsProvider.builder().addOutputJar( + new JavaRuleOutputJarsProvider.OutputJar(outputJar, /* ijar */ null, sourceJars)) + .build(); return JavaProvider.Builder.create() .addProvider( JavaCompilationArgsProvider.class, helper.buildCompilationArgsProvider(artifacts, true)) .addProvider(JavaSourceJarsProvider.class, createJavaSourceJarsProvider(sourceJars)) + .addProvider(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProvider) .build(); }
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 9eef47a..967756c 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
@@ -199,7 +199,7 @@ // TODO(carmi): Expose to native rules JavaRuleOutputJarsProvider ruleOutputJarsProvider = JavaRuleOutputJarsProvider.builder() - .addOutputJar(outputJar, compileTimeJar, sourceJar) + .addOutputJar(outputJar, compileTimeJar, ImmutableList.of(sourceJar)) .build(); JavaSourceJarsProvider sourceJarsProvider = JavaSourceJarsProvider.create(
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 e702f27..e2ba1bd 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
@@ -212,7 +212,7 @@ // TODO(carmi): Expose to native rules JavaRuleOutputJarsProvider ruleOutputJarsProvider = JavaRuleOutputJarsProvider.builder() - .addOutputJar(outputJar, compileTimeJar, sourceJar) + .addOutputJar(outputJar, compileTimeJar, ImmutableList.of(sourceJar)) .build(); JavaSourceJarsProvider sourceJarsProvider = JavaSourceJarsProvider.create(