diff options
author | Irina Iancu <elenairina@google.com> | 2017-03-10 13:51:48 +0000 |
---|---|---|
committer | Vladimir Moskva <vladmos@google.com> | 2017-03-10 14:12:15 +0000 |
commit | 36958806f2cd38dc51e64cd7bcc557bd143bbdb6 (patch) | |
tree | a4ae4473aab19b52604a3f6eb9569256ede13bca | |
parent | 1a6bebaefb4cc9d92b024289fffd2624b62bf8d7 (diff) |
Add java_common.create_provider to allow creating a java_common.provider
from already compiled jars.
Progress on #2614.
--
PiperOrigin-RevId: 149750579
MOS_MIGRATED_REVID=149750579
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java | 39 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java | 121 |
2 files changed, 150 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java index 94d335f91c..3b5935055b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java @@ -53,6 +53,45 @@ public class JavaSkylarkCommon { } @SkylarkCallable( + name = "create_provider", + documented = false, + parameters = { + @Param( + name = "compile_time_jars", + positional = false, + named = true, + type = SkylarkList.class, + generic1 = Artifact.class, + defaultValue = "[]" + ), + @Param( + name = "runtime_jars", + positional = false, + named = true, + type = SkylarkList.class, + generic1 = Artifact.class, + defaultValue = "[]" + ) + } + ) + public JavaProvider create( + SkylarkList<Artifact> compileTimeJars, + SkylarkList<Artifact> runtimeJars) { + JavaCompilationArgs javaCompilationArgs = JavaCompilationArgs.builder() + .addCompileTimeJars(compileTimeJars) + .addRuntimeJars(runtimeJars) + .build(); + JavaCompilationArgs recursiveJavaCompilationArgs = JavaCompilationArgs.builder() + .addCompileTimeJars(compileTimeJars) + .addRuntimeJars(runtimeJars).build(); + JavaProvider javaProvider = JavaProvider.Builder.create().addProvider( + JavaCompilationArgsProvider.class, + JavaCompilationArgsProvider.create(javaCompilationArgs, recursiveJavaCompilationArgs)) + .build(); + return javaProvider; + } + + @SkylarkCallable( name = "compile", doc = "Compiles Java source files/jars from the implementation of a Skylark rule and returns a " + "provider that represents the results of the compilation and can be added to the set of " 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 d799bdacb2..1150226874 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 @@ -85,19 +85,120 @@ public class JavaSkylarkApiTest extends BuildViewTestCase { } @Test - public void cannotConstructJavaProvider() throws Exception { + public void constructJavaProvider() throws Exception { scratch.file( "foo/extension.bzl", - "my_provider = provider()", "def _impl(ctx):", - " java_p = java_common.provider", - " dep_params = java_p()", - " return [my_provider(p = dep_params)]", - "my_rule = rule(_impl, attrs = { 'dep' : attr.label() })"); - scratch.file("foo/BUILD", "load(':extension.bzl', 'my_rule')", "my_rule(name = 'r')"); - reporter.removeHandler(failFastHandler); - assertThat(getConfiguredTarget("//foo:r")).isNull(); - assertContainsEvent("'java_common.provider' cannot be constructed from Skylark"); + " my_provider = java_common.create_provider(", + " compile_time_jars = ctx.files.compile_time_jars,", + " runtime_jars = ctx.files.runtime_jars)", + " return [my_provider]", + "my_rule = rule(_impl, ", + " attrs = { ", + " 'compile_time_jars' : attr.label_list(allow_files=['.jar']),", + " 'runtime_jars': attr.label_list(allow_files=['.jar'])", + "})"); + scratch.file("foo/liba.jar"); + scratch.file("foo/libb.jar"); + scratch.file("foo/BUILD", + "load(':extension.bzl', 'my_rule')", + "my_rule(name = 'myrule',", + " compile_time_jars = ['liba.jar'],", + " runtime_jars = ['libb.jar']", + ")" + ); + ConfiguredTarget target = getConfiguredTarget("//foo:myrule"); + JavaCompilationArgsProvider provider = + JavaProvider.getProvider(JavaCompilationArgsProvider.class, target); + assertThat(provider).isNotNull(); + List<String> compileTimeJars = + prettyJarNames(provider.getJavaCompilationArgs().getCompileTimeJars()); + assertThat(compileTimeJars).containsExactly("foo/liba.jar"); + + List<String> runtimeJars = prettyJarNames( + provider.getRecursiveJavaCompilationArgs().getRuntimeJars()); + assertThat(runtimeJars).containsExactly("foo/libb.jar"); + } + + @Test + public void constructJavaProviderWithAnotherJavaProvider() throws Exception { + scratch.file( + "foo/extension.bzl", + "def _impl(ctx):", + " transitive_provider = java_common.merge(", + " [dep[java_common.provider] for dep in ctx.attr.deps])", + " my_provider = java_common.create_provider(", + " compile_time_jars = ctx.files.compile_time_jars,", + " runtime_jars = ctx.files.runtime_jars)", + " return [java_common.merge([my_provider, transitive_provider])]", + "my_rule = rule(_impl, ", + " attrs = { ", + " 'compile_time_jars' : attr.label_list(allow_files=['.jar']),", + " 'runtime_jars': attr.label_list(allow_files=['.jar']),", + " 'deps': attr.label_list()", + "})"); + scratch.file("foo/liba.jar"); + scratch.file("foo/libb.jar"); + scratch.file("foo/BUILD", + "load(':extension.bzl', 'my_rule')", + "java_library(name = 'java_dep',", + " srcs = ['A.java'])", + "my_rule(name = 'myrule',", + " compile_time_jars = ['liba.jar'],", + " runtime_jars = ['libb.jar'],", + " deps = [':java_dep']", + ")" + ); + ConfiguredTarget target = getConfiguredTarget("//foo:myrule"); + JavaCompilationArgsProvider provider = + JavaProvider.getProvider(JavaCompilationArgsProvider.class, target); + assertThat(provider).isNotNull(); + List<String> compileTimeJars = + prettyJarNames(provider.getJavaCompilationArgs().getCompileTimeJars()); + assertThat(compileTimeJars).containsExactly("foo/liba.jar", "foo/libjava_dep-hjar.jar"); + + List<String> runtimeJars = prettyJarNames( + provider.getRecursiveJavaCompilationArgs().getRuntimeJars()); + assertThat(runtimeJars).containsExactly("foo/libb.jar", "foo/libjava_dep.jar"); + } + + @Test + public void constructJavaProviderJavaLibrary() throws Exception { + scratch.file( + "foo/extension.bzl", + "def _impl(ctx):", + " my_provider = java_common.create_provider(", + " compile_time_jars = ctx.files.compile_time_jars,", + " runtime_jars = ctx.files.runtime_jars)", + " return [my_provider]", + "my_rule = rule(_impl, ", + " attrs = { ", + " 'compile_time_jars' : attr.label_list(allow_files=['.jar']),", + " 'runtime_jars': attr.label_list(allow_files=['.jar'])", + "})"); + scratch.file("foo/liba.jar"); + scratch.file("foo/libb.jar"); + scratch.file("foo/BUILD", + "load(':extension.bzl', 'my_rule')", + "my_rule(name = 'myrule',", + " compile_time_jars = ['liba.jar'],", + " runtime_jars = ['libb.jar']", + ")", + "java_library(name = 'java_lib',", + " srcs = ['C.java'],", + " deps = [':myrule']", + ")" + ); + ConfiguredTarget target = getConfiguredTarget("//foo:java_lib"); + JavaCompilationArgsProvider provider = + JavaProvider.getProvider(JavaCompilationArgsProvider.class, target); + List<String> compileTimeJars = prettyJarNames( + provider.getRecursiveJavaCompilationArgs().getCompileTimeJars()); + assertThat(compileTimeJars).containsExactly("foo/libjava_lib-hjar.jar", "foo/liba.jar"); + + List<String> runtimeJars = prettyJarNames( + provider.getRecursiveJavaCompilationArgs().getRuntimeJars()); + assertThat(runtimeJars).containsExactly("foo/libjava_lib.jar", "foo/libb.jar"); } @Test |