Skip to content

Commit

Permalink
Add field java_outputs to JavaInfo, redirected to outputs.jars, and d…
Browse files Browse the repository at this point in the history
…eprecate outputs field.

The only field left in the JavaInfo.outputs was jars, where jars contained other outputs from Java compilation besides Jar files.

The change introduces a new template parameter or JavaInfoApi. Alternative that I tried is using covariant types, that is `ImmutableList<? extends JavaOutputApi<?>>`. Alternative works, but carries over longer type signatures wherever the returned value is stored in a local variable.

PiperOrigin-RevId: 365212150
  • Loading branch information
comius authored and copybara-github committed Mar 26, 2021
1 parent 662cf54 commit be30d1d
Show file tree
Hide file tree
Showing 10 changed files with 75 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
/** A Starlark declared provider that encapsulates all providers that are needed by Java rules. */
@Immutable
@AutoCodec
public final class JavaInfo extends NativeInfo implements JavaInfoApi<Artifact> {
public final class JavaInfo extends NativeInfo implements JavaInfoApi<Artifact, JavaOutput> {

public static final String STARLARK_NAME = "JavaInfo";

Expand Down Expand Up @@ -296,10 +296,17 @@ public Sequence<Artifact> getSourceJars() {
}

@Override
@Deprecated
public JavaRuleOutputJarsProvider getOutputJars() {
return getProvider(JavaRuleOutputJarsProvider.class);
}

@Override
public ImmutableList<JavaOutput> getJavaOutputs() {
JavaRuleOutputJarsProvider outputs = getProvider(JavaRuleOutputJarsProvider.class);
return outputs == null ? ImmutableList.of() : outputs.getJavaOutputs();
}

@Override
public JavaGenJarsProvider getGenJarsProvider() {
return getProvider(JavaGenJarsProvider.class);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@
+ "you will be broken when it is removed."
+ "Common utilities and functionality related to Android rules.",
documented = false)
public interface AndroidStarlarkCommonApi<FileT extends FileApi, JavaInfoT extends JavaInfoApi<?>>
public interface AndroidStarlarkCommonApi<
FileT extends FileApi, JavaInfoT extends JavaInfoApi<?, ?>>
extends StarlarkValue {

@StarlarkMethod(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
@StarlarkBuiltin(name = "java_common", doc = "Utilities for Java compilation support in Starlark.")
public interface JavaCommonApi<
FileT extends FileApi,
JavaInfoT extends JavaInfoApi<FileT>,
JavaInfoT extends JavaInfoApi<FileT, ?>,
JavaToolchainT extends JavaToolchainStarlarkApiProviderApi,
ConstraintValueT extends ConstraintValueInfoApi,
starlarkRuleContextT extends StarlarkRuleContextApi<ConstraintValueT>,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@

package com.google.devtools.build.lib.starlarkbuildapi.java;

import com.google.common.collect.ImmutableList;
import com.google.devtools.build.docgen.annot.DocCategory;
import com.google.devtools.build.docgen.annot.StarlarkConstructor;
import com.google.devtools.build.lib.collect.nestedset.Depset;
Expand All @@ -35,7 +36,8 @@
name = "JavaInfo",
doc = "A provider encapsulating information about Java and Java-like targets.",
category = DocCategory.PROVIDER)
public interface JavaInfoApi<FileT extends FileApi> extends StructApi {
public interface JavaInfoApi<FileT extends FileApi, JavaOutputT extends JavaOutputApi<FileT>>
extends StructApi {

@StarlarkMethod(
name = "transitive_runtime_jars",
Expand Down Expand Up @@ -96,12 +98,21 @@ public interface JavaInfoApi<FileT extends FileApi> extends StructApi {

@StarlarkMethod(
name = "outputs",
doc = "Returns information about outputs of this Java/Java-like target.",
doc =
"Returns information about outputs of this Java/Java-like target. Deprecated: use"
+ " java_outputs.",
structField = true,
allowReturnNones = true)
@Nullable
@Deprecated
JavaRuleOutputJarsProviderApi<?> getOutputJars();

@StarlarkMethod(
name = "java_outputs",
doc = "Returns information about outputs of this Java/Java-like target.",
structField = true)
ImmutableList<JavaOutputT> getJavaOutputs();

@StarlarkMethod(
name = "annotation_processing",
structField = true,
Expand Down Expand Up @@ -303,7 +314,7 @@ interface JavaInfoProviderApi extends ProviderApi {
selfCall = true,
useStarlarkThread = true)
@StarlarkConstructor
JavaInfoApi<?> javaInfo(
JavaInfoApi<?, ?> javaInfo(
FileApi outputJarApi,
Object compileJarApi,
Object sourceJarApi,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,6 @@ void createProtoCompileAction(
@Param(name = "ctx", positional = true, named = false, doc = "The rule context."),
@Param(name = "proto_toolchain_attr", positional = false, named = true)
})
JavaInfoApi<FileT> getRuntimeToolchainProvider(
JavaInfoApi<FileT, ?> getRuntimeToolchainProvider(
StarlarkRuleContextT starlarkRuleContext, String protoToolchainAttr) throws EvalException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,23 +22,33 @@
import net.starlark.java.annot.StarlarkMethod;
import net.starlark.java.eval.StarlarkValue;

/** Info object about outputs of a Java rule. */
/**
* Info object about outputs of a Java rule.
*
* @deprecated The interface will eventually be removed.
*/
@StarlarkBuiltin(
name = "java_output_jars",
category = DocCategory.PROVIDER,
doc = "Information about outputs of a Java rule.")
doc = "Information about outputs of a Java rule. Deprecated: use java_info.java_outputs.")
@Deprecated
public interface JavaRuleOutputJarsProviderApi<JavaOutputT extends JavaOutputApi<?>>
extends StarlarkValue {

@StarlarkMethod(name = "jars", doc = "A list of jars the rule outputs.", structField = true)
@StarlarkMethod(
name = "jars",
doc =
"Returns information about outputs of this Java/Java-like target. Deprecated: Use"
+ " java_info.java_outputs.",
structField = true)
ImmutableList<JavaOutputT> getJavaOutputs();

@StarlarkMethod(
name = "jdeps",
doc =
"A manifest proto file. The protobuf file containing the manifest generated from "
+ "JavaBuilder. This function returns a value when exactly one manifest proto file is"
+ " present in the outputs. Deprecated: Use jars[i].jdeps.",
+ " present in the outputs. Deprecated: Use java_info.java_outputs[i].jdeps.",
structField = true,
allowReturnNones = true)
@Nullable
Expand All @@ -48,9 +58,9 @@ public interface JavaRuleOutputJarsProviderApi<JavaOutputT extends JavaOutputApi
@StarlarkMethod(
name = "native_headers",
doc =
"A jar containing CC header files supporting native method implementation. "
+ " This function returns a value when exactly one native headers jar file is"
+ " present in the outputs. Deprecated: Use jars[i].native_headers_jar.",
"A jar containing CC header files supporting native method implementation. This"
+ " function returns a value when exactly one native headers jar file is present in"
+ " the outputs. Deprecated: Use java_info.java_outputs[i].native_headers_jar.",
structField = true,
allowReturnNones = true)
@Nullable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,11 @@
import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidSplitTransititionApi;
import com.google.devtools.build.lib.starlarkbuildapi.android.AndroidStarlarkCommonApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaInfoApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaOutputApi;

/** Fake implementation of {@link AndroidStarlarkCommonApi}. */
public class FakeAndroidStarlarkCommon
implements AndroidStarlarkCommonApi<FileApi, JavaInfoApi<FileApi>> {
implements AndroidStarlarkCommonApi<FileApi, JavaInfoApi<FileApi, JavaOutputApi<FileApi>>> {

@Override
public AndroidDeviceBrokerInfoApi createDeviceBrokerInfo(String deviceBrokerType) {
Expand All @@ -40,8 +41,9 @@ public AndroidSplitTransititionApi getAndroidSplitTransition() {
}

@Override
public JavaInfoApi<FileApi> enableImplicitSourcelessDepsExportsCompatibility(
JavaInfoApi<FileApi> javaInfo) {
public JavaInfoApi<FileApi, JavaOutputApi<FileApi>>
enableImplicitSourcelessDepsExportsCompatibility(
JavaInfoApi<FileApi, JavaOutputApi<FileApi>> javaInfo) {
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,21 @@

package com.google.devtools.build.skydoc.fakebuildapi.java;

import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.collect.nestedset.Depset;
import com.google.devtools.build.lib.starlarkbuildapi.FileApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaAnnotationProcessingApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaCompilationInfoProviderApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaInfoApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaOutputApi;
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaRuleOutputJarsProviderApi;
import net.starlark.java.eval.EvalException;
import net.starlark.java.eval.Printer;
import net.starlark.java.eval.Sequence;
import net.starlark.java.eval.StarlarkThread;

/**
* Fake implementation of {@link JavaInfoApi}.
*/
public class FakeJavaInfo implements JavaInfoApi<FileApi> {
/** Fake implementation of {@link JavaInfoApi}. */
public class FakeJavaInfo implements JavaInfoApi<FileApi, JavaOutputApi<FileApi>> {

@Override
public Depset /*<File>*/ getTransitiveRuntimeJars() {
Expand Down Expand Up @@ -60,6 +60,11 @@ public JavaRuleOutputJarsProviderApi<?> getOutputJars() {
return null;
}

@Override
public ImmutableList<JavaOutputApi<FileApi>> getJavaOutputs() {
return ImmutableList.of();
}

@Override
public JavaAnnotationProcessingApi<?> getGenJarsProvider() {
return null;
Expand Down Expand Up @@ -114,7 +119,7 @@ public void repr(Printer printer) {}
public static class FakeJavaInfoProvider implements JavaInfoProviderApi {

@Override
public JavaInfoApi<?> javaInfo(
public JavaInfoApi<?, ?> javaInfo(
FileApi outputJarApi,
Object compileJarApi,
Object sourceJarApi,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ public boolean hasProtoSources(TransitiveInfoCollectionApi target) {
}

@Override
public JavaInfoApi<FileApi> getRuntimeToolchainProvider(
public JavaInfoApi<FileApi, ?> getRuntimeToolchainProvider(
StarlarkRuleContextApi<ConstraintValueInfoApi> starlarkRuleContext, String protoToolchainAttr)
throws EvalException {
return new FakeJavaInfo();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.prettyArtifactNames;
import static org.junit.Assert.assertThrows;

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Action;
Expand Down Expand Up @@ -768,9 +769,9 @@ public void testJavaCommonCompileWithOnlyOneSourceJar() throws Exception {
JavaInfo info = configuredTarget.get(JavaInfo.PROVIDER);
Sequence<Artifact> sourceJars = info.getSourceJars();
assertThat(artifactFilesNames(sourceJars)).containsExactly("libcustom-src.jar");
JavaRuleOutputJarsProvider outputJars = info.getOutputJars();
assertThat(outputJars.getJavaOutputs()).hasSize(1);
JavaOutput javaOutput = outputJars.getJavaOutputs().get(0);
ImmutableList<JavaOutput> javaOutputs = info.getJavaOutputs();
assertThat(javaOutputs).hasSize(1);
JavaOutput javaOutput = javaOutputs.get(0);
assertThat(javaOutput.getClassJar().getFilename()).isEqualTo("libcustom.jar");
assertThat(javaOutput.getSrcJar().getFilename()).isEqualTo("libcustom-src.jar");
assertThat(javaOutput.getCompileJar().getFilename()).isEqualTo("libcustom-hjar.jar");
Expand Down Expand Up @@ -817,9 +818,9 @@ public void testJavaCommonCompile_noSources() throws Exception {
JavaInfo info = configuredTarget.get(JavaInfo.PROVIDER);
Sequence<Artifact> sourceJars = info.getSourceJars();
assertThat(artifactFilesNames(sourceJars)).containsExactly("libcustom-src.jar");
JavaRuleOutputJarsProvider outputJars = info.getOutputJars();
assertThat(outputJars.getJavaOutputs()).hasSize(1);
JavaOutput javaOutput = outputJars.getJavaOutputs().get(0);
ImmutableList<JavaOutput> javaOutputs = info.getJavaOutputs();
assertThat(javaOutputs).hasSize(1);
JavaOutput javaOutput = javaOutputs.get(0);
assertThat(javaOutput.getClassJar().getFilename()).isEqualTo("libcustom.jar");
assertThat(javaOutput.getSrcJar().getFilename()).isEqualTo("libcustom-src.jar");
}
Expand Down Expand Up @@ -868,9 +869,9 @@ public void testJavaCommonCompileCustomSourceJar() throws Exception {
JavaInfo info = configuredTarget.get(JavaInfo.PROVIDER);
Sequence<Artifact> sourceJars = info.getSourceJars();
assertThat(artifactFilesNames(sourceJars)).containsExactly("libcustom-mysrc.jar");
JavaRuleOutputJarsProvider outputJars = info.getOutputJars();
assertThat(outputJars.getJavaOutputs()).hasSize(1);
JavaOutput javaOutput = outputJars.getJavaOutputs().get(0);
ImmutableList<JavaOutput> javaOutputs = info.getJavaOutputs();
assertThat(javaOutputs).hasSize(1);
JavaOutput javaOutput = javaOutputs.get(0);
assertThat(javaOutput.getClassJar().getFilename()).isEqualTo("libcustom.jar");
assertThat(javaOutput.getSrcJar().getFilename()).isEqualTo("libcustom-mysrc.jar");
assertThat(javaOutput.getCompileJar().getFilename()).isEqualTo("libcustom-hjar.jar");
Expand Down Expand Up @@ -2032,9 +2033,9 @@ public void testCompileOutputJarHasManifestProto() throws Exception {

ConfiguredTarget configuredTarget = getConfiguredTarget("//foo:b");
JavaInfo info = configuredTarget.get(JavaInfo.PROVIDER);
JavaRuleOutputJarsProvider outputs = info.getOutputJars();
assertThat(outputs.getJavaOutputs()).hasSize(1);
JavaOutput output = outputs.getJavaOutputs().get(0);
ImmutableList<JavaOutput> javaOutputs = info.getJavaOutputs();
assertThat(javaOutputs).hasSize(1);
JavaOutput output = javaOutputs.get(0);
assertThat(output.getManifestProto().getFilename()).isEqualTo("libb.jar_manifest_proto");
}

Expand Down Expand Up @@ -2116,9 +2117,9 @@ public void testCompileOutputJarNotInRuntimePathWithoutAnySourcesDefined() throw
.containsExactly("libb.jar");
assertThat(artifactFilesNames(info.getTransitiveCompileTimeJars().toList(Artifact.class)))
.containsExactly("libb-hjar.jar");
JavaRuleOutputJarsProvider outputs = info.getOutputJars();
assertThat(outputs.getJavaOutputs()).hasSize(1);
JavaOutput output = outputs.getJavaOutputs().get(0);
ImmutableList<JavaOutput> javaOutputs = info.getJavaOutputs();
assertThat(javaOutputs).hasSize(1);
JavaOutput output = javaOutputs.get(0);
assertThat(output.getClassJar().getFilename()).isEqualTo("libc.jar");
assertThat(output.getCompileJar()).isNull();
}
Expand Down

0 comments on commit be30d1d

Please sign in to comment.