aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Irina Iancu <elenairina@google.com>2017-03-10 13:51:48 +0000
committerGravatar Vladimir Moskva <vladmos@google.com>2017-03-10 14:12:15 +0000
commit36958806f2cd38dc51e64cd7bcc557bd143bbdb6 (patch)
treea4ae4473aab19b52604a3f6eb9569256ede13bca
parent1a6bebaefb4cc9d92b024289fffd2624b62bf8d7 (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.java39
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java121
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