diff options
7 files changed, 67 insertions, 18 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java index 1b95ca38ef..64f9293edd 100644 --- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java @@ -532,6 +532,15 @@ public class AndroidStudioInfoAspect extends NativeAspectClass implements Config builder.setLegacyResources(dependenciesResult.resources.toString()); } + OutputJar resourceJar = androidIdeInfoProvider.getResourceJar(); + if (resourceJar != null) { + LibraryArtifact resourceLibraryArtifact = makeLibraryArtifact(ideResolveArtifacts, + resourceJar.getClassJar(), resourceJar.getIJar(), resourceJar.getSrcJar()); + if (resourceLibraryArtifact != null) { + builder.setResourceJar(resourceLibraryArtifact); + } + } + return builder.build(); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java index 80606ce237..457416cc1c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java @@ -59,6 +59,7 @@ import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts; import com.google.devtools.build.lib.rules.java.JavaCompilationHelper; import com.google.devtools.build.lib.rules.java.JavaNativeLibraryProvider; 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.rules.java.JavaRuntimeJarProvider; import com.google.devtools.build.lib.rules.java.JavaSemantics; import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider; @@ -244,6 +245,7 @@ public class AndroidCommon { RuleContext ruleContext, AndroidSemantics semantics, AndroidIdlHelper idlHelper, + OutputJar resourceJar, ResourceApk resourceApk, Artifact zipAlignedApk, Iterable<Artifact> apksUnderTest) { @@ -251,6 +253,7 @@ public class AndroidCommon { new AndroidIdeInfoProvider.Builder() .setIdlClassJar(idlHelper.getIdlClassJar()) .setIdlSourceJar(idlHelper.getIdlSourceJar()) + .setResourceJar(resourceJar) .addIdlParcelables(idlHelper.getIdlParcelables()) .addIdlSrcs(idlHelper.getIdlSources()) .addIdlGeneratedJavaFiles(idlHelper.getIdlGeneratedJavaSources()) @@ -660,8 +663,10 @@ public class AndroidCommon { JavaRuleOutputJarsProvider.Builder outputJarsBuilder = JavaRuleOutputJarsProvider.builder() .addOutputJar(classJar, iJar, srcJar) .setJdeps(outputDepsProto); + OutputJar resourceJar = null; if (resourceClassJar != null && resourceIJar != null && resourceSourceJar != null) { - outputJarsBuilder.addOutputJar(resourceClassJar, resourceIJar, resourceSourceJar); + resourceJar = new OutputJar(resourceClassJar, resourceIJar, resourceSourceJar); + outputJarsBuilder.addOutputJar(resourceJar); } return builder @@ -678,6 +683,7 @@ public class AndroidCommon { ruleContext, androidSemantics, idlHelper, + resourceJar, resourceApk, zipAlignedApk, apksUnderTest)) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java index d39365a17a..39f8ba9f7a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidIdeInfoProvider.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.actions.Root; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.AttributeMap; +import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider.OutputJar; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; @@ -128,6 +129,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { private Artifact apk = null; private Artifact idlClassJar = null; private Artifact idlSourceJar = null; + private OutputJar resourceJar = null; private String javaPackage = null; private final Set<SourceDirectory> resourceDirs = new LinkedHashSet<>(); private final Set<SourceDirectory> assetDirs = new LinkedHashSet<>(); @@ -145,6 +147,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { apk, idlClassJar, idlSourceJar, + resourceJar, definesAndroidResources, ImmutableList.copyOf(assetDirs), ImmutableList.copyOf(resourceDirs), @@ -194,6 +197,11 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { return this; } + public Builder setResourceJar(OutputJar resourceJar) { + this.resourceJar = resourceJar; + return this; + } + /** * Add "idl_srcs" contents. */ @@ -280,6 +288,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { private final Artifact signedApk; @Nullable private final Artifact idlClassJar; @Nullable private final Artifact idlSourceJar; + @Nullable private final OutputJar resourceJar; private final ImmutableCollection<SourceDirectory> resourceDirs; private final boolean definesAndroidResources; private final ImmutableCollection<SourceDirectory> assetDirs; @@ -295,6 +304,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { @Nullable Artifact signedApk, @Nullable Artifact idlClassJar, @Nullable Artifact idlSourceJar, + @Nullable OutputJar resourceJar, boolean definesAndroidResources, ImmutableCollection<SourceDirectory> assetDirs, ImmutableCollection<SourceDirectory> resourceDirs, @@ -308,6 +318,7 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { this.signedApk = signedApk; this.idlClassJar = idlClassJar; this.idlSourceJar = idlSourceJar; + this.resourceJar = resourceJar; this.definesAndroidResources = definesAndroidResources; this.assetDirs = assetDirs; this.resourceDirs = resourceDirs; @@ -358,6 +369,11 @@ public final class AndroidIdeInfoProvider implements TransitiveInfoProvider { return idlSourceJar; } + @Nullable + public OutputJar getResourceJar() { + return resourceJar; + } + /** A list of the direct Resource directories. */ public ImmutableCollection<SourceDirectory> getResourceDirs() { return resourceDirs; 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 a8b81ddbaf..e64bc92f61 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 @@ -117,6 +117,17 @@ public class AndroidSkylarkApiProvider extends SkylarkApiProvider { return collectDirectArtifacts(ResourceType.RESOURCES); } + @SkylarkCallable( + name = "resource_jar", + structField = true, + allowReturnNones = true, + doc = "Returns a jar file for classes generated from resources." + ) + @Nullable + public JavaRuleOutputJarsProvider.OutputJar getResourceJar() { + return getIdeInfoProvider().getResourceJar(); + } + private NestedSet<Artifact> collectDirectArtifacts(final ResourceType resources) { AndroidResourcesProvider provider = getInfo().getProvider(AndroidResourcesProvider.class); if (provider == null) { diff --git a/src/main/protobuf/android_studio_ide_info.proto b/src/main/protobuf/android_studio_ide_info.proto index 8c48e198d1..ede84b895f 100644 --- a/src/main/protobuf/android_studio_ide_info.proto +++ b/src/main/protobuf/android_studio_ide_info.proto @@ -69,6 +69,7 @@ message AndroidRuleIdeInfo { LibraryArtifact idl_jar = 9; bool generate_resource_class = 10; string legacy_resources = 11; + LibraryArtifact resource_jar = 12; } message CToolchainIdeInfo { 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 f099c9e00d..2584146699 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 @@ -626,6 +626,10 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase assertThat(ruleInfo.getAndroidRuleIdeInfo().getManifest().getRelativePath()) .isEqualTo("com/google/example/AndroidManifest.xml"); assertThat(ruleInfo.getAndroidRuleIdeInfo().getJavaPackage()).isEqualTo("com.google.example"); + assertThat(LIBRARY_ARTIFACT_TO_STRING.apply(ruleInfo.getAndroidRuleIdeInfo().getResourceJar())) + .isEqualTo(jarString("com/google/example", + "l_resources.jar", "l_resources-ijar.jar", "l_resources-src.jar" + )); assertThat(ruleInfo.getDependenciesList()).contains("//com/google/example:l1"); assertThat(getIdeResolveFiles()).containsExactly( 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 c73e7f835b..250776a1bd 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 @@ -284,16 +284,17 @@ def build_android_rule_ide_info(target, ctx): 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), - dependency_apk = [artifact_location(apk) for apk in target.android.apks_under_test], - has_idl_sources = target.android.idl.output != None, - idl_jar = library_artifact(target.android.idl.output), - generate_resource_class = target.android.defines_resources, - resources = all_unique_source_directories(target.android.resources), - ), - ide_resolve_files) + java_package = target.android.java_package, + manifest = artifact_location(target.android.manifest), + apk = artifact_location(target.android.apk), + dependency_apk = [artifact_location(apk) for apk in target.android.apks_under_test], + has_idl_sources = target.android.idl.output != None, + idl_jar = library_artifact(target.android.idl.output), + generate_resource_class = target.android.defines_resources, + resources = all_unique_source_directories(target.android.resources), + resource_jar = library_artifact(target.android.resource_jar), + ), + ide_resolve_files) def build_test_info(target, ctx): """Build TestInfo""" @@ -337,13 +338,14 @@ def collect_labels(rule_attrs, attrs): Assuming that values of attributes from attr_list in rule_atrs are label lists, collect a set of string representation of those labels. """ - return set([str(dep.label) - for attr_name in attrs.label_list - if hasattr(rule_attrs, attr_name) - for dep in getattr(rule_attrs, attr_name)]) | \ - set([str(getattr(rule_attrs, attr_name).label) - for attr_name in attrs.label - if hasattr(rule_attrs, attr_name)]) + list_labels = [str(dep.label) for attr_name in attrs.label_list + if hasattr(rule_attrs, attr_name) + for dep in getattr(rule_attrs, attr_name)] + + scalar_labels = [str(getattr(rule_attrs, attr_name).label) for attr_name in attrs.label + if hasattr(rule_attrs, attr_name)] + + return set(list_labels) | set(scalar_labels) def collect_export_deps(rule_attrs): """Build a union of all export dependencies.""" |