Skip to content

Commit

Permalink
Add java_common.create_provider to allow creating a java_common.provider
Browse files Browse the repository at this point in the history
from already compiled jars.

Progress on #2614.

--
PiperOrigin-RevId: 149750579
MOS_MIGRATED_REVID=149750579
  • Loading branch information
iirina authored and vladmos committed Mar 10, 2017
1 parent 1a6beba commit 3695880
Show file tree
Hide file tree
Showing 2 changed files with 150 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,45 @@ public ClassObjectConstructor getJavaProvider() {
return JavaProvider.JAVA_PROVIDER;
}

@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 "
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,19 +85,120 @@ public String apply(@Nullable Object o) {
}

@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
Expand Down

0 comments on commit 3695880

Please sign in to comment.