Support java_import in AndroidStudioIdeInfoAspect
--
MOS_MIGRATED_REVID=103079877
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 fa26e5c..80fb82c 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
@@ -189,7 +189,7 @@
outputBuilder.addAllDependencies(transform(directDependencies, LABEL_TO_STRING));
outputBuilder.addAllTransitiveDependencies(transform(transitiveDependencies, LABEL_TO_STRING));
- if (ruleKind == Kind.JAVA_LIBRARY) {
+ if (ruleKind == Kind.JAVA_LIBRARY || ruleKind == Kind.JAVA_IMPORT) {
outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base));
} else if (ruleKind == Kind.ANDROID_SDK) {
outputBuilder.setAndroidSdkRuleInfo(
@@ -230,37 +230,16 @@
JavaRuleOutputJarsProvider outputJarsProvider =
base.getProvider(JavaRuleOutputJarsProvider.class);
if (outputJarsProvider != null) {
- {
- LibraryArtifact.Builder jarsBuilder = LibraryArtifact.newBuilder();
- Artifact classJar = outputJarsProvider.getClassJar();
- if (classJar != null) {
- jarsBuilder.setJar(makeArtifactLocation(classJar));
- }
- Artifact srcJar = outputJarsProvider.getSrcJar();
- if (srcJar != null) {
- jarsBuilder.setSourceJar(makeArtifactLocation(srcJar));
- }
- if (jarsBuilder.hasJar() || jarsBuilder.hasSourceJar()) {
- builder.addJars(jarsBuilder.build());
- }
- }
-
- {
- LibraryArtifact.Builder genjarsBuilder = LibraryArtifact.newBuilder();
-
- Artifact genClassJar = outputJarsProvider.getGenClassJar();
- if (genClassJar != null) {
- genjarsBuilder.setJar(makeArtifactLocation(genClassJar));
- }
- Artifact gensrcJar = outputJarsProvider.getGensrcJar();
- if (gensrcJar != null) {
- genjarsBuilder.setSourceJar(makeArtifactLocation(gensrcJar));
- }
- if (genjarsBuilder.hasJar() || genjarsBuilder.hasSourceJar()) {
- builder.addJars(genjarsBuilder.build());
- }
+ // java_library
+ collectJarsFromOutputJarsProvider(builder, outputJarsProvider);
+ } else {
+ JavaSourceInfoProvider provider = base.getProvider(JavaSourceInfoProvider.class);
+ if (provider != null) {
+ // java_import
+ collectJarsFromSourceInfoProvider(builder, provider);
}
}
+
Collection<Artifact> sourceFiles = getSources(base);
for (Artifact sourceFile : sourceFiles) {
@@ -270,6 +249,63 @@
return builder.build();
}
+ private static void collectJarsFromSourceInfoProvider(
+ JavaRuleIdeInfo.Builder builder, JavaSourceInfoProvider provider) {
+ Collection<Artifact> sourceJarsForJarFiles = provider.getSourceJarsForJarFiles();
+ // For java_import rule, we always have only one source jar specified.
+ // The intent is that that source jar provides sources for all imported jars,
+ // so we reflect that intent, adding that jar to all LibraryArtifacts we produce
+ // for java_import rule. We should consider supporting
+ // library=<collection of jars>+<collection of srcjars>
+ // mode in our AndroidStudio plugin (Android Studio itself supports that).
+ Artifact sourceJar;
+ if (sourceJarsForJarFiles.size() > 0) {
+ sourceJar = sourceJarsForJarFiles.iterator().next();
+ } else {
+ sourceJar = null;
+ }
+
+ for (Artifact artifact : provider.getJarFiles()) {
+ LibraryArtifact.Builder libraryBuilder = LibraryArtifact.newBuilder();
+ libraryBuilder.setJar(makeArtifactLocation(artifact));
+ if (sourceJar != null) {
+ libraryBuilder.setSourceJar(makeArtifactLocation(sourceJar));
+ }
+ builder.addJars(libraryBuilder.build());
+ }
+ }
+
+ private static void collectJarsFromOutputJarsProvider(
+ JavaRuleIdeInfo.Builder builder, JavaRuleOutputJarsProvider outputJarsProvider) {
+ LibraryArtifact.Builder jarsBuilder = LibraryArtifact.newBuilder();
+ Artifact classJar = outputJarsProvider.getClassJar();
+ if (classJar != null) {
+ jarsBuilder.setJar(makeArtifactLocation(classJar));
+ }
+ Artifact srcJar = outputJarsProvider.getSrcJar();
+ if (srcJar != null) {
+ jarsBuilder.setSourceJar(makeArtifactLocation(srcJar));
+ }
+ if (jarsBuilder.hasJar() || jarsBuilder.hasSourceJar()) {
+ builder.addJars(jarsBuilder.build());
+ }
+
+
+ LibraryArtifact.Builder genjarsBuilder = LibraryArtifact.newBuilder();
+
+ Artifact genClassJar = outputJarsProvider.getGenClassJar();
+ if (genClassJar != null) {
+ genjarsBuilder.setJar(makeArtifactLocation(genClassJar));
+ }
+ Artifact gensrcJar = outputJarsProvider.getGensrcJar();
+ if (gensrcJar != null) {
+ genjarsBuilder.setSourceJar(makeArtifactLocation(gensrcJar));
+ }
+ if (genjarsBuilder.hasJar() || genjarsBuilder.hasSourceJar()) {
+ builder.addGeneratedJars(genjarsBuilder.build());
+ }
+ }
+
private static Collection<Artifact> getSources(ConfiguredTarget base) {
// Calculate source files.
JavaSourceInfoProvider sourceInfoProvider = base.getProvider(JavaSourceInfoProvider.class);
@@ -289,6 +325,8 @@
RuleIdeInfo.Kind kind;
if ("java_library".equals(rule.getRuleClassObject().getName())) {
kind = RuleIdeInfo.Kind.JAVA_LIBRARY;
+ } else if ("java_import".equals(rule.getRuleClassObject().getName())) {
+ kind = Kind.JAVA_IMPORT;
} else if (base.getProvider(AndroidSdkProvider.class) != null) {
kind = RuleIdeInfo.Kind.ANDROID_SDK;
} else {
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 3268bf7..7d7ee50 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
@@ -25,8 +25,12 @@
import com.google.devtools.build.lib.analysis.actions.BinaryFileWriteAction;
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.ArtifactLocation;
+import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.JavaRuleIdeInfo;
+import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.LibraryArtifact;
import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.RuleIdeInfo;
+import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.RuleIdeInfo.Kind;
import com.google.devtools.build.lib.skyframe.AspectValue;
+import com.google.devtools.build.lib.vfs.Path;
import java.util.Collection;
import java.util.Map;
@@ -46,26 +50,57 @@
return artifactLocation.getRelativePath();
}
};
+ public static final Function<LibraryArtifact, String> LIBRARY_ARTIFACT_TO_STRING =
+ new Function<LibraryArtifact, String>() {
+ @Override
+ public String apply(LibraryArtifact libraryArtifact) {
+ StringBuilder stringBuilder = new StringBuilder();
+ if (libraryArtifact.hasJar()) {
+ stringBuilder.append("<jar:");
+ stringBuilder.append(libraryArtifact.getJar().getRelativePath());
+ stringBuilder.append(">");
+ }
+ if (libraryArtifact.hasInterfaceJar()) {
+ stringBuilder.append("<ijar:");
+ stringBuilder.append(libraryArtifact.getInterfaceJar().getRelativePath());
+ stringBuilder.append(">");
+ }
+ if (libraryArtifact.hasSourceJar()) {
+ stringBuilder.append("<source:");
+ stringBuilder.append(libraryArtifact.getSourceJar().getRelativePath());
+ stringBuilder.append(">");
+ }
+
+ return stringBuilder.toString();
+ }
+ };
public void testSimpleJavaLibrary() throws Exception {
- scratch.file(
- "com/google/example/BUILD",
- "java_library(",
- " name = \"simple\",",
- " srcs = [\"simple/Simple.java\"]",
- ")",
- "java_library(",
- " name = \"complex\",",
- " srcs = [\"complex/Complex.java\"],",
- " deps = [\":simple\"]",
- ")");
+ Path buildFilePath =
+ scratch.file(
+ "com/google/example/BUILD",
+ "java_library(",
+ " name = \"simple\",",
+ " srcs = [\"simple/Simple.java\"]",
+ ")",
+ "java_library(",
+ " name = \"complex\",",
+ " srcs = [\"complex/Complex.java\"],",
+ " deps = [\":simple\"]",
+ ")");
String target = "//com/google/example:simple";
Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo(target);
assertThat(ruleIdeInfos.size()).isEqualTo(1);
RuleIdeInfo ruleIdeInfo = getRuleInfoAndVerifyLabel(target, ruleIdeInfos);
+ assertThat(ruleIdeInfo.getBuildFile()).isEqualTo(buildFilePath.toString());
+ assertThat(ruleIdeInfo.getKind()).isEqualTo(Kind.JAVA_LIBRARY);
assertThat(ruleIdeInfo.getDependenciesCount()).isEqualTo(0);
assertThat(relativePathsForSourcesOf(ruleIdeInfo))
.containsExactly("com/google/example/simple/Simple.java");
+ assertThat(
+ transform(ruleIdeInfo.getJavaRuleIdeInfo().getJarsList(), LIBRARY_ARTIFACT_TO_STRING))
+ .containsExactly(
+ "<jar:com/google/example/libsimple.jar><source:com/google/example/libsimple-src.jar>");
}
private static Iterable<String> relativePathsForSourcesOf(RuleIdeInfo ruleIdeInfo) {
@@ -275,6 +310,34 @@
"//com/google/example:simple");
}
+ public void testJavaImport() throws Exception {
+ scratch.file(
+ "com/google/example/BUILD",
+ "java_import(",
+ " name = \"imp\",",
+ " jars = [\"a.jar\", \"b.jar\"],",
+ " srcjar = \"impsrc.jar\",",
+ ")",
+ "java_library(",
+ " name = \"lib\",",
+ " srcs = [\"Lib.java\"],",
+ " deps = [\":imp\"],",
+ ")");
+
+ Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo("//com/google/example:lib");
+ final RuleIdeInfo libInfo = getRuleInfoAndVerifyLabel("//com/google/example:lib", ruleIdeInfos);
+ RuleIdeInfo impInfo = getRuleInfoAndVerifyLabel("//com/google/example:imp", ruleIdeInfos);
+ assertThat(impInfo.getKind()).isEqualTo(Kind.JAVA_IMPORT);
+ assertThat(libInfo.getDependenciesList()).containsExactly("//com/google/example:imp");
+
+ JavaRuleIdeInfo javaRuleIdeInfo = impInfo.getJavaRuleIdeInfo();
+ assertThat(javaRuleIdeInfo).isNotNull();
+ assertThat(transform(javaRuleIdeInfo.getJarsList(), LIBRARY_ARTIFACT_TO_STRING))
+ .containsExactly(
+ "<jar:com/google/example/a.jar><source:com/google/example/impsrc.jar>",
+ "<jar:com/google/example/b.jar><source:com/google/example/impsrc.jar>");
+ }
+
private Map<String, RuleIdeInfo> buildRuleIdeInfo(String target) throws Exception {
AnalysisResult analysisResult =
update(