aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/ideinfo
diff options
context:
space:
mode:
authorGravatar Dmitry Lomov <dslomov@google.com>2015-09-14 08:53:10 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-09-14 15:39:49 +0000
commit2473b9f434e8acd3ec4878845eb8c92a24e0c7e1 (patch)
treed18388da7387defea88bfa58a20effb56315aa49 /src/main/java/com/google/devtools/build/lib/ideinfo
parent0d815d65e50d10f6b8b2e1a485910bddb4bcea33 (diff)
Add unit tests for AndroidStudioInfoAspect and implement dependency collection.
-- MOS_MIGRATED_REVID=102976551
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/ideinfo')
-rw-r--r--src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java85
-rw-r--r--src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java10
2 files changed, 79 insertions, 16 deletions
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 202d1da7a6..fa26e5c598 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
@@ -14,6 +14,9 @@
package com.google.devtools.build.lib.ideinfo;
+import static com.google.common.collect.Iterables.transform;
+
+import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.io.ByteSource;
import com.google.devtools.build.lib.actions.ActionOwner;
@@ -25,6 +28,7 @@ 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;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
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;
@@ -33,13 +37,16 @@ import com.google.devtools.build.lib.ideinfo.androidstudio.AndroidStudioIdeInfo.
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.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.JavaExportsProvider;
import com.google.devtools.build.lib.rules.java.JavaRuleOutputJarsProvider;
import com.google.devtools.build.lib.rules.java.JavaSourceInfoProvider;
+import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.protobuf.MessageLite;
@@ -47,6 +54,9 @@ import com.google.protobuf.MessageLite;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
+import java.util.List;
+
+import javax.annotation.Nullable;
/**
* Generates ide-build information for Android Studio.
@@ -60,6 +70,13 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
// File suffixes.
public static final String ASWB_BUILD_SUFFIX = ".aswb-build";
+ public static final Function<Label, String> LABEL_TO_STRING = new Function<Label, String>() {
+ @Nullable
+ @Override
+ public String apply(Label label) {
+ return label.toString();
+ }
+ };
@Override
public AspectDefinition getDefinition() {
@@ -74,19 +91,46 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
AspectParameters parameters) {
Aspect.Builder builder = new Builder(NAME);
- // Collect ide build files.
+ // Collect ide build files and calculate dependencies.
+ NestedSetBuilder<Label> transitiveDependenciesBuilder = NestedSetBuilder.stableOrder();
+ NestedSetBuilder<Label> dependenciesBuilder = NestedSetBuilder.stableOrder();
+
NestedSetBuilder<Artifact> ideBuildFilesBuilder = NestedSetBuilder.stableOrder();
+
+ // todo(dslomov,tomlu): following current build info logic, this code enumerates dependencies
+ // directly by iterating over deps attribute. The more robust way to do this might be
+ // to iterate classpath as provided to build action.
if (ruleContext.attributes().has("deps", Type.LABEL_LIST)) {
- Iterable<AndroidStudioInfoFilesProvider> deps =
+ Iterable<AndroidStudioInfoFilesProvider> androidStudioInfoFilesProviders =
ruleContext.getPrerequisites("deps", Mode.TARGET, AndroidStudioInfoFilesProvider.class);
- for (AndroidStudioInfoFilesProvider dep : deps) {
- ideBuildFilesBuilder.addTransitive(dep.getIdeBuildFiles());
+ for (AndroidStudioInfoFilesProvider depProvider : androidStudioInfoFilesProviders) {
+ ideBuildFilesBuilder.addTransitive(depProvider.getIdeBuildFiles());
+ transitiveDependenciesBuilder.addTransitive(depProvider.getTransitiveDependencies());
+ }
+ List<? extends TransitiveInfoCollection> deps =
+ ruleContext.getPrerequisites("deps", Mode.TARGET);
+ for (TransitiveInfoCollection dep : deps) {
+ dependenciesBuilder.add(dep.getLabel());
+ }
+
+ Iterable<JavaExportsProvider> javaExportsProviders = ruleContext
+ .getPrerequisites("deps", Mode.TARGET, JavaExportsProvider.class);
+ for (JavaExportsProvider javaExportsProvider : javaExportsProviders) {
+ dependenciesBuilder.addTransitive(javaExportsProvider.getTransitiveExports());
}
}
+ NestedSet<Label> directDependencies = dependenciesBuilder.build();
+ transitiveDependenciesBuilder.addTransitive(directDependencies);
+ NestedSet<Label> transitiveDependencies = transitiveDependenciesBuilder.build();
+
RuleIdeInfo.Kind ruleKind = getRuleKind(ruleContext.getRule(), base);
+
if (ruleKind != RuleIdeInfo.Kind.UNRECOGNIZED) {
- Artifact ideBuildFile = createIdeBuildArtifact(base, ruleContext, ruleKind);
+ Artifact ideBuildFile =
+ createIdeBuildArtifact(base, ruleContext, ruleKind,
+ directDependencies,
+ transitiveDependencies);
ideBuildFilesBuilder.add(ideBuildFile);
}
@@ -95,7 +139,7 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
.addOutputGroup(IDE_BUILD, ideBuildFiles)
.addProvider(
AndroidStudioInfoFilesProvider.class,
- new AndroidStudioInfoFilesProvider(ideBuildFiles));
+ new AndroidStudioInfoFilesProvider(ideBuildFiles, transitiveDependencies));
return builder.build();
}
@@ -117,7 +161,10 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
}
private Artifact createIdeBuildArtifact(
- ConfiguredTarget base, RuleContext ruleContext, RuleIdeInfo.Kind ruleKind) {
+ ConfiguredTarget base,
+ RuleContext ruleContext,
+ Kind ruleKind,
+ NestedSet<Label> directDependencies, NestedSet<Label> transitiveDependencies) {
PathFragment ideBuildFilePath = getOutputFilePath(base, ruleContext);
Root genfilesDirectory = ruleContext.getConfiguration().getGenfilesDirectory();
Artifact ideBuildFile =
@@ -139,16 +186,21 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
outputBuilder.setKind(ruleKind);
- if (ruleKind == RuleIdeInfo.Kind.JAVA_LIBRARY) {
+ outputBuilder.addAllDependencies(transform(directDependencies, LABEL_TO_STRING));
+ outputBuilder.addAllTransitiveDependencies(transform(transitiveDependencies, LABEL_TO_STRING));
+
+ if (ruleKind == Kind.JAVA_LIBRARY) {
outputBuilder.setJavaRuleIdeInfo(makeJavaRuleIdeInfo(base));
- } else if (ruleKind == RuleIdeInfo.Kind.ANDROID_SDK) {
+ } else if (ruleKind == Kind.ANDROID_SDK) {
outputBuilder.setAndroidSdkRuleInfo(
makeAndroidSdkRuleInfo(ruleContext, base.getProvider(AndroidSdkProvider.class)));
}
+
final RuleIdeInfo ruleIdeInfo = outputBuilder.build();
ruleContext.registerAction(
makeProtoWriteAction(ruleContext.getActionOwner(), ruleIdeInfo, ideBuildFile));
+
return ideBuildFile;
}
@@ -209,13 +261,8 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
}
}
}
+ Collection<Artifact> sourceFiles = getSources(base);
- // 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));
}
@@ -223,6 +270,14 @@ public class AndroidStudioInfoAspect implements ConfiguredAspectFactory {
return builder.build();
}
+ private static Collection<Artifact> getSources(ConfiguredTarget base) {
+ // Calculate source files.
+ JavaSourceInfoProvider sourceInfoProvider = base.getProvider(JavaSourceInfoProvider.class);
+ return sourceInfoProvider != null
+ ? sourceInfoProvider.getSourceFiles()
+ : ImmutableList.<Artifact>of();
+ }
+
private PathFragment getOutputFilePath(ConfiguredTarget base, RuleContext ruleContext) {
PathFragment packagePathFragment =
ruleContext.getLabel().getPackageIdentifier().getPathFragment();
diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java
index 5795ae507b..95faf9e57e 100644
--- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java
@@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.syntax.Label;
/**
* File provider for Android Studio ide build files.
@@ -25,12 +26,19 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@Immutable
public final class AndroidStudioInfoFilesProvider implements TransitiveInfoProvider {
private final NestedSet<Artifact> ideBuildFiles;
+ private final NestedSet<Label> transitiveDependencies;
- public AndroidStudioInfoFilesProvider(NestedSet<Artifact> ideBuildFiles) {
+ public AndroidStudioInfoFilesProvider(
+ NestedSet<Artifact> ideBuildFiles, NestedSet<Label> transitiveDependencies) {
this.ideBuildFiles = ideBuildFiles;
+ this.transitiveDependencies = transitiveDependencies;
}
public NestedSet<Artifact> getIdeBuildFiles() {
return ideBuildFiles;
}
+
+ public NestedSet<Label> getTransitiveDependencies() {
+ return transitiveDependencies;
+ }
}