diff options
author | dbabkin <dbabkin@google.com> | 2018-01-18 02:46:28 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-01-18 02:48:27 -0800 |
commit | fca3d391161ae4c92cf289a897db2a1c69a9b334 (patch) | |
tree | 21c89f04328e20382cb2b634c23c372b8a9e7bff | |
parent | adecfb2101a1bb19c53ab6c0361cd59073f8b723 (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
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 } |