aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar dbabkin <dbabkin@google.com>2018-01-18 02:46:28 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-18 02:48:27 -0800
commitfca3d391161ae4c92cf289a897db2a1c69a9b334 (patch)
tree21c89f04328e20382cb2b634c23c372b8a9e7bff
parentadecfb2101a1bb19c53ab6c0361cd59073f8b723 (diff)
Create function createJavaInfo with new API. Implement JavaExportsProvider.
Added tests for checking JavaExportsProvider state. Refactored logic working with collection in favor of using Streams to improve readability. All other providers will be implemented in next CLs. previous CL with JavaCompilationArgsProvider implementation is https://github.com/bazelbuild/bazel/commit/32dff21d00ad7d1bdf50e8761d675a6e7e002de9, JavaSourceJarsProvider : https://github.com/bazelbuild/bazel/commit/5bd53cb609480ca896ca2d011f415b424c63ce63 RELNOTES:none PiperOrigin-RevId: 182342490
-rwxr-xr-xscripts/bootstrap/compile.sh2
-rw-r--r--src/create_embedded_tools.py4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java125
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java417
-rwxr-xr-xsrc/test/shell/testenv.sh4
6 files changed, 346 insertions, 214 deletions
diff --git a/scripts/bootstrap/compile.sh b/scripts/bootstrap/compile.sh
index 3fbd6333a8..c7b26ccc72 100755
--- a/scripts/bootstrap/compile.sh
+++ b/scripts/bootstrap/compile.sh
@@ -17,7 +17,7 @@
# Script for building bazel from scratch without bazel
PROTO_FILES=$(ls src/main/protobuf/*.proto src/main/java/com/google/devtools/build/lib/buildeventstream/proto/*.proto)
-LIBRARY_JARS=$(find third_party -name '*.jar' | grep -Fv JavaBuilder | grep -Fv third_party/guava | grep -Fv third_party/guava | grep -ve 'third_party/grpc/grpc.*jar' | tr "\n" " ")
+LIBRARY_JARS=$(find third_party -name '*.jar' | grep -Fv /javac-9-dev-r3297-4.jar | grep -Fv /javac-9-dev-4023-3.jar | grep -Fv /javac7.jar | grep -Fv JavaBuilder | grep -Fv third_party/guava | grep -Fv third_party/guava | grep -ve 'third_party/grpc/grpc.*jar' | tr "\n" " ")
GRPC_JAVA_VERSION=1.7.0
GRPC_LIBRARY_JARS=$(find third_party/grpc -name '*.jar' | grep -e ".*${GRPC_JAVA_VERSION}.*jar" | tr "\n" " ")
GUAVA_VERSION=23.1
diff --git a/src/create_embedded_tools.py b/src/create_embedded_tools.py
index 352069c411..17d747fafc 100644
--- a/src/create_embedded_tools.py
+++ b/src/create_embedded_tools.py
@@ -35,8 +35,8 @@ output_paths = [
('*JacocoCoverage*_deploy.jar',
lambda x: 'tools/jdk/JacocoCoverage_deploy.jar'),
('*turbine_deploy.jar', lambda x: 'tools/jdk/turbine_deploy.jar'),
- ('*javac-9+181-r4173-1.jar',
- lambda x: 'third_party/java/jdk/langtools/javac-9+181-r4173-1.jar'),
+ ('*javac-9-dev-r4023-3.jar',
+ lambda x: 'third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar'),
('*SingleJar_deploy.jar',
lambda x: 'tools/jdk/singlejar/SingleJar_deploy.jar'),
('*GenClass_deploy.jar', lambda x: 'tools/jdk/GenClass_deploy.jar'),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
index d93f4dba1e..34b0ddb17c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationArgsProvider.java
@@ -15,13 +15,14 @@
package com.google.devtools.build.lib.rules.java;
import com.google.auto.value.AutoValue;
+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.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
-import java.util.List;
+import java.util.Collection;
/**
* An interface for objects that provide information on how to include them in
@@ -87,9 +88,10 @@ public abstract class JavaCompilationArgsProvider implements TransitiveInfoProvi
*/
public abstract NestedSet<Artifact> getRunTimeJavaDependencyArtifacts();
- public static JavaCompilationArgsProvider merge(List<JavaCompilationArgsProvider> providers) {
+ public static JavaCompilationArgsProvider merge(
+ Collection<JavaCompilationArgsProvider> providers) {
if (providers.size() == 1) {
- return providers.get(0);
+ return Iterables.get(providers, 0);
}
JavaCompilationArgs.Builder javaCompilationArgs = JavaCompilationArgs.builder();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
index 38c25b1c18..3abd390817 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
@@ -13,22 +13,25 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.java;
+import static com.google.common.collect.Iterables.concat;
import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.BOTH;
import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.COMPILE_ONLY;
import static com.google.devtools.build.lib.rules.java.JavaCompilationArgs.ClasspathType.RUNTIME_ONLY;
+import static java.util.stream.Stream.concat;
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.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.Runfiles;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.actions.CustomCommandLine;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.analysis.actions.SpawnAction.Builder;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode;
import com.google.devtools.build.lib.analysis.skylark.SkylarkActionFactory;
import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
+import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -39,6 +42,9 @@ import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkType;
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import java.util.List;
+import java.util.Objects;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
import javax.annotation.Nullable;
/** Implements logic for creating JavaInfo from different set of input parameters. */
@@ -71,7 +77,7 @@ final class JavaInfoBuildHelper {
* @return new created JavaInfo instance
* @throws EvalException if some mandatory parameter are missing
*/
- // TODO(b/69780248) only populates JavaInfo with JavaCompilationArgsProvider. See #3769
+ // TODO(b/69780248): only populates JavaInfo with JavaCompilationArgsProvider. See #3769
public JavaInfo createJavaInfo(
Artifact outputJar,
SkylarkList<Artifact> sourceFiles,
@@ -80,7 +86,7 @@ final class JavaInfoBuildHelper {
Boolean neverlink,
SkylarkList<JavaInfo> compileTimeDeps,
SkylarkList<JavaInfo> runtimeDeps,
- SkylarkList<JavaInfo> exports, // TODO(b/69780248) handle exports. See #3769
+ SkylarkList<JavaInfo> exports, // TODO(b/69780248): handle exports. See #3769
Object action,
Object javaToolchain,
Location location)
@@ -108,44 +114,90 @@ final class JavaInfoBuildHelper {
JavaCompilationArgs.Builder recursiveJavaCompilationArgsBuilder =
JavaCompilationArgs.Builder.copyOf(javaCompilationArgsBuilder);
-
ClasspathType type = neverlink ? COMPILE_ONLY : BOTH;
- recursiveJavaCompilationArgsBuilder.addTransitiveArgs(
- fetchAggregatedRecursiveJavaCompilationArgsFromProvider(compileTimeDeps), type);
- recursiveJavaCompilationArgsBuilder.addTransitiveArgs(
- fetchAggregatedRecursiveJavaCompilationArgsFromProvider(runtimeDeps), RUNTIME_ONLY);
+ fetchProviders(exports, JavaCompilationArgsProvider.class)
+ .map(JavaCompilationArgsProvider::getJavaCompilationArgs)
+ .forEach(args->javaCompilationArgsBuilder.addTransitiveArgs(args, type));
+
+ fetchProviders(concat(exports, compileTimeDeps), JavaCompilationArgsProvider.class)
+ .map(JavaCompilationArgsProvider::getRecursiveJavaCompilationArgs)
+ .forEach(args->recursiveJavaCompilationArgsBuilder.addTransitiveArgs(args, type));
- javaInfoBuilder.addProvider(
- JavaCompilationArgsProvider.class,
+ fetchProviders(runtimeDeps, JavaCompilationArgsProvider.class)
+ .map(JavaCompilationArgsProvider::getRecursiveJavaCompilationArgs)
+ .forEach(args->recursiveJavaCompilationArgsBuilder.addTransitiveArgs(args, RUNTIME_ONLY));
+
+ javaInfoBuilder.addProvider(JavaCompilationArgsProvider.class,
JavaCompilationArgsProvider.create(
javaCompilationArgsBuilder.build(), recursiveJavaCompilationArgsBuilder.build()));
+ javaInfoBuilder.addProvider(JavaExportsProvider.class, createJavaExportsProvider(exports));
+
+ javaInfoBuilder.addProvider(JavaSourceJarsProvider.class,
+ createJavaSourceJarsProvider(sourceJars, concat(compileTimeDeps, runtimeDeps, exports)));
+
+ // TODO(b/69780248): add other providers. See #3769
+
+ return javaInfoBuilder.build();
+ }
+
+ private JavaSourceJarsProvider createJavaSourceJarsProvider(
+ Iterable<Artifact> sourceJars, Iterable<JavaInfo> transitiveDeps) {
NestedSetBuilder<Artifact> transitiveSourceJars = NestedSetBuilder.stableOrder();
+
transitiveSourceJars.addAll(sourceJars);
- addSourceJars(transitiveSourceJars, Iterables.concat(compileTimeDeps, runtimeDeps));
- javaInfoBuilder.addProvider(
- JavaSourceJarsProvider.class,
- JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars));
+ fetchSourceJars(transitiveDeps)
+ .forEach(transitiveSourceJars::addTransitive);
- // TODO(b/69780248) add other providers. See #3769
+ return JavaSourceJarsProvider.create(transitiveSourceJars.build(), sourceJars);
+ }
- return javaInfoBuilder.build();
+ private Iterable<NestedSet<Artifact>> fetchSourceJars(Iterable<JavaInfo> javaInfos) {
+ Stream<NestedSet<Artifact>> sourceJars =
+ fetchProviders(javaInfos, JavaSourceJarsProvider.class)
+ .map(JavaSourceJarsProvider::getSourceJars)
+ .map(sourceJarsList -> NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJarsList));
+
+ Stream<NestedSet<Artifact>> transitiveSourceJars =
+ fetchProviders(javaInfos, JavaSourceJarsProvider.class)
+ .map(JavaSourceJarsProvider::getTransitiveSourceJars);
+
+ return concat(sourceJars, transitiveSourceJars)::iterator;
+ }
+
+ /**
+ * Returns Stream of not null Providers.
+ *
+ * Gets Stream from dependencies, transforms to Provider defined by providerClass param
+ * and filters nulls.
+ *
+ * @see JavaInfo#merge(List)
+ */
+ private <P extends TransitiveInfoProvider>Stream<P> fetchProviders(Iterable<JavaInfo> javaInfos,
+ Class<P> providerClass){
+ return StreamSupport.stream(javaInfos.spliterator(), /*parallel=*/ false)
+ .map(javaInfo -> javaInfo.getProvider(providerClass))
+ .filter(Objects::nonNull);
}
+ private JavaExportsProvider createJavaExportsProvider(Iterable<JavaInfo> javaInfos) {
+ NestedSet<Label> exportsNestedSet = fetchExports(javaInfos);
+
+ // TODO(b/69780248): I need to add javaInfos there too. See #3769
+ // The problem is JavaInfo can not be converted to Label.
+ return new JavaExportsProvider(exportsNestedSet);
+ }
- private void addSourceJars(NestedSetBuilder<Artifact> builder, Iterable<JavaInfo> javaInfos){
- List<JavaSourceJarsProvider> javaSourceJarsProviders =
- JavaInfo.getProvidersFromListOfJavaProviders(JavaSourceJarsProvider.class, javaInfos);
+ private NestedSet<Label> fetchExports(Iterable<JavaInfo> javaInfos){
+ NestedSetBuilder<Label> builder = NestedSetBuilder.stableOrder();
- for (JavaSourceJarsProvider sourceJarsProvider : javaSourceJarsProviders) {
- builder.addTransitive(sourceJarsProvider.getTransitiveSourceJars());
+ fetchProviders(javaInfos, JavaExportsProvider.class)
+ .map(JavaExportsProvider::getTransitiveExports)
+ .forEach(builder::addTransitive);
- NestedSet<Artifact> directSrc = NestedSetBuilder.<Artifact>stableOrder()
- .addAll(sourceJarsProvider.getSourceJars()).build();
- builder.addTransitive(directSrc);
- }
+ return builder.build();
}
public JavaInfo create(
@@ -282,7 +334,7 @@ final class JavaInfoBuildHelper {
JavaPluginInfoProvider transitivePluginsProvider =
JavaPluginInfoProvider.merge(
- Iterables.concat(
+ concat(
JavaInfo.getProvidersFromListOfJavaProviders(
JavaPluginInfoProvider.class, exportedPlugins),
JavaInfo.getProvidersFromListOfJavaProviders(
@@ -364,27 +416,6 @@ final class JavaInfoBuildHelper {
return javaToolchainProvider;
}
-
- /**
- * Merge collection of JavaInfos to one. Gets CompilationArgsProvider and call
- * getRecursiveJavaCompilationArgs on it and return.
- *
- * @see JavaInfo#merge(List)
- */
- private JavaCompilationArgs fetchAggregatedRecursiveJavaCompilationArgsFromProvider(
- SkylarkList<JavaInfo> dependencies) {
-
- JavaInfo aggregatedDependencies = JavaInfo.merge(dependencies);
- JavaCompilationArgsProvider compilationArgsProvider =
- aggregatedDependencies.getProvider(JavaCompilationArgsProvider.class);
- if (compilationArgsProvider == null) {
- // this should not happen: JavaInfo.merge() always creates JavaCompilationArgsProvider
- throw new IllegalStateException(
- "compilationArgsProvider is null. check JavaInfo.merge implementation.");
- }
- return compilationArgsProvider.getRecursiveJavaCompilationArgs();
- }
-
private static StrictDepsMode getStrictDepsMode(String strictDepsMode) {
switch (strictDepsMode) {
case "OFF":
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index 68b36082e9..f617ba8c1f 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.syntax.SkylarkList;
import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
import com.google.devtools.build.lib.testutil.TestConstants;
import com.google.devtools.build.lib.vfs.PathFragment;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
@@ -1489,23 +1490,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void javaInfoBuildHelperCreateJavaInfoWithOutputJarOnly() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar, ",
- " use_ijar = False",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label(), ",
- " 'output_jar' : attr.label(allow_single_file=True)",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1531,9 +1516,6 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
.containsExactly("foo/my_skylark_rule_lib.jar");
-
-
-
assertThat(
prettyJarNames(
javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
@@ -1544,8 +1526,6 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
.getRecursiveJavaCompilationArgs()
.getFullCompileTimeJars()))
.containsExactly("foo/my_skylark_rule_lib.jar");
-
-
assertThat(
prettyJarNames(
javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
@@ -1617,25 +1597,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void javaInfoBuildHelperCreateJavaInfoWithDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1679,32 +1641,14 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void javaInfoBuildHelperCreateJavaInfoWithRunTimeDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " runtime_deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
"java_library(name = 'my_java_lib_direct', srcs = ['java/A.java'])",
"my_rule(name = 'my_skylark_rule',",
" output_jar = 'my_skylark_rule_lib.jar',",
- " dep = [':my_java_lib_direct']",
+ " dep_runtime = [':my_java_lib_direct']",
")");
assertNoEvents();
@@ -1804,32 +1748,12 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testJavaInfoJavaSourceJarsProviderWithSourceJars() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " source_jars = ctx.files.source_jars",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " 'source_jars' : attr.label_list(allow_files=['.jar']),",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
- "java_library(name = 'my_java_lib_direct', srcs = ['java/A.java'])",
"my_rule(name = 'my_skylark_rule',",
" output_jar = 'my_skylark_rule_lib.jar',",
- " dep = [':my_java_lib_direct'],",
" source_jars = ['my_skylark_rule_src.jar']",
")");
assertNoEvents();
@@ -1846,25 +1770,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testJavaInfoJavaSourceJarsProviderWithDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1886,32 +1792,14 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testJavaInfoJavaSourceJarsProviderAndRuntimeDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " runtime_deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
"java_library(name = 'my_java_lib_direct', srcs = ['java/A.java'])",
"my_rule(name = 'my_skylark_rule',",
" output_jar = 'my_skylark_rule_lib.jar',",
- " dep = [':my_java_lib_direct']",
+ " dep_runtime = [':my_java_lib_direct']",
")");
assertNoEvents();
@@ -1926,25 +1814,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testCreateJavaInfoWithJavaSourceJarsProviderAndTransitiveDeps() throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -1971,25 +1841,7 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
@Test
public void testCreateJavaInfoWithJavaSourceJarsProviderAndTransitiveRuntimeDeps()
throws Exception {
- scratch.file(
- "foo/extension.bzl",
- "result = provider()",
- "def _impl(ctx):",
- " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
- " javaInfo = JavaInfo(",
- " output_jar = ctx.file.output_jar,",
- " use_ijar = False,",
- " runtime_deps = dp",
- " )",
- " return [result(property = javaInfo)]",
- "my_rule = rule(",
- " implementation = _impl,",
- " attrs = {",
- " 'dep' : attr.label_list(), ",
- " 'output_jar' : attr.label(allow_single_file=True), ",
- " }",
- ")");
-
+ defineMyRuleWithJavaInfo();
scratch.file(
"foo/BUILD",
"load(':extension.bzl', 'my_rule')",
@@ -2013,6 +1865,253 @@ public class JavaSkylarkApiTest extends BuildViewTestCase {
"foo/libmy_java_lib_direct-src.jar", "foo/libmy_java_lib_transitive-src.jar");
}
+ /**
+ * Tests that JavaExportsProvider is empty by default.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportIsEmpty() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ ")");
+ assertNoEvents();
+
+ JavaExportsProvider exportsProvider = fetchJavaInfo().getProvider(JavaExportsProvider.class);
+
+ assertThat(exportsProvider.getTransitiveExports()).isEmpty();
+ }
+
+ /**
+ * Test exports adds dependencies to JavaCompilationArgsProvider.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportProviderExportsDepsAdded() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'my_java_lib_exports', srcs = ['java/A.java'])",
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ " dep_exports = [':my_java_lib_exports']",
+ ")");
+ assertNoEvents();
+
+ JavaInfo javaInfo = fetchJavaInfo();
+
+ JavaExportsProvider exportsProvider = javaInfo.getProvider(JavaExportsProvider.class);
+
+ assertThat(exportsProvider.getTransitiveExports()).isEmpty();
+
+ JavaCompilationArgsProvider javaCompilationArgsProvider =
+ javaInfo.getProvider(JavaCompilationArgsProvider.class);
+
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports-hjar.jar");
+
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider
+ .getRecursiveJavaCompilationArgs()
+ .getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_exports.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar",
+ "foo/libmy_java_lib_exports-hjar.jar");
+ }
+
+ /**
+ * Test exports adds itself and recursive dependencies to JavaCompilationArgsProvider
+ * and JavaExportsProvider populated.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportProvider() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'my_java_lib_c', srcs = ['java/C.java'])",
+ "java_library(name = 'my_java_lib_b', srcs = ['java/B.java'])",
+ "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'],",
+ " deps = [':my_java_lib_b', ':my_java_lib_c'],",
+ " exports = [':my_java_lib_b']",
+ " )",
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ " dep_exports = [':my_java_lib_a']",
+ ")");
+ assertNoEvents();
+
+ JavaInfo javaInfo = fetchJavaInfo();
+
+ JavaExportsProvider exportsProvider = javaInfo.getProvider(JavaExportsProvider.class);
+
+ assertThat(
+ exportsProvider.getTransitiveExports())
+ .containsExactly(Label.parseAbsolute("//foo:my_java_lib_b"));
+
+ JavaCompilationArgsProvider javaCompilationArgsProvider =
+ javaInfo.getProvider(JavaCompilationArgsProvider.class);
+
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar");
+
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar",
+ "foo/libmy_java_lib_a.jar", "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar");
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider
+ .getRecursiveJavaCompilationArgs()
+ .getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar",
+ "foo/libmy_java_lib_a.jar", "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar", "foo/libmy_java_lib_c-hjar.jar");
+ }
+
+
+ /**
+ * Tests case:
+ * my_lib
+ * // \
+ * a c
+ * // \\
+ * b d
+ *
+ * where single line is normal dependency and double is exports dependency.
+ */
+ @Test
+ public void javaInfoBuildHelperCreateJavaInfoExportProvider001() throws Exception {
+ defineMyRuleWithJavaInfo();
+ scratch.file(
+ "foo/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'my_java_lib_b', srcs = ['java/B.java'])",
+ "java_library(name = 'my_java_lib_a', srcs = ['java/A.java'],",
+ " deps = [':my_java_lib_b'],",
+ " exports = [':my_java_lib_b']",
+ " )",
+ "java_library(name = 'my_java_lib_d', srcs = ['java/D.java'])",
+ "java_library(name = 'my_java_lib_c', srcs = ['java/C.java'],",
+ " deps = [':my_java_lib_d'],",
+ " exports = [':my_java_lib_d']",
+ " )",
+
+ "my_rule(name = 'my_skylark_rule',",
+ " output_jar = 'my_skylark_rule_lib.jar',",
+ " dep = [':my_java_lib_a', ':my_java_lib_c'],",
+ " dep_exports = [':my_java_lib_a']",
+ ")");
+ assertNoEvents();
+
+ JavaInfo javaInfo = fetchJavaInfo();
+
+ JavaExportsProvider exportsProvider = javaInfo.getProvider(JavaExportsProvider.class);
+
+ assertThat(
+ exportsProvider.getTransitiveExports())
+ .containsExactly(Label.parseAbsolute("//foo:my_java_lib_b"));
+
+ JavaCompilationArgsProvider javaCompilationArgsProvider =
+ javaInfo.getProvider(JavaCompilationArgsProvider.class);
+
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider.getJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar");
+
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar", "foo/libmy_java_lib_d.jar");
+ assertThat(
+ prettyJarNames(javaCompilationArgsProvider
+ .getRecursiveJavaCompilationArgs()
+ .getFullCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a.jar",
+ "foo/libmy_java_lib_b.jar", "foo/libmy_java_lib_c.jar", "foo/libmy_java_lib_d.jar");
+ assertThat(
+ prettyJarNames(
+ javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getCompileTimeJars()))
+ .containsExactly("foo/my_skylark_rule_lib.jar", "foo/libmy_java_lib_a-hjar.jar",
+ "foo/libmy_java_lib_b-hjar.jar", "foo/libmy_java_lib_c-hjar.jar",
+ "foo/libmy_java_lib_d-hjar.jar");
+ }
+
+ private void defineMyRuleWithJavaInfo() throws IOException {
+ scratch.file(
+ "foo/extension.bzl",
+ "result = provider()",
+ "def _impl(ctx):",
+ " dp = [dep[java_common.provider] for dep in ctx.attr.dep]",
+ " dp_runtime = [dep[java_common.provider] for dep in ctx.attr.dep_runtime]",
+ " dp_exports = [dep[java_common.provider] for dep in ctx.attr.dep_exports]",
+ " javaInfo = JavaInfo(",
+ " output_jar = ctx.file.output_jar, ",
+ " use_ijar = False,",
+ " source_jars = ctx.files.source_jars,",
+ " deps = dp,",
+ " runtime_deps = dp_runtime,",
+ " exports = dp_exports,",
+ " )",
+ " return [result(property = javaInfo)]",
+ "my_rule = rule(",
+ " implementation = _impl,",
+ " attrs = {",
+ " 'dep' : attr.label_list(),",
+ " 'dep_runtime' : attr.label_list(),",
+ " 'dep_exports' : attr.label_list(),",
+ " 'output_jar' : attr.label(allow_single_file=True),",
+ " 'source_jars' : attr.label_list(allow_files=['.jar'])",
+ " }",
+ ")");
+ }
+
private JavaInfo fetchJavaInfo() throws LabelSyntaxException {
ConfiguredTarget myRuleTarget = getConfiguredTarget("//foo:my_skylark_rule");
Info info =
diff --git a/src/test/shell/testenv.sh b/src/test/shell/testenv.sh
index e0bca651c3..b8bc2e02b7 100755
--- a/src/test/shell/testenv.sh
+++ b/src/test/shell/testenv.sh
@@ -413,8 +413,8 @@ function create_new_workspace() {
copy_tools_directory
- [ -e third_party/java/jdk/langtools/javac-9+181-r4173-1.jar ] \
- || ln -s "${langtools_path}" third_party/java/jdk/langtools/javac-9+181-r4173-1.jar
+ [ -e third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar ] \
+ || ln -s "${langtools_path}" third_party/java/jdk/langtools/javac-9-dev-r4023-3.jar
touch WORKSPACE
}