Skip to content

Commit f73e28c

Browse files
comiuscopybara-github
authored andcommitted
Provide Java outputs information in JavaPluginInfo.
Intellij aspect needs this information, which was before provided in JavaInfo. Returning additionally a JavaInfo from a java_plugin would fix it, but it would break the constraints check. A better option is to return java_outputs in JavaPluginInfo as well. PiperOrigin-RevId: 395428207
1 parent 0e90eab commit f73e28c

6 files changed

Lines changed: 89 additions & 26 deletions

File tree

src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
import com.google.devtools.build.lib.rules.cpp.CcInfo;
4949
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType;
5050
import com.google.devtools.build.lib.rules.java.JavaPluginInfo.JavaPluginData;
51+
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.JavaOutput;
5152
import com.google.devtools.build.lib.util.FileTypeSet;
5253
import com.google.devtools.build.lib.util.Pair;
5354
import com.google.devtools.build.lib.vfs.FileSystemUtils;
@@ -810,7 +811,8 @@ private static Iterable<JavaPluginInfo> getExportedJavaPluginInfoForAttribute(
810811
return ImmutableList.of();
811812
}
812813

813-
JavaPluginInfo createJavaPluginInfo(RuleContext ruleContext) {
814+
JavaPluginInfo createJavaPluginInfo(
815+
RuleContext ruleContext, ImmutableList<JavaOutput> javaOutputs) {
814816
NestedSet<String> processorClasses =
815817
NestedSetBuilder.wrap(Order.NAIVE_LINK_ORDER, getProcessorClasses(ruleContext));
816818
NestedSet<Artifact> processorClasspath = getRuntimeClasspath();
@@ -821,7 +823,8 @@ JavaPluginInfo createJavaPluginInfo(RuleContext ruleContext) {
821823
: NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER);
822824
return JavaPluginInfo.create(
823825
JavaPluginData.create(processorClasses, processorClasspath, data),
824-
ruleContext.attributes().get("generates_api", Type.BOOLEAN));
826+
ruleContext.attributes().get("generates_api", Type.BOOLEAN),
827+
javaOutputs);
825828
}
826829

827830
/**

src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ final ConfiguredTarget init(
173173
isJavaPluginRule
174174
// For java_plugin we create the provider with content retrieved from the rule
175175
// attributes.
176-
? common.createJavaPluginInfo(ruleContext)
176+
? common.createJavaPluginInfo(ruleContext, ruleOutputJarsProvider.getJavaOutputs())
177177
// For java_library we add the transitive plugins from plugins and exported_plugins
178178
// attrs.
179179
: JavaCommon.getTransitivePlugins(ruleContext);

src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfo.java

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import com.google.devtools.build.lib.packages.BuiltinProvider;
2626
import com.google.devtools.build.lib.packages.NativeInfo;
2727
import com.google.devtools.build.lib.rules.java.JavaPluginInfo.JavaPluginData;
28+
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.JavaOutput;
2829
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
2930
import com.google.devtools.build.lib.starlarkbuildapi.java.JavaPluginInfoApi;
3031
import java.util.ArrayList;
@@ -38,7 +39,7 @@
3839
@Immutable
3940
@AutoValue
4041
public abstract class JavaPluginInfo extends NativeInfo
41-
implements JavaPluginInfoApi<JavaPluginData> {
42+
implements JavaPluginInfoApi<Artifact, JavaPluginData, JavaOutput> {
4243
public static final String PROVIDER_NAME = "JavaPluginInfo";
4344
public static final Provider PROVIDER = new Provider();
4445

@@ -55,19 +56,20 @@ private Provider() {
5556
}
5657

5758
@Override
58-
public JavaPluginInfoApi<JavaPluginData> javaPluginInfo(
59+
public JavaPluginInfoApi<Artifact, JavaPluginData, JavaOutput> javaPluginInfo(
5960
Sequence<?> runtimeDeps, Object processorClass, Object processorData, Boolean generatesApi)
6061
throws EvalException {
6162
NestedSet<String> processorClasses =
6263
processorClass == Starlark.NONE
6364
? NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER)
6465
: NestedSetBuilder.create(Order.NAIVE_LINK_ORDER, (String) processorClass);
65-
NestedSet<Artifact> processorClasspath =
66+
JavaInfo javaInfos =
6667
JavaInfo.merge(
67-
Sequence.cast(runtimeDeps, JavaInfo.class, "runtime_deps"),
68-
/*withExportsProvider=*/ false)
69-
.getProvider(JavaCompilationArgsProvider.class)
70-
.getRuntimeJars();
68+
Sequence.cast(runtimeDeps, JavaInfo.class, "runtime_deps"),
69+
/*withExportsProvider=*/ false);
70+
71+
NestedSet<Artifact> processorClasspath =
72+
javaInfos.getProvider(JavaCompilationArgsProvider.class).getRuntimeJars();
7173

7274
final NestedSet<Artifact> data;
7375
if (processorData instanceof Depset) {
@@ -79,7 +81,9 @@ public JavaPluginInfoApi<JavaPluginData> javaPluginInfo(
7981
}
8082

8183
return JavaPluginInfo.create(
82-
JavaPluginData.create(processorClasses, processorClasspath, data), generatesApi);
84+
JavaPluginData.create(processorClasses, processorClasspath, data),
85+
generatesApi,
86+
javaInfos.getJavaOutputs());
8387
}
8488
}
8589

@@ -165,22 +169,26 @@ public static JavaPluginInfo merge(JavaPluginInfo a, JavaPluginInfo b) {
165169
public static JavaPluginInfo merge(Iterable<JavaPluginInfo> providers) {
166170
List<JavaPluginData> plugins = new ArrayList<>();
167171
List<JavaPluginData> apiGeneratingPlugins = new ArrayList<>();
172+
ImmutableList.Builder<JavaOutput> outputs = ImmutableList.builder();
168173
for (JavaPluginInfo provider : providers) {
169174
plugins.add(provider.plugins());
170175
apiGeneratingPlugins.add(provider.apiGeneratingPlugins());
176+
outputs.addAll(provider.getJavaOutputs());
171177
}
172178
return new AutoValue_JavaPluginInfo(
173-
JavaPluginData.merge(plugins), JavaPluginData.merge(apiGeneratingPlugins));
179+
outputs.build(), JavaPluginData.merge(plugins), JavaPluginData.merge(apiGeneratingPlugins));
174180
}
175181

176-
public static JavaPluginInfo create(JavaPluginData javaPluginData, boolean generatesApi) {
182+
public static JavaPluginInfo create(
183+
JavaPluginData javaPluginData, boolean generatesApi, ImmutableList<JavaOutput> javaOutputs) {
177184
return new AutoValue_JavaPluginInfo(
178-
javaPluginData, generatesApi ? javaPluginData : JavaPluginData.empty());
185+
javaOutputs, javaPluginData, generatesApi ? javaPluginData : JavaPluginData.empty());
179186
}
180187

181188
@AutoCodec.Instantiator
182189
public static JavaPluginInfo empty() {
183-
return new AutoValue_JavaPluginInfo(JavaPluginData.empty(), JavaPluginData.empty());
190+
return new AutoValue_JavaPluginInfo(
191+
ImmutableList.of(), JavaPluginData.empty(), JavaPluginData.empty());
184192
}
185193

186194
public abstract JavaPluginData plugins();
@@ -208,6 +216,6 @@ public boolean hasProcessors() {
208216
*/
209217
public JavaPluginInfo disableAnnotationProcessing() {
210218
return JavaPluginInfo.create(
211-
plugins().disableAnnotationProcessing(), /* generatesApi= */ false);
219+
plugins().disableAnnotationProcessing(), /* generatesApi= */ false, getJavaOutputs());
212220
}
213221
}

src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaInfoApi.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

1717
import static com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions.INCOMPATIBLE_ENABLE_EXPORTS_PROVIDER;
1818

19-
import com.google.common.collect.ImmutableList;
2019
import com.google.devtools.build.docgen.annot.DocCategory;
2120
import com.google.devtools.build.docgen.annot.StarlarkConstructor;
2221
import com.google.devtools.build.lib.collect.nestedset.Depset;
@@ -45,7 +44,7 @@ public interface JavaInfoApi<
4544
FileT extends FileApi,
4645
JavaOutputT extends JavaOutputApi<FileT>,
4746
JavaPluginDataT extends JavaPluginDataApi>
48-
extends StructApi, JavaPluginInfoApi<JavaPluginDataT> {
47+
extends StructApi, JavaPluginInfoApi<FileT, JavaPluginDataT, JavaOutputT> {
4948

5049
@StarlarkMethod(
5150
name = "transitive_runtime_jars",
@@ -115,12 +114,6 @@ public interface JavaInfoApi<
115114
@Deprecated
116115
JavaRuleOutputJarsProviderApi<?> getOutputJars();
117116

118-
@StarlarkMethod(
119-
name = "java_outputs",
120-
doc = "Returns information about outputs of this Java/Java-like target.",
121-
structField = true)
122-
ImmutableList<JavaOutputT> getJavaOutputs();
123-
124117
@StarlarkMethod(
125118
name = "annotation_processing",
126119
structField = true,

src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaPluginInfoApi.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414
package com.google.devtools.build.lib.starlarkbuildapi.java;
1515

16+
import com.google.common.collect.ImmutableList;
1617
import com.google.devtools.build.docgen.annot.DocCategory;
1718
import com.google.devtools.build.docgen.annot.StarlarkConstructor;
1819
import com.google.devtools.build.lib.collect.nestedset.Depset;
@@ -36,7 +37,11 @@
3637
"A provider encapsulating information about Java plugins. "
3738
+ "<p>At the moment, the only supported kind of plugins are annotation processors.",
3839
category = DocCategory.PROVIDER)
39-
public interface JavaPluginInfoApi<JavaPluginDataT extends JavaPluginDataApi> extends StructApi {
40+
public interface JavaPluginInfoApi<
41+
FileT extends FileApi,
42+
JavaPluginDataT extends JavaPluginDataApi,
43+
JavaOutputT extends JavaOutputApi<FileT>>
44+
extends StructApi {
4045
@StarlarkMethod(name = "plugins", doc = "Returns data about all plugins.", structField = true)
4146
JavaPluginDataT plugins();
4247

@@ -81,6 +86,12 @@ interface JavaPluginDataApi extends StarlarkValue {
8186
Depset /*<FileApi>*/ getProcessorDataForStarlark();
8287
}
8388

89+
@StarlarkMethod(
90+
name = "java_outputs",
91+
doc = "Returns information about outputs of this Java/Java-like target.",
92+
structField = true)
93+
ImmutableList<JavaOutputT> getJavaOutputs();
94+
8495
/** Provider class for {@link JavaPluginInfoApi} objects. */
8596
@StarlarkBuiltin(name = "Provider", documented = false)
8697
interface Provider<JavaInfoT extends JavaInfoApi<?, ?, ?>> extends ProviderApi {
@@ -133,7 +144,7 @@ interface Provider<JavaInfoT extends JavaInfoApi<?, ?, ?>> extends ProviderApi {
133144
},
134145
selfCall = true)
135146
@StarlarkConstructor
136-
JavaPluginInfoApi<?> javaPluginInfo(
147+
JavaPluginInfoApi<?, ?, ?> javaPluginInfo(
137148
Sequence<?> runtimeDeps, Object processorClass, Object processorData, Boolean generatesApi)
138149
throws EvalException;
139150
}

src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import java.util.Iterator;
4848
import java.util.List;
4949
import net.starlark.java.eval.Sequence;
50+
import net.starlark.java.eval.StarlarkList;
5051
import org.junit.Before;
5152
import org.junit.Test;
5253
import org.junit.runner.RunWith;
@@ -302,6 +303,53 @@ public void testExposesJavaCommonProvider() throws Exception {
302303
assertThat(javaOutput.getCompileJdeps().getFilename()).isEqualTo("libdep-hjar.jdeps");
303304
}
304305

306+
@Test
307+
public void javaPlugin_exposesJavaOutputs() throws Exception {
308+
scratch.file(
309+
"java/test/BUILD",
310+
"load(':extension.bzl', 'my_rule')",
311+
"java_library(",
312+
" name = 'lib',",
313+
" srcs = [ 'Lib.java'],",
314+
")",
315+
"java_plugin(",
316+
" name = 'dep',",
317+
" srcs = [ 'Dep.java'],",
318+
" deps = [':lib'],",
319+
")",
320+
"my_rule(",
321+
" name = 'my',",
322+
" dep = ':dep',",
323+
")");
324+
scratch.file(
325+
"java/test/extension.bzl",
326+
"result = provider()",
327+
"def impl(ctx):",
328+
" depj = ctx.attr.dep[JavaPluginInfo]",
329+
" return [result(",
330+
" outputs = depj.java_outputs,",
331+
" )]",
332+
"my_rule = rule(impl, attrs = { 'dep' : attr.label() })");
333+
334+
ConfiguredTarget configuredTarget = getConfiguredTarget("//java/test:my");
335+
StructImpl info =
336+
(StructImpl)
337+
configuredTarget.get(
338+
new StarlarkProvider.Key(
339+
Label.parseAbsolute("//java/test:extension.bzl", ImmutableMap.of()), "result"));
340+
341+
@SuppressWarnings("unchecked") // deserialization
342+
StarlarkList<JavaOutput> javaOutputs = ((StarlarkList<JavaOutput>) info.getValue("outputs"));
343+
344+
assertThat(javaOutputs.size()).isEqualTo(1);
345+
JavaOutput javaOutput = javaOutputs.get(0);
346+
assertThat(javaOutput.getClassJar().getFilename()).isEqualTo("libdep.jar");
347+
assertThat(javaOutput.getCompileJar().getFilename()).isEqualTo("libdep-hjar.jar");
348+
assertThat(artifactFilesNames(javaOutput.getSourceJars())).containsExactly("libdep-src.jar");
349+
assertThat(javaOutput.getJdeps().getFilename()).isEqualTo("libdep.jdeps");
350+
assertThat(javaOutput.getCompileJdeps().getFilename()).isEqualTo("libdep-hjar.jdeps");
351+
}
352+
305353
@Test
306354
public void javaToolchainInfo_jacocoRunnerAttribute() throws Exception {
307355
JavaToolchainTestUtil.writeBuildFileForJavaToolchain(scratch);

0 commit comments

Comments
 (0)