diff options
author | 2016-02-24 15:15:47 +0000 | |
---|---|---|
committer | 2016-02-24 18:01:57 +0000 | |
commit | 278e2bea425ab0b10718b3100bde1da7032a9d12 (patch) | |
tree | aef9288f6903b0cc96c6fa974887870495682288 | |
parent | 3b58ea944dee8d50c00696d63b394ec018914d1d (diff) |
Expose IDL information about Android targets to Skylark.
Make more tests pass for Skylark IDE info aspect implementation.
--
MOS_MIGRATED_REVID=115448483
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), |