aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2016-02-24 15:15:47 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2016-02-24 18:01:57 +0000
commit278e2bea425ab0b10718b3100bde1da7032a9d12 (patch)
treeaef9288f6903b0cc96c6fa974887870495682288
parent3b58ea944dee8d50c00696d63b394ec018914d1d (diff)
Expose IDL information about Android targets to Skylark.
Make more tests pass for Skylark IDE info aspect implementation. -- MOS_MIGRATED_REVID=115448483
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java82
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java1
-rw-r--r--src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java12
-rw-r--r--src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl23
4 files changed, 97 insertions, 21 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
index 2c4a017c46..a99faa5152 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSkylarkApiProvider.java
@@ -13,11 +13,16 @@
// limitations under the License.
package com.google.devtools.build.lib.rules.android;
+import com.google.common.collect.ImmutableCollection;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.rules.SkylarkApiProvider;
+import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
+import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import javax.annotation.Nullable;
+
/**
* A class that exposes the Android providers to Skylark. It is intended to provide a
* simple and stable interface for Skylark users.
@@ -30,6 +35,8 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
/** The name of the field in Skylark used to access this class. */
public static final String NAME = "android";
+ private final IdlInfo idlInfo = new IdlInfo();
+
@SkylarkCallable(
name = "apk",
structField = true,
@@ -37,7 +44,11 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns an APK produced by this target."
)
public Artifact getApk() {
- return getInfo().getProvider(AndroidIdeInfoProvider.class).getSignedApk();
+ return getIdeInfoProvider().getSignedApk();
+ }
+
+ private AndroidIdeInfoProvider getIdeInfoProvider() {
+ return getInfo().getProvider(AndroidIdeInfoProvider.class);
}
@SkylarkCallable(
@@ -47,7 +58,7 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns a java package for this target."
)
public String getJavaPackage() {
- return getInfo().getProvider(AndroidIdeInfoProvider.class).getJavaPackage();
+ return getIdeInfoProvider().getJavaPackage();
}
@SkylarkCallable(
@@ -57,6 +68,71 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider {
doc = "Returns a manifest file for this target."
)
public Artifact getManifest() {
- return getInfo().getProvider(AndroidIdeInfoProvider.class).getManifest();
+ return getIdeInfoProvider().getManifest();
+ }
+
+ @SkylarkCallable(
+ name = "apks_under_test",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a collection of APKs that this target tests."
+ )
+ public ImmutableCollection<Artifact> getApksUnderTest() {
+ return getIdeInfoProvider().getApksUnderTest();
+ }
+
+
+ @SkylarkCallable(
+ name = "idl",
+ structField = true,
+ doc = "Returns information about IDL files associated with this target."
+ )
+ public IdlInfo getIdlInfo() {
+ return idlInfo;
+ }
+
+ /**
+ * Helper class to provide information about IDLs related to this rule.
+ */
+ @SkylarkModule(
+ name = "AndroidSkylarkIdlInfo",
+ doc = "Provides access to information about Android rules"
+ )
+ public class IdlInfo {
+ @SkylarkCallable(
+ name = "sources",
+ structField = true,
+ doc = "Returns a list of IDL files."
+ )
+ public ImmutableCollection<Artifact> getSources() {
+ return getIdeInfoProvider().getIdlSrcs();
+ }
+ @SkylarkCallable(
+ name = "generated_java_files",
+ structField = true,
+ doc = "Returns a list Java files generated from IDL sources."
+ )
+ public ImmutableCollection<Artifact> getIdlGeneratedJavaFiles() {
+ return getIdeInfoProvider().getIdlGeneratedJavaFiles();
+ }
+
+ @SkylarkCallable(
+ name = "output",
+ structField = true,
+ allowReturnNones = true,
+ doc = "Returns a jar file for classes generated from IDL sources."
+ )
+ @Nullable
+ public JavaRuleOutputJarsProvider.OutputJar getIdlOutput() {
+ if (getIdeInfoProvider().getIdlClassJar() == null) {
+ return null;
+ }
+
+ return new OutputJar(
+ getIdeInfoProvider().getIdlClassJar(),
+ null,
+ getIdeInfoProvider().getIdlSourceJar()
+ );
+ }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
index e83ad194a6..11d16fd2e8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
@@ -41,6 +41,7 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider
name = "JavaOutput",
doc = "Java classes jar, together with their associated source and interface archives"
)
+ @Immutable
public static class OutputJar {
@Nullable private final Artifact classJar;
@Nullable private final Artifact iJar;
diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
index f7daa7bad1..b69f82e6d6 100644
--- a/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
+++ b/src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java
@@ -464,10 +464,6 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
@Test
public void testAspectIsPropagatedAcrossExports() throws Exception {
- if (!isNativeTest()) {
- return;
- }
-
scratch.file(
"com/google/example/BUILD",
"java_library(",
@@ -698,10 +694,6 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
@Test
public void testAndroidLibraryWithoutAidlHasNoIdlJars() throws Exception {
- if (!isNativeTest()) {
- return;
- }
-
scratch.file(
"java/com/google/example/BUILD",
"android_library(",
@@ -718,10 +710,6 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase
@Test
public void testAndroidLibraryWithAidlHasIdlJars() throws Exception {
- if (!isNativeTest()) {
- return;
- }
-
scratch.file(
"java/com/google/example/BUILD",
"android_library(",
diff --git a/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl b/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
index dc650d39c7..4a709f4b20 100644
--- a/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
+++ b/src/test/java/com/google/devtools/build/lib/ideinfo/intellij_info.bzl
@@ -85,6 +85,13 @@ def annotation_processing_jars(annotation_processing):
source_jar = artifact_location(annotation_processing.source_jar),
)
+def jars_from_output(output):
+ if output == None:
+ return []
+ return [jar
+ for jar in [output.class_jar, output.ijar, output.source_jar]
+ if jar != None and not jar.is_source]
+
def java_rule_ide_info(target, ctx):
if hasattr(ctx.rule.attr, "srcs"):
sources = [artifact_location(file)
@@ -96,8 +103,7 @@ def java_rule_ide_info(target, ctx):
jars = [library_artifact(output) for output in target.java.outputs.jars]
ide_resolve_files = set([jar
for output in target.java.outputs.jars
- for jar in [output.class_jar, output.ijar, output.source_jar]
- if jar != None and not jar.is_source])
+ for jar in jars_from_output(output)])
gen_jars = []
if target.java.annotation_processing and target.java.annotation_processing.enabled:
@@ -119,12 +125,16 @@ def java_rule_ide_info(target, ctx):
def android_rule_ide_info(target, ctx):
if not hasattr(target, 'android'):
- return None
- return struct_omit_none(
+ return (None, set())
+ ide_resolve_files = set(jars_from_output(target.android.idl.output))
+ return (struct_omit_none(
java_package = target.android.java_package,
manifest = artifact_location(target.android.manifest),
apk = artifact_location(target.android.apk),
- )
+ has_idl_sources = target.android.idl.output != None,
+ idl_jar = library_artifact(target.android.idl.output),
+ ),
+ ide_resolve_files)
def collect_transitive_labels(rule_attrs, attr_list):
return [str(dep.label)
@@ -154,7 +164,8 @@ def _aspect_impl(target, ctx):
java_rule_ide_info, java_ide_resolve_files = java_rule_ide_info(target, ctx)
ide_resolve_files = ide_resolve_files | java_ide_resolve_files
- android_rule_ide_info = android_rule_ide_info(target, ctx)
+ android_rule_ide_info, android_ide_resolve_files = android_rule_ide_info(target, ctx)
+ ide_resolve_files = ide_resolve_files | android_ide_resolve_files
info = struct_omit_none(
label = str(target.label),