Provide information about Android SDK to Android Studio.

--
MOS_MIGRATED_REVID=102648848
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 8defc66..202d1da 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
@@ -16,9 +16,11 @@
 
 import com.google.common.collect.ImmutableList;
 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.Aspect;
+import com.google.devtools.build.lib.analysis.Aspect.Builder;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
@@ -26,6 +28,7 @@
 import com.google.devtools.build.lib.analysis.actions.BinaryFileWriteAction;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.AndroidSdkRuleInfo;
 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;
@@ -33,9 +36,13 @@
 import com.google.devtools.build.lib.packages.AspectDefinition;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.Type;
+import com.google.devtools.build.lib.rules.android.AndroidSdkProvider;
 import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
 import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
+import com.google.devtools.build.lib.vfs.Path;
 import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.protobuf.MessageLite;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -46,9 +53,13 @@
  */
 public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
   public static final String NAME = "AndroidStudioInfoAspect";
+
+  // Output groups.
   public static final String IDE_RESOLVE = "ide-resolve";
   public static final String IDE_BUILD = "ide-build";
-  public static final String IDE_BUILD_SUFFIX = ".aswb-build";
+
+  // File suffixes.
+  public static final String ASWB_BUILD_SUFFIX = ".aswb-build";
 
   @Override
   public AspectDefinition getDefinition() {
@@ -61,25 +72,48 @@
   @Override
   public Aspect create(ConfiguredTarget base, RuleContext ruleContext,
       AspectParameters parameters) {
+    Aspect.Builder builder = new Builder(NAME);
+
+    // Collect ide build files.
     NestedSetBuilder<Artifact> ideBuildFilesBuilder = NestedSetBuilder.stableOrder();
-    Iterable<AndroidStudioInfoFilesProvider> deps =
-        ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidStudioInfoFilesProvider.class);
-    for (AndroidStudioInfoFilesProvider dep : deps) {
-      ideBuildFilesBuilder.addTransitive(dep.getIdeBuildFiles());
+    if (ruleContext.attributes().has("deps", Type.LABEL_LIST)) {
+      Iterable<AndroidStudioInfoFilesProvider> deps =
+          ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidStudioInfoFilesProvider.class);
+      for (AndroidStudioInfoFilesProvider dep : deps) {
+        ideBuildFilesBuilder.addTransitive(dep.getIdeBuildFiles());
+      }
     }
 
-    RuleIdeInfo.Kind ruleKind = getRuleKind(ruleContext.getRule());
+    RuleIdeInfo.Kind ruleKind = getRuleKind(ruleContext.getRule(), base);
     if (ruleKind != RuleIdeInfo.Kind.UNRECOGNIZED) {
       Artifact ideBuildFile = createIdeBuildArtifact(base, ruleContext, ruleKind);
       ideBuildFilesBuilder.add(ideBuildFile);
     }
 
     NestedSet<Artifact> ideBuildFiles = ideBuildFilesBuilder.build();
-    return new Aspect.Builder(NAME)
+    builder
         .addOutputGroup(IDE_BUILD, ideBuildFiles)
         .addProvider(
-            AndroidStudioInfoFilesProvider.class, new AndroidStudioInfoFilesProvider(ideBuildFiles))
-        .build();
+            AndroidStudioInfoFilesProvider.class,
+            new AndroidStudioInfoFilesProvider(ideBuildFiles));
+
+    return builder.build();
+  }
+
+  private static AndroidSdkRuleInfo makeAndroidSdkRuleInfo(RuleContext ruleContext,
+      AndroidSdkProvider provider) {
+    AndroidSdkRuleInfo.Builder sdkInfoBuilder = AndroidSdkRuleInfo.newBuilder();
+
+    Path androidSdkDirectory = provider.getAndroidJar().getPath().getParentDirectory();
+    sdkInfoBuilder.setAndroidSdkPath(androidSdkDirectory.toString());
+
+    Root genfilesDirectory = ruleContext.getConfiguration().getGenfilesDirectory();
+    sdkInfoBuilder.setGenfilesPath(genfilesDirectory.getPath().toString());
+
+    Path binfilesPath = ruleContext.getConfiguration().getBinDirectory().getPath();
+    sdkInfoBuilder.setBinPath(binfilesPath.toString());
+
+    return sdkInfoBuilder.build();
   }
 
   private Artifact createIdeBuildArtifact(
@@ -105,33 +139,33 @@
 
     outputBuilder.setKind(ruleKind);
 
-    // Calculate source files.
-    JavaSourceInfoProvider sourceInfoProvider = base.getProvider(JavaSourceInfoProvider.class);
-    Collection<Artifact> sourceFiles =
-        sourceInfoProvider != null
-            ? sourceInfoProvider.getSourceFiles()
-            : ImmutableList.<Artifact>of();
-    for (Artifact sourceFile : sourceFiles) {
-      outputBuilder.addSources(makeArtifactLocation(sourceFile));
+    if (ruleKind == RuleIdeInfo.Kind.JAVA_LIBRARY) {
+      outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base));
+    } else if (ruleKind == RuleIdeInfo.Kind.ANDROID_SDK) {
+      outputBuilder.setAndroidSdkRuleInfo(
+          makeAndroidSdkRuleInfo(ruleContext, base.getProvider(AndroidSdkProvider.class)));
     }
 
-    outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base));
-
     final RuleIdeInfo ruleIdeInfo = outputBuilder.build();
     ruleContext.registerAction(
-        new BinaryFileWriteAction(
-            ruleContext.getActionOwner(),
-            ideBuildFile,
-            new ByteSource() {
-              @Override
-              public InputStream openStream() throws IOException {
-                return ruleIdeInfo.toByteString().newInput();
-              }
-            },
-            /*makeExecutable =*/ false));
+        makeProtoWriteAction(ruleContext.getActionOwner(), ruleIdeInfo, ideBuildFile));
     return ideBuildFile;
   }
 
+  private static BinaryFileWriteAction makeProtoWriteAction(
+      ActionOwner actionOwner, final MessageLite message, Artifact artifact) {
+    return new BinaryFileWriteAction(
+        actionOwner,
+        artifact,
+        new ByteSource() {
+          @Override
+          public InputStream openStream() throws IOException {
+            return message.toByteString().newInput();
+          }
+        },
+        /*makeExecutable =*/ false);
+  }
+
   private static ArtifactLocation makeArtifactLocation(Artifact artifact) {
     return ArtifactLocation.newBuilder()
         .setRootPath(artifact.getRoot().getPath().toString())
@@ -176,6 +210,16 @@
       }
     }
 
+    // Calculate source files.
+    JavaSourceInfoProvider sourceInfoProvider = base.getProvider(JavaSourceInfoProvider.class);
+    Collection<Artifact> sourceFiles =
+        sourceInfoProvider != null
+            ? sourceInfoProvider.getSourceFiles()
+            : ImmutableList.<Artifact>of();
+    for (Artifact sourceFile : sourceFiles) {
+      builder.addSources(makeArtifactLocation(sourceFile));
+    }
+
     return builder.build();
   }
 
@@ -183,13 +227,15 @@
     PathFragment packagePathFragment =
         ruleContext.getLabel().getPackageIdentifier().getPathFragment();
     String name = base.getLabel().getName();
-    return new PathFragment(packagePathFragment, new PathFragment(name + IDE_BUILD_SUFFIX));
+    return new PathFragment(packagePathFragment, new PathFragment(name + ASWB_BUILD_SUFFIX));
   }
 
-  private RuleIdeInfo.Kind getRuleKind(Rule rule) {
+  private RuleIdeInfo.Kind getRuleKind(Rule rule, ConfiguredTarget base) {
     RuleIdeInfo.Kind kind;
     if ("java_library".equals(rule.getRuleClassObject().getName())) {
       kind = RuleIdeInfo.Kind.JAVA_LIBRARY;
+    } else if (base.getProvider(AndroidSdkProvider.class) != null) {
+      kind = RuleIdeInfo.Kind.ANDROID_SDK;
     } else {
       kind = RuleIdeInfo.Kind.UNRECOGNIZED;
     }