diff options
3 files changed, 64 insertions, 9 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 cdb90eb9d5..e7d27990eb 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 @@ -154,7 +154,7 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { RuleIdeInfo.Kind ruleKind = getRuleKind(ruleContext.getRule(), base); - NestedSet<Label> directDependencies = processDependencies( + DependenciesResult dependenciesResult = processDependencies( base, ruleContext, providerBuilder, ruleKind); AndroidStudioInfoFilesProvider provider; @@ -164,7 +164,8 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { base, ruleContext, ruleKind, - directDependencies, + dependenciesResult.deps, + dependenciesResult.runtimeDeps, providerBuilder); } else { provider = providerBuilder.build(); @@ -181,7 +182,17 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { return builder.build(); } - private NestedSet<Label> processDependencies( + private static class DependenciesResult { + private DependenciesResult(Iterable<Label> deps, + Iterable<Label> runtimeDeps) { + this.deps = deps; + this.runtimeDeps = runtimeDeps; + } + final Iterable<Label> deps; + final Iterable<Label> runtimeDeps; + } + + private DependenciesResult processDependencies( ConfiguredTarget base, RuleContext ruleContext, AndroidStudioInfoFilesProvider.Builder providerBuilder, RuleIdeInfo.Kind ruleKind) { @@ -223,12 +234,21 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { } } + // runtime_deps + List<? extends TransitiveInfoCollection> runtimeDeps = ImmutableList.of(); + NestedSetBuilder<Label> runtimeDepsBuilder = NestedSetBuilder.stableOrder(); + if (ruleContext.attributes().has("runtime_deps", BuildType.LABEL_LIST)) { + runtimeDeps = ruleContext.getPrerequisites("runtime_deps", Mode.TARGET); + for (TransitiveInfoCollection dep : runtimeDeps) { + runtimeDepsBuilder.add(dep.getLabel()); + } + } + // Propagate providers from all prerequisites (deps + runtime_deps) ImmutableList.Builder<TransitiveInfoCollection> prerequisitesBuilder = ImmutableList.builder(); prerequisitesBuilder.addAll(directDeps); - if (ruleContext.attributes().has("runtime_deps", BuildType.LABEL_LIST)) { - prerequisitesBuilder.addAll(ruleContext.getPrerequisites("runtime_deps", Mode.TARGET)); - } + prerequisitesBuilder.addAll(runtimeDeps); + List<TransitiveInfoCollection> prerequisites = prerequisitesBuilder.build(); for (AndroidStudioInfoFilesProvider depProvider : @@ -238,7 +258,7 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { providerBuilder.ideResolveFilesBuilder().addTransitive(depProvider.getIdeResolveFiles()); } - return dependencies; + return new DependenciesResult(dependencies, runtimeDepsBuilder.build()); } private static AndroidSdkRuleInfo makeAndroidSdkRuleInfo(AndroidSdkProvider provider) { @@ -254,7 +274,8 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { ConfiguredTarget base, RuleContext ruleContext, Kind ruleKind, - NestedSet<Label> directDependencies, + Iterable<Label> directDependencies, + Iterable<Label> runtimeDeps, AndroidStudioInfoFilesProvider.Builder providerBuilder) { Artifact ideInfoFile = derivedArtifact(base, ruleContext, ASWB_BUILD_SUFFIX); @@ -308,7 +329,7 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { AndroidStudioInfoFilesProvider provider = providerBuilder.build(); outputBuilder.addAllDependencies(transform(directDependencies, LABEL_TO_STRING)); - + outputBuilder.addAllRuntimeDeps(transform(runtimeDeps, LABEL_TO_STRING)); outputBuilder.addAllTags(base.getTarget().getAssociatedRule().getRuleTags()); final RuleIdeInfo ruleIdeInfo = outputBuilder.build(); diff --git a/src/main/protobuf/android_studio_ide_info.proto b/src/main/protobuf/android_studio_ide_info.proto index 7c729f3f12..c0b8a39bb0 100644 --- a/src/main/protobuf/android_studio_ide_info.proto +++ b/src/main/protobuf/android_studio_ide_info.proto @@ -82,4 +82,5 @@ message RuleIdeInfo { AndroidRuleIdeInfo android_rule_ide_info = 8; repeated string tags = 9; + repeated string runtime_deps = 10; } 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 065ecb82a3..90446d9cd0 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 @@ -855,6 +855,39 @@ public class AndroidStudioInfoAspectTest extends AndroidStudioInfoAspectTestBase } @Test + public void testRuntimeDepsAddedToProto() throws Exception { + scratch.file( + "com/google/example/BUILD", + "java_library(", + " name = 'foobar',", + " srcs = ['FooBar.java'],", + ")", + "java_library(", + " name = 'foobar2',", + " srcs = ['FooBar2.java'],", + ")", + "java_library(", + " name = 'lib',", + " srcs = ['Lib.java'],", + " deps = [':lib2'],", + " runtime_deps = [':foobar'],", + ")", + "java_library(", + " name = 'lib2',", + " srcs = ['Lib2.java'],", + " runtime_deps = [':foobar2'],", + ")"); + + Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo("//com/google/example:lib"); + // Fails if aspect was not propagated + RuleIdeInfo lib = getRuleInfoAndVerifyLabel("//com/google/example:lib", ruleIdeInfos); + RuleIdeInfo lib2 = getRuleInfoAndVerifyLabel("//com/google/example:lib2", ruleIdeInfos); + + assertThat(lib.getRuntimeDepsList()).containsExactly("//com/google/example:foobar"); + assertThat(lib2.getRuntimeDepsList()).containsExactly("//com/google/example:foobar2"); + } + + @Test public void testAndroidLibraryGeneratesResourceClass() throws Exception { scratch.file( "java/com/google/example/BUILD", |