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(