aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2016-02-04 18:00:33 +0000
committerGravatar David Chen <dzc@google.com>2016-02-04 18:15:55 +0000
commitea16e10b71da3797c22ec8fbe30970dae90e597c (patch)
treee6c0c2781be95396e7ff3d4dec038357740c0a08 /src/main/java/com/google/devtools
parent8eccb7f834a262b81e92140d9c3b968dc90d2c47 (diff)
Add jdeps support to AndroidStudioInfoAspect.
This can be used for classpath reduction on the IDE side. -- MOS_MIGRATED_REVID=113861117
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java74
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java20
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java20
6 files changed, 63 insertions, 65 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 66bbb694ad..f6d4856374 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
@@ -409,10 +409,7 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
Artifact manifest = provider.getManifest();
if (manifest != null) {
builder.setManifest(makeArtifactLocation(manifest));
-
- if (!manifest.isSourceArtifact()) {
- ideResolveArtifacts.add(manifest);
- }
+ addResolveArtifact(ideResolveArtifacts, manifest);
}
for (Artifact artifact : provider.getApksUnderTest()) {
@@ -432,12 +429,12 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
Artifact idlClassJar = provider.getIdlClassJar();
if (idlClassJar != null) {
jarBuilder.setJar(makeArtifactLocation(idlClassJar));
- ideResolveArtifacts.add(idlClassJar);
+ addResolveArtifact(ideResolveArtifacts, idlClassJar);
}
Artifact idlSourceJar = provider.getIdlSourceJar();
if (idlSourceJar != null) {
jarBuilder.setSourceJar(makeArtifactLocation(idlSourceJar));
- ideResolveArtifacts.add(idlSourceJar);
+ addResolveArtifact(ideResolveArtifacts, idlSourceJar);
}
if (idlClassJar != null) {
builder.setIdlJar(jarBuilder.build());
@@ -500,11 +497,10 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
if (outputJarsProvider != null) {
// java_library
collectJarsFromOutputJarsProvider(builder, ideResolveArtifacts, outputJarsProvider);
- } else {
- JavaSourceInfoProvider provider = base.getProvider(JavaSourceInfoProvider.class);
- if (provider != null) {
- // java_import
- collectJarsFromSourceInfoProvider(builder, ideResolveArtifacts, provider);
+
+ Artifact jdeps = outputJarsProvider.getJdeps();
+ if (jdeps != null) {
+ builder.setJdeps(makeArtifactLocation(jdeps));
}
}
@@ -527,45 +523,6 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
return builder.build();
}
- private static void collectJarsFromSourceInfoProvider(
- JavaRuleIdeInfo.Builder builder,
- NestedSetBuilder<Artifact> ideResolveArtifacts,
- JavaSourceInfoProvider provider) {
- Collection<Artifact> sourceJarsForJarFiles = provider.getSourceJarsForJarFiles();
- // For java_import rule, we always have only one source jar specified.
- // The intent is that that source jar provides sources for all imported jars,
- // so we reflect that intent, adding that jar to all LibraryArtifacts we produce
- // for java_import rule. We should consider supporting
- // library=<collection of jars>+<collection of srcjars>
- // mode in our AndroidStudio plugin (Android Studio itself supports that).
- Artifact sourceJar;
- if (sourceJarsForJarFiles.size() > 0) {
- sourceJar = sourceJarsForJarFiles.iterator().next();
- } else {
- sourceJar = null;
- }
-
- for (Artifact artifact : provider.getJarFiles()) {
- LibraryArtifact.Builder libraryBuilder = LibraryArtifact.newBuilder();
- libraryBuilder.setJar(makeArtifactLocation(artifact));
-
- if (!artifact.isSourceArtifact()) {
- ideResolveArtifacts.add(artifact);
- }
-
- if (sourceJar != null) {
- libraryBuilder.setSourceJar(makeArtifactLocation(sourceJar));
- }
- builder.addJars(libraryBuilder.build());
- }
-
- if (sourceJar != null) {
- if (!sourceJar.isSourceArtifact()) {
- ideResolveArtifacts.add(sourceJar);
- }
- }
- }
-
private static void collectJarsFromOutputJarsProvider(
JavaRuleIdeInfo.Builder builder,
NestedSetBuilder<Artifact> ideResolveArtifacts,
@@ -575,17 +532,17 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
Artifact classJar = outputJar.getClassJar();
if (classJar != null) {
jarsBuilder.setJar(makeArtifactLocation(classJar));
- ideResolveArtifacts.add(classJar);
+ addResolveArtifact(ideResolveArtifacts, classJar);
}
Artifact iJar = outputJar.getIJar();
if (iJar != null) {
jarsBuilder.setInterfaceJar(makeArtifactLocation(iJar));
- ideResolveArtifacts.add(iJar);
+ addResolveArtifact(ideResolveArtifacts, iJar);
}
Artifact srcJar = outputJar.getSrcJar();
if (srcJar != null) {
jarsBuilder.setSourceJar(makeArtifactLocation(srcJar));
- ideResolveArtifacts.add(srcJar);
+ addResolveArtifact(ideResolveArtifacts, srcJar);
}
// We don't want to add anything that doesn't have a class jar
@@ -605,12 +562,12 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
Artifact genClassJar = genJarsProvider.getGenClassJar();
if (genClassJar != null) {
genjarsBuilder.setJar(makeArtifactLocation(genClassJar));
- ideResolveArtifacts.add(genClassJar);
+ addResolveArtifact(ideResolveArtifacts, genClassJar);
}
Artifact gensrcJar = genJarsProvider.getGenSourceJar();
if (gensrcJar != null) {
genjarsBuilder.setSourceJar(makeArtifactLocation(gensrcJar));
- ideResolveArtifacts.add(gensrcJar);
+ addResolveArtifact(ideResolveArtifacts, gensrcJar);
}
if (genjarsBuilder.hasJar()) {
builder.addGeneratedJars(genjarsBuilder.build());
@@ -675,4 +632,11 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory {
}
}
}
+
+ private static void addResolveArtifact(NestedSetBuilder<Artifact> ideResolveArtifacts,
+ Artifact artifact) {
+ if (!artifact.isSourceArtifact()) {
+ ideResolveArtifacts.add(artifact);
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
index 7fc94d99ff..1cff635270 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCommon.java
@@ -136,6 +136,7 @@ public class AndroidCommon {
private Artifact resourceClassJar;
private Artifact resourceIJar;
private Artifact resourceSourceJar;
+ private Artifact outputDepsProto;
private Artifact manifestProtoOutput;
private AndroidIdlHelper idlHelper;
@@ -530,7 +531,7 @@ public class AndroidCommon {
srcJar = ruleContext.getImplicitOutputArtifact(AndroidRuleClasses.ANDROID_LIBRARY_SOURCE_JAR);
helper.createSourceJarAction(srcJar, genSourceJar);
- Artifact outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
+ outputDepsProto = helper.createOutputDepsProtoArtifact(classJar, javaArtifactsBuilder);
helper.createCompileActionWithInstrumentation(classJar, manifestProtoOutput, genSourceJar,
outputDepsProto, javaArtifactsBuilder);
@@ -575,7 +576,8 @@ public class AndroidCommon {
idlHelper.addTransitiveInfoProviders(builder, classJar, manifestProtoOutput);
JavaRuleOutputJarsProvider.Builder outputJarsBuilder = JavaRuleOutputJarsProvider.builder()
- .addOutputJar(classJar, iJar, srcJar);
+ .addOutputJar(classJar, iJar, srcJar)
+ .setJdeps(outputDepsProto);
if (resourceClassJar != null && resourceIJar != null && resourceSourceJar != null) {
outputJarsBuilder.addOutputJar(resourceClassJar, resourceIJar, resourceSourceJar);
}
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 67ba2c3dff..c1d456b478 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
@@ -315,7 +315,9 @@ public class JavaBinary implements RuleConfiguredTargetFactory {
return builder
.setFilesToBuild(filesToBuild)
.add(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder()
- .addOutputJar(classJar, null /* iJar */, srcJar).build())
+ .addOutputJar(classJar, null /* iJar */, srcJar)
+ .setJdeps(outputDepsProto)
+ .build())
.add(RunfilesProvider.class, runfilesProvider)
.setRunfilesSupport(runfilesSupport, executable)
.add(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
index 633a57b02e..69e4963b37 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.rules.java;
+import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.Artifact;
@@ -68,9 +69,10 @@ public class JavaImport implements RuleConfiguredTargetFactory {
// No need for javac options - no compilation happening here.
JavaCompilationHelper helper = new JavaCompilationHelper(ruleContext, semantics,
ImmutableList.<String>of(), new JavaTargetAttributes.Builder(semantics));
- ImmutableMap.Builder<Artifact, Artifact> compilationToRuntimeJarMap = ImmutableMap.builder();
+ ImmutableBiMap.Builder<Artifact, Artifact> compilationToRuntimeJarMapBuilder =
+ ImmutableBiMap.builder();
ImmutableList<Artifact> interfaceJars =
- processWithIjar(jars, helper, compilationToRuntimeJarMap);
+ processWithIjar(jars, helper, compilationToRuntimeJarMapBuilder);
common.setJavaCompilationArtifacts(collectJavaArtifacts(jars, interfaceJars));
@@ -114,6 +116,8 @@ public class JavaImport implements RuleConfiguredTargetFactory {
NestedSetBuilder<Artifact> filesBuilder = NestedSetBuilder.stableOrder();
filesBuilder.addAll(jars);
+ ImmutableBiMap<Artifact, Artifact> compilationToRuntimeJarMap =
+ compilationToRuntimeJarMapBuilder.build();
semantics.addProviders(
ruleContext,
common,
@@ -122,7 +126,7 @@ public class JavaImport implements RuleConfiguredTargetFactory {
srcJar /* srcJar */,
null /* genJar */,
null /* gensrcJar */,
- compilationToRuntimeJarMap.build(),
+ compilationToRuntimeJarMap,
helper,
filesBuilder,
ruleBuilder);
@@ -134,11 +138,21 @@ public class JavaImport implements RuleConfiguredTargetFactory {
.setSourceJarsForJarFiles(srcJars)
.build();
+ JavaRuleOutputJarsProvider.Builder ruleOutputJarsProvider =
+ JavaRuleOutputJarsProvider.builder();
+ for (Artifact jar : jars) {
+ ruleOutputJarsProvider.addOutputJar(
+ jar,
+ compilationToRuntimeJarMap.inverse().get(jar),
+ srcJar);
+ }
+
NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs();
common.addTransitiveInfoProviders(ruleBuilder, filesToBuild, null);
return ruleBuilder
.setFilesToBuild(filesToBuild)
+ .add(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider.build())
.add(JavaRuntimeJarProvider.class,
new JavaRuntimeJarProvider(common.getJavaCompilationArtifacts().getRuntimeJars()))
.addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, new JavaSkylarkApiProvider())
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
index 2ac7d5ae0a..6dcc700932 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java
@@ -169,7 +169,9 @@ public class JavaLibrary implements RuleConfiguredTargetFactory {
builder
.add(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder()
- .addOutputJar(classJar, iJar, srcJar).build())
+ .addOutputJar(classJar, iJar, srcJar)
+ .setJdeps(outputDepsProto)
+ .build())
.add(JavaRuntimeJarProvider.class,
new JavaRuntimeJarProvider(common.getJavaCompilationArtifacts().getRuntimeJars()))
.add(RunfilesProvider.class, RunfilesProvider.simple(common.getRunfiles(neverLink)))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
index e30b27f69f..c8e0532f17 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
@@ -29,7 +29,7 @@ import javax.annotation.Nullable;
public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider {
public static final JavaRuleOutputJarsProvider EMPTY =
- new JavaRuleOutputJarsProvider(ImmutableList.<OutputJar>of());
+ new JavaRuleOutputJarsProvider(ImmutableList.<OutputJar>of(), null);
/**
* A collection of artifacts associated with a jar output.
@@ -63,15 +63,23 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider
}
final Iterable<OutputJar> outputJars;
+ @Nullable final Artifact jdeps;
- private JavaRuleOutputJarsProvider(Iterable<OutputJar> outputJars) {
+ private JavaRuleOutputJarsProvider(Iterable<OutputJar> outputJars,
+ @Nullable Artifact jdeps) {
this.outputJars = outputJars;
+ this.jdeps = jdeps;
}
public Iterable<OutputJar> getOutputJars() {
return outputJars;
}
+ @Nullable
+ public Artifact getJdeps() {
+ return jdeps;
+ }
+
public static Builder builder() {
return new Builder();
}
@@ -81,6 +89,7 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider
*/
public static class Builder {
ImmutableList.Builder<OutputJar> outputJars = ImmutableList.builder();
+ Artifact jdeps;
public Builder addOutputJar(
@Nullable Artifact classJar,
@@ -96,8 +105,13 @@ public final class JavaRuleOutputJarsProvider implements TransitiveInfoProvider
return this;
}
+ public Builder setJdeps(Artifact jdeps) {
+ this.jdeps = jdeps;
+ return this;
+ }
+
public JavaRuleOutputJarsProvider build() {
- return new JavaRuleOutputJarsProvider(outputJars.build());
+ return new JavaRuleOutputJarsProvider(outputJars.build(), jdeps);
}
}
}