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(