Support java_test and java_binary in AndroidStudioInfoAspect.

--
MOS_MIGRATED_REVID=103089400
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 80fb82c..c2fe68c 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,10 @@
     outputBuilder.addAllDependencies(transform(directDependencies, LABEL_TO_STRING));
     outputBuilder.addAllTransitiveDependencies(transform(transitiveDependencies, LABEL_TO_STRING));
 
-    if (ruleKind == Kind.JAVA_LIBRARY || ruleKind == Kind.JAVA_IMPORT) {
+    if (ruleKind == Kind.JAVA_LIBRARY
+        || ruleKind == Kind.JAVA_IMPORT
+        || ruleKind == Kind.JAVA_TEST
+        || ruleKind == Kind.JAVA_BINARY) {
       outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base));
     } else if (ruleKind == Kind.ANDROID_SDK) {
       outputBuilder.setAndroidSdkRuleInfo(
@@ -323,10 +326,15 @@
 
   private RuleIdeInfo.Kind getRuleKind(Rule rule, ConfiguredTarget base) {
     RuleIdeInfo.Kind kind;
-    if ("java_library".equals(rule.getRuleClassObject().getName())) {
+    String ruleClassName = rule.getRuleClassObject().getName();
+    if ("java_library".equals(ruleClassName)) {
       kind = RuleIdeInfo.Kind.JAVA_LIBRARY;
-    } else if ("java_import".equals(rule.getRuleClassObject().getName())) {
+    } else if ("java_import".equals(ruleClassName)) {
       kind = Kind.JAVA_IMPORT;
+    } else if ("java_test".equals(ruleClassName)) {
+      kind = Kind.JAVA_TEST;
+    } else if ("java_binary".equals(ruleClassName)) {
+      kind = Kind.JAVA_BINARY;
     } else if (base.getProvider(AndroidSdkProvider.class) != null) {
       kind = RuleIdeInfo.Kind.ANDROID_SDK;
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
index 48423fc..f6d7b51 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java
@@ -210,6 +210,10 @@
     semantics.addProviders(ruleContext, common, jvmFlags, classJar, srcJar, genClassJar, gensrcJar,
         ImmutableMap.<Artifact, Artifact>of(), helper, filesBuilder, builder);
 
+    builder.add(
+        JavaRuleOutputJarsProvider.class,
+        new JavaRuleOutputJarsProvider(classJar, srcJar, genClassJar, gensrcJar));
+
     NestedSet<Artifact> filesToBuild = filesBuilder.build();
 
     collectDefaultRunfiles(runfilesBuilder, ruleContext, common, filesToBuild, launcher,
@@ -276,10 +280,14 @@
         .setFilesToBuild(filesToBuild)
         .add(RunfilesProvider.class, runfilesProvider)
         .setRunfilesSupport(runfilesSupport, executable)
-        .add(JavaRuntimeClasspathProvider.class,
+        .add(
+            JavaRuntimeClasspathProvider.class,
             new JavaRuntimeClasspathProvider(common.getRuntimeClasspath()))
-        .add(JavaSourceJarsProvider.class,
-            new JavaSourceJarsProvider(transitiveSourceJars, srcJars))
+        .add(
+            JavaSourceInfoProvider.class,
+            JavaSourceInfoProvider.fromJavaTargetAttributes(attributes, semantics))
+        .add(
+            JavaSourceJarsProvider.class, new JavaSourceJarsProvider(transitiveSourceJars, srcJars))
         .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars)
         .addOutputGroup(JavaSemantics.GENERATED_JARS_OUTPUT_GROUP, genClassJar)
         .build();
diff --git a/src/main/protobuf/android_studio_ide_info.proto b/src/main/protobuf/android_studio_ide_info.proto
index b7dcda2..e81db55 100644
--- a/src/main/protobuf/android_studio_ide_info.proto
+++ b/src/main/protobuf/android_studio_ide_info.proto
@@ -52,8 +52,9 @@
     JAVA_LIBRARY = 4;
     JAVA_TEST = 5;
     JAVA_IMPORT = 6;
-    PROTO_LIBRARY = 7;
-    ANDROID_SDK = 8;
+    JAVA_BINARY = 7;
+    PROTO_LIBRARY = 8;
+    ANDROID_SDK = 9;
   }
 
   string label = 1;
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 7d7ee50..0071a6b 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
@@ -338,6 +338,84 @@
             "<jar:com/google/example/b.jar><source:com/google/example/impsrc.jar>");
   }
 
+  public void testJavaImportWithExports() throws Exception {
+    scratch.file(
+        "com/google/example/BUILD",
+        "java_library(",
+        "   name = \"foobar\",",
+        "   srcs = [\"FooBar.java\"],",
+        ")",
+        "java_import(",
+        "   name = \"imp\",",
+        "   jars = [\"a.jar\", \"b.jar\"],",
+        "   deps = [\":foobar\"],",
+        "   exports = [\":foobar\"],",
+        ")",
+        "java_library(",
+        "   name = \"lib\",",
+        "   srcs = [\"Lib.java\"],",
+        "   deps = [\":imp\"],",
+        ")");
+
+    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 testJavaTest() throws Exception {
+    scratch.file(
+        "com/google/example/BUILD",
+        "java_library(",
+        "   name = \"foobar\",",
+        "   srcs = [\"FooBar.java\"],",
+        ")",
+        "java_test(",
+        "   name = \"foobar-test\",",
+        "   test_class = \"MyTestClass\",",
+        "   srcs = [\"FooBarTest.java\"],",
+        "   deps = [\":foobar\"],",
+        ")");
+    String target = "//com/google/example:foobar-test";
+    Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo(target);
+    RuleIdeInfo testInfo = getRuleInfoAndVerifyLabel(target, ruleIdeInfos);
+    assertThat(testInfo.getKind()).isEqualTo(Kind.JAVA_TEST);
+    assertThat(relativePathsForSourcesOf(testInfo))
+        .containsExactly("com/google/example/FooBarTest.java");
+    assertThat(testInfo.getDependenciesList()).containsExactly("//com/google/example:foobar");
+    assertThat(transform(testInfo.getJavaRuleIdeInfo().getJarsList(), LIBRARY_ARTIFACT_TO_STRING))
+        .containsExactly(
+            "<jar:com/google/example/foobar-test.jar><source:com/google/example/foobar-test-src.jar>");
+  }
+
+  public void testJavaBinary() throws Exception {
+    scratch.file(
+        "com/google/example/BUILD",
+        "java_library(",
+        "   name = \"foobar\",",
+        "   srcs = [\"FooBar.java\"],",
+        ")",
+        "java_binary(",
+        "   name = \"foobar-exe\",",
+        "   main_class = \"MyMainClass\",",
+        "   srcs = [\"FooBarMain.java\"],",
+        "   deps = [\":foobar\"],",
+        ")");
+    String target = "//com/google/example:foobar-exe";
+    Map<String, RuleIdeInfo> ruleIdeInfos = buildRuleIdeInfo(target);
+    RuleIdeInfo binaryInfo = getRuleInfoAndVerifyLabel(target, ruleIdeInfos);
+    assertThat(binaryInfo.getKind()).isEqualTo(Kind.JAVA_BINARY);
+    assertThat(relativePathsForSourcesOf(binaryInfo))
+        .containsExactly("com/google/example/FooBarMain.java");
+    assertThat(binaryInfo.getDependenciesList()).containsExactly("//com/google/example:foobar");
+    assertThat(transform(binaryInfo.getJavaRuleIdeInfo().getJarsList(), LIBRARY_ARTIFACT_TO_STRING))
+        .containsExactly(
+            "<jar:com/google/example/foobar-exe.jar><source:com/google/example/foobar-exe-src.jar>");
+  }
+
   private Map<String, RuleIdeInfo> buildRuleIdeInfo(String target) throws Exception {
     AnalysisResult analysisResult =
         update(