diff options
author | Googler <noreply@google.com> | 2016-02-04 18:00:33 +0000 |
---|---|---|
committer | David Chen <dzc@google.com> | 2016-02-04 18:15:55 +0000 |
commit | ea16e10b71da3797c22ec8fbe30970dae90e597c (patch) | |
tree | e6c0c2781be95396e7ff3d4dec038357740c0a08 /src/main/java/com/google/devtools | |
parent | 8eccb7f834a262b81e92140d9c3b968dc90d2c47 (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')
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); } } } |