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;
}