aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2016-09-20 14:46:06 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2016-09-21 07:06:00 +0000
commit63010255876a81cf2b0bc4fc5d95a0e1a99df58d (patch)
tree1a78efb227c11c524936c2bdf589d1ec8be0be1f
parent96d46280bc5a4803ba2242a4ad16939f85a3b212 (diff)
Expose processor classpath and classnames to Skylark.
-- MOS_MIGRATED_REVID=133704700
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java28
-rw-r--r--src/test/java/com/google/devtools/build/lib/BUILD4
-rw-r--r--src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java82
4 files changed, 116 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 10a3ce704a..9fe251e6f9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -399,6 +399,8 @@ public class JavaCommon {
usesAnnotationProcessing,
genClassJar,
genSourceJar,
+ getProcessorClasspathJars(),
+ getProcessorClassNames(),
classJarsBuilder.build(),
sourceJarsBuilder.build()
);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
index dbcd487d0e..817b14a97c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.rules.java;
+import com.google.common.collect.ImmutableList;
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;
@@ -38,6 +39,10 @@ public final class JavaGenJarsProvider implements TransitiveInfoProvider {
private final Artifact genClassJar;
@Nullable
private final Artifact genSourceJar;
+
+ private final ImmutableList<Artifact> processorClasspath;
+ private final ImmutableList<String> processorClassNames;
+
private final NestedSet<Artifact> transitiveGenClassJars;
private final NestedSet<Artifact> transitiveGenSourceJars;
@@ -45,11 +50,14 @@ public final class JavaGenJarsProvider implements TransitiveInfoProvider {
boolean usesAnnotationProcessing,
@Nullable Artifact genClassJar,
@Nullable Artifact genSourceJar,
+ ImmutableList<Artifact> processorClasspath, ImmutableList<String> processorClassNames,
NestedSet<Artifact> transitiveGenClassJars,
NestedSet<Artifact> transitiveGenSourceJars) {
this.usesAnnotationProcessing = usesAnnotationProcessing;
this.genClassJar = genClassJar;
this.genSourceJar = genSourceJar;
+ this.processorClasspath = processorClasspath;
+ this.processorClassNames = processorClassNames;
this.transitiveGenClassJars = transitiveGenClassJars;
this.transitiveGenSourceJars = transitiveGenSourceJars;
}
@@ -106,4 +114,24 @@ public final class JavaGenJarsProvider implements TransitiveInfoProvider {
public NestedSet<Artifact> getTransitiveGenSourceJars() {
return transitiveGenSourceJars;
}
+
+ @SkylarkCallable(
+ name = "processor_classpath",
+ structField = true,
+ doc =
+ "Returns a classpath of annotation processors applied to this rule."
+ )
+ public ImmutableList<Artifact> getProcessorClasspath() {
+ return processorClasspath;
+ }
+
+ @SkylarkCallable(
+ name = "processor_classnames",
+ structField = true,
+ doc =
+ "Returns class names of annotation processors applied to this rule."
+ )
+ public ImmutableList<String> getProcessorClassNames() {
+ return processorClassNames;
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index efd0b6358c..68cd7d3769 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -879,9 +879,13 @@ java_test(
":testutil",
"//src/main/java/com/google/devtools/build/lib:bazel-main",
"//src/main/java/com/google/devtools/build/lib:bazel-rules",
+ "//src/main/java/com/google/devtools/build/lib:build-base",
"//src/main/java/com/google/devtools/build/lib:java-compilation",
"//src/main/java/com/google/devtools/build/lib:java-rules",
+ "//src/main/java/com/google/devtools/build/lib:packages-internal",
"//src/main/java/com/google/devtools/build/lib:vfs",
+ "//src/main/java/com/google/devtools/build/lib/actions",
+ "//src/main/java/com/google/devtools/build/lib/cmdline",
"//third_party:guava",
"//third_party:guava-testlib",
"//third_party:jsr305",
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
new file mode 100644
index 0000000000..453f47d1ad
--- /dev/null
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -0,0 +1,82 @@
+// Copyright 2016 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.google.devtools.build.lib.rules.java;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.base.Function;
+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.SkylarkProviders;
+import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.SkylarkClassObject;
+import com.google.devtools.build.lib.packages.SkylarkClassObjectConstructor.Key;
+import java.util.List;
+import javax.annotation.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Tests Skylark API for Java rules.
+ */
+@RunWith(JUnit4.class)
+public class JavaSkylarkApiTest extends BuildViewTestCase {
+ @Test
+ public void testJavaPlugin() throws Exception {
+ scratch.file(
+ "java/test/extension.bzl",
+ "result = provider()",
+ "def impl(ctx):",
+ " depj = ctx.attr.dep.java",
+ " return [result(",
+ " processor_classpath = depj.annotation_processing.processor_classpath,",
+ " processor_classnames = depj.annotation_processing.processor_classnames,",
+ " )]",
+ "my_rule = rule(impl, attrs = { 'dep' : attr.label() })"
+ );
+ scratch.file(
+ "java/test/BUILD",
+ "load(':extension.bzl', 'my_rule')",
+ "java_library(name = 'plugin_dep',",
+ " srcs = [ 'ProcessorDep.java'])",
+ "java_plugin(name = 'plugin',",
+ " srcs = ['AnnotationProcessor.java'],",
+ " processor_class = 'com.google.process.stuff',",
+ " deps = [ ':plugin_dep' ])",
+ "java_library(name = 'to_be_processed',",
+ " plugins = [':plugin'],",
+ " srcs = ['ToBeProcessed.java'])",
+ "my_rule(name = 'my', dep = ':to_be_processed')");
+ ConfiguredTarget configuredTarget = getConfiguredTarget("//java/test:my");
+ SkylarkProviders provider = configuredTarget.getProvider(SkylarkProviders.class);
+ SkylarkClassObject skylarkClassObject = provider
+ .getDeclaredProvider(new Key(Label.parseAbsolute("//java/test:extension.bzl"), "result"));
+
+ assertThat(Iterables.transform((List<?>) skylarkClassObject.getValue("processor_classpath"),
+ new Function<Object, String>() {
+ @Nullable
+ @Override
+ public String apply(@Nullable Object o) {
+ return ((Artifact) o).getFilename();
+ }
+ }))
+ .containsExactly("libplugin.jar", "libplugin_dep.jar");
+
+ assertThat((List<?>) skylarkClassObject.getValue("processor_classnames"))
+ .containsExactly("com.google.process.stuff");
+ }
+} \ No newline at end of file