diff options
author | 2015-09-30 23:59:17 +0000 | |
---|---|---|
committer | 2015-10-01 12:16:56 +0000 | |
commit | 78e485ae304d9413bbed01e7157349c6af08ddc3 (patch) | |
tree | 5bb969d6619aa169d42a11b05169f02571115618 /src | |
parent | ded77376e76a2bb0f9603a192c3db45339f8b319 (diff) |
Correctly handle exports in AndroidStudioInfoAspect.
* Propagate aspects via exports property
* Treat exports as direct dependencies
--
MOS_MIGRATED_REVID=104350818
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java | 48 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspectTest.java | 33 |
2 files changed, 50 insertions, 31 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 b6badb5fcb..dfab1955c0 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 @@ -22,6 +22,7 @@ import com.google.common.io.ByteSource; import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Root; +import com.google.devtools.build.lib.analysis.AnalysisUtils; import com.google.devtools.build.lib.analysis.Aspect; import com.google.devtools.build.lib.analysis.Aspect.Builder; import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; @@ -87,6 +88,7 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { public AspectDefinition getDefinition() { return new AspectDefinition.Builder(NAME) .attributeAspect("deps", AndroidStudioInfoAspect.class) + .attributeAspect("exports", AndroidStudioInfoAspect.class) .build(); } @@ -97,33 +99,31 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory { AndroidStudioInfoFilesProvider.Builder providerBuilder = new AndroidStudioInfoFilesProvider.Builder(); - // Collect ide build files and calculate dependencies. NestedSetBuilder<Label> dependenciesBuilder = NestedSetBuilder.stableOrder(); - // todo(dslomov,tomlu): following current build info logic, this code enumerates dependencies - // directly by iterating over deps attribute. The more robust way to do this might be - // to iterate classpath as provided to build action. + ImmutableList.Builder<TransitiveInfoCollection> prerequisitesBuilder = ImmutableList.builder(); if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) { - Iterable<AndroidStudioInfoFilesProvider> androidStudioInfoFilesProviders = - ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidStudioInfoFilesProvider.class); - for (AndroidStudioInfoFilesProvider depProvider : androidStudioInfoFilesProviders) { - providerBuilder.ideBuildFilesBuilder().addTransitive(depProvider.getIdeBuildFiles()); - providerBuilder.transitiveDependenciesBuilder().addTransitive( - depProvider.getTransitiveDependencies()); - providerBuilder.transitiveResourcesBuilder().addTransitive( - depProvider.getTransitiveResources()); - } - List<? extends TransitiveInfoCollection> deps = - ruleContext.getPrerequisites("deps", Mode.TARGET); - for (TransitiveInfoCollection dep : deps) { - dependenciesBuilder.add(dep.getLabel()); - } - - Iterable<JavaExportsProvider> javaExportsProviders = ruleContext - .getPrerequisites("deps", Mode.TARGET, JavaExportsProvider.class); - for (JavaExportsProvider javaExportsProvider : javaExportsProviders) { - dependenciesBuilder.addTransitive(javaExportsProvider.getTransitiveExports()); - } + prerequisitesBuilder.addAll(ruleContext.getPrerequisites("deps", Mode.TARGET)); + } + if (ruleContext.attributes().has("exports", BuildType.LABEL_LIST)) { + prerequisitesBuilder.addAll(ruleContext.getPrerequisites("exports", Mode.TARGET)); + } + List<TransitiveInfoCollection> prerequisites = prerequisitesBuilder.build(); + + for (AndroidStudioInfoFilesProvider depProvider : + AnalysisUtils.getProviders(prerequisites, AndroidStudioInfoFilesProvider.class)) { + providerBuilder.ideBuildFilesBuilder().addTransitive(depProvider.getIdeBuildFiles()); + providerBuilder.transitiveDependenciesBuilder().addTransitive( + depProvider.getTransitiveDependencies()); + providerBuilder.transitiveResourcesBuilder().addTransitive( + depProvider.getTransitiveResources()); + } + for (TransitiveInfoCollection dep : prerequisites) { + dependenciesBuilder.add(dep.getLabel()); + } + for (JavaExportsProvider javaExportsProvider : + AnalysisUtils.getProviders(prerequisites, JavaExportsProvider.class)) { + dependenciesBuilder.addTransitive(javaExportsProvider.getTransitiveExports()); } NestedSet<Label> directDependencies = dependenciesBuilder.build(); 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 8f68eade8f..0e44047020 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 @@ -246,7 +246,6 @@ public class AndroidStudioInfoAspectTest extends BuildViewTestCase { "java_library(", " name = 'complex',", " srcs = ['complex/Complex.java'],", - " deps = [':simple'],", " exports = [':simple'],", ")", "java_library(", @@ -261,13 +260,17 @@ public class AndroidStudioInfoAspectTest extends BuildViewTestCase { getRuleInfoAndVerifyLabel("//com/google/example:simple", ruleIdeInfos); getRuleInfoAndVerifyLabel("//com/google/example:complex", ruleIdeInfos); + RuleIdeInfo complexRuleIdeInfo = getRuleInfoAndVerifyLabel("//com/google/example:complex", + ruleIdeInfos); RuleIdeInfo extraComplexRuleIdeInfo = getRuleInfoAndVerifyLabel(target, ruleIdeInfos); - assertThat(relativePathsForSourcesOf(extraComplexRuleIdeInfo)) - .containsExactly("com/google/example/extracomplex/ExtraComplex.java"); + assertThat(complexRuleIdeInfo.getDependenciesList()) + .containsExactly("//com/google/example:simple"); + assertThat(complexRuleIdeInfo.getTransitiveDependenciesList()) + .containsExactly("//com/google/example:simple"); + assertThat(extraComplexRuleIdeInfo.getDependenciesList()) .containsExactly("//com/google/example:complex", "//com/google/example:simple"); - assertThat(extraComplexRuleIdeInfo.getTransitiveDependenciesList()) .containsExactly( "//com/google/example:complex", @@ -284,13 +287,11 @@ public class AndroidStudioInfoAspectTest extends BuildViewTestCase { "java_library(", " name = 'complex',", " srcs = ['complex/Complex.java'],", - " deps = [':simple'],", " exports = [':simple'],", ")", "java_library(", " name = 'extracomplex',", " srcs = ['extracomplex/ExtraComplex.java'],", - " deps = [':complex'],", " exports = [':complex'],", ")", "java_library(", @@ -374,12 +375,30 @@ public class AndroidStudioInfoAspectTest extends BuildViewTestCase { Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo("//com/google/example:lib"); RuleIdeInfo libInfo = getRuleInfoAndVerifyLabel("//com/google/example:lib", ruleIdeInfos); RuleIdeInfo impInfo = getRuleInfoAndVerifyLabel("//com/google/example:imp", ruleIdeInfos); + assertThat(impInfo.getKind()).isEqualTo(Kind.JAVA_IMPORT); assertThat(impInfo.getDependenciesList()).containsExactly("//com/google/example:foobar"); assertThat(libInfo.getDependenciesList()) .containsExactly("//com/google/example:imp", "//com/google/example:foobar"); } + public void testAspectIsPropagatedAcrossExports() throws Exception { + scratch.file( + "com/google/example/BUILD", + "java_library(", + " name = 'foobar',", + " srcs = ['FooBar.java'],", + ")", + "java_library(", + " name = 'lib',", + " srcs = ['Lib.java'],", + " exports = [':foobar'],", + ")"); + + Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo("//com/google/example:lib"); + getRuleInfoAndVerifyLabel("//com/google/example:foobar", ruleIdeInfos); + } + public void testJavaTest() throws Exception { scratch.file( "java/com/google/example/BUILD", @@ -495,7 +514,7 @@ public class AndroidStudioInfoAspectTest extends BuildViewTestCase { assertThat(relativePathsForSourcesOf(ruleInfo)).containsExactly("com/google/example/Main.java"); assertThat(transform(ruleInfo.getJavaRuleIdeInfo().getJarsList(), LIBRARY_ARTIFACT_TO_STRING)) .containsExactly(jarString("com/google/example", - "libb.jar", "libb-ijar.jar", "libb-src.jar")); + "libb.jar", "libb-ijar.jar", "libb-src.jar")); assertThat( transform( ruleInfo.getAndroidRuleIdeInfo().getResourcesList(), ARTIFACT_TO_RELATIVE_PATH)) |