diff options
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.java | 85 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoFilesProvider.java | 10 |
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; + } } |