Add full support for android_resources to AndroidStudioInfoAspect.
For backwards compatibility reasons, resources show up in both the
originating rule as well as the containing rule. Implementations can
check the :resources attribute to see if they should ignore their
resources.
--
MOS_MIGRATED_REVID=116698804
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 5c62c14..feef789 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
@@ -135,6 +135,7 @@
public AspectDefinition getDefinition(AspectParameters aspectParameters) {
AspectDefinition.Builder builder = new AspectDefinition.Builder(NAME)
.attributeAspect("runtime_deps", AndroidStudioInfoAspect.class)
+ .attributeAspect("resources", AndroidStudioInfoAspect.class)
.add(attr("$packageParser", LABEL).cfg(HOST).exec()
.value(Label.parseAbsoluteUnchecked(
Constants.TOOLS_REPOSITORY + "//tools/android:PackageParser")));
@@ -166,8 +167,7 @@
base,
ruleContext,
ruleKind,
- dependenciesResult.deps,
- dependenciesResult.runtimeDeps,
+ dependenciesResult,
providerBuilder);
} else {
provider = providerBuilder.build();
@@ -186,12 +186,14 @@
private static class DependenciesResult {
private DependenciesResult(Iterable<Label> deps,
- Iterable<Label> runtimeDeps) {
+ Iterable<Label> runtimeDeps, @Nullable Label resources) {
this.deps = deps;
this.runtimeDeps = runtimeDeps;
+ this.resources = resources;
}
final Iterable<Label> deps;
final Iterable<Label> runtimeDeps;
+ @Nullable final Label resources;
}
private DependenciesResult processDependencies(
@@ -246,10 +248,19 @@
}
}
+ // resources
+ @Nullable TransitiveInfoCollection resources =
+ ruleContext.attributes().has("resources", BuildType.LABEL)
+ ? ruleContext.getPrerequisite("resources", Mode.TARGET)
+ : null;
+
// Propagate providers from all prerequisites (deps + runtime_deps)
ImmutableList.Builder<TransitiveInfoCollection> prerequisitesBuilder = ImmutableList.builder();
prerequisitesBuilder.addAll(directDeps);
prerequisitesBuilder.addAll(runtimeDeps);
+ if (resources != null) {
+ prerequisitesBuilder.add(resources);
+ }
List<TransitiveInfoCollection> prerequisites = prerequisitesBuilder.build();
@@ -260,15 +271,18 @@
providerBuilder.ideResolveFilesBuilder().addTransitive(depProvider.getIdeResolveFiles());
}
- return new DependenciesResult(dependencies, runtimeDepsBuilder.build());
+
+ return new DependenciesResult(
+ dependencies,
+ runtimeDepsBuilder.build(),
+ resources != null ? resources.getLabel() : null);
}
private AndroidStudioInfoFilesProvider createIdeBuildArtifact(
ConfiguredTarget base,
RuleContext ruleContext,
Kind ruleKind,
- Iterable<Label> directDependencies,
- Iterable<Label> runtimeDeps,
+ DependenciesResult dependenciesResult,
AndroidStudioInfoFilesProvider.Builder providerBuilder) {
Artifact ideInfoFile = derivedArtifact(base, ruleContext, ASWB_BUILD_SUFFIX);
@@ -314,14 +328,16 @@
}
if (ruleKind == Kind.ANDROID_LIBRARY
|| ruleKind == Kind.ANDROID_BINARY
- || ruleKind == Kind.ANDROID_TEST) {
- outputBuilder.setAndroidRuleIdeInfo(makeAndroidRuleIdeInfo(base, ideResolveArtifacts));
+ || ruleKind == Kind.ANDROID_TEST
+ || ruleKind == Kind.ANDROID_RESOURCES) {
+ outputBuilder.setAndroidRuleIdeInfo(makeAndroidRuleIdeInfo(base,
+ dependenciesResult, ideResolveArtifacts));
}
AndroidStudioInfoFilesProvider provider = providerBuilder.build();
- outputBuilder.addAllDependencies(transform(directDependencies, LABEL_TO_STRING));
- outputBuilder.addAllRuntimeDeps(transform(runtimeDeps, LABEL_TO_STRING));
+ outputBuilder.addAllDependencies(transform(dependenciesResult.deps, LABEL_TO_STRING));
+ outputBuilder.addAllRuntimeDeps(transform(dependenciesResult.runtimeDeps, LABEL_TO_STRING));
outputBuilder.addAllTags(base.getTarget().getAssociatedRule().getRuleTags());
final RuleIdeInfo ruleIdeInfo = outputBuilder.build();
@@ -403,6 +419,7 @@
private static AndroidRuleIdeInfo makeAndroidRuleIdeInfo(
ConfiguredTarget base,
+ DependenciesResult dependenciesResult,
NestedSetBuilder<Artifact> ideResolveArtifacts) {
AndroidRuleIdeInfo.Builder builder = AndroidRuleIdeInfo.newBuilder();
AndroidIdeInfoProvider provider = base.getProvider(AndroidIdeInfoProvider.class);
@@ -441,6 +458,10 @@
builder.setGenerateResourceClass(provider.definesAndroidResources());
+ if (dependenciesResult.resources != null) {
+ builder.setLegacyResources(dependenciesResult.resources.toString());
+ }
+
return builder.build();
}
@@ -643,6 +664,8 @@
return Kind.PROTO_LIBRARY;
case "java_plugin":
return Kind.JAVA_PLUGIN;
+ case "android_resources":
+ return Kind.ANDROID_RESOURCES;
default:
{
if (base.getProvider(AndroidSdkProvider.class) != null) {
diff --git a/src/main/protobuf/android_studio_ide_info.proto b/src/main/protobuf/android_studio_ide_info.proto
index 9437a35..ce2fe77 100644
--- a/src/main/protobuf/android_studio_ide_info.proto
+++ b/src/main/protobuf/android_studio_ide_info.proto
@@ -55,6 +55,7 @@
bool has_idl_sources = 8;
LibraryArtifact idl_jar = 9;
bool generate_resource_class = 10;
+ string legacy_resources = 11;
}
message RuleIdeInfo {
@@ -70,6 +71,7 @@
PROTO_LIBRARY = 8;
ANDROID_SDK = 9;
JAVA_PLUGIN = 10;
+ ANDROID_RESOURCES = 11;
}
string label = 1;