diff options
author | elenairina <elenairina@google.com> | 2017-06-30 16:43:23 +0200 |
---|---|---|
committer | Marcel Hlopko <hlopko@google.com> | 2017-07-03 09:05:59 +0200 |
commit | c00ec98dc27893ee8cc688ae8b5bf60bdb56dfaa (patch) | |
tree | b436d7d20edbf412a6b0d86fb80d15721bc8b45a /src/main/java/com/google/devtools | |
parent | ed3ba0325e8a41eccf2f9c5e2bf95a2572d9394d (diff) |
Add plugins and exported_plugins params to java_common.compile.
This is a step forward to having the same semantics for java_library and
custom Skylark rules that use java_common.compile, facilitating the migration
from native Java rules to Skylark.
Progress on #2614
PiperOrigin-RevId: 160644961
Diffstat (limited to 'src/main/java/com/google/devtools')
6 files changed, 140 insertions, 61 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java index 293208c69c..8a3e93c98e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java @@ -18,6 +18,7 @@ import static com.google.common.collect.ImmutableList.toImmutableList; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Streams; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; @@ -732,6 +733,18 @@ public class JavaCommon { * the target attributes. */ private void addPlugins(JavaTargetAttributes.Builder attributes) { + addPlugins(attributes, activePlugins); + } + + /** + * Adds information about the annotation processors that should be run for this java target + * retrieved from the given plugins to the target attributes. + * + * In particular, the processor names/paths and the API generating processor names/paths are added + * to the given attributes. Plugins having repetitive names/paths will be added only once. + */ + public static void addPlugins( + JavaTargetAttributes.Builder attributes, Iterable<JavaPluginInfoProvider> activePlugins) { for (JavaPluginInfoProvider plugin : activePlugins) { for (String name : plugin.getProcessorClasses()) { attributes.addProcessorName(name); @@ -759,11 +772,42 @@ public class JavaCommon { private static Iterable<JavaPluginInfoProvider> getPluginInfoProvidersForAttribute( RuleContext ruleContext, String attribute, Mode mode) { if (ruleContext.attributes().has(attribute, BuildType.LABEL_LIST)) { - return ruleContext.getPrerequisites(attribute, mode, JavaPluginInfoProvider.class); + return JavaProvider.getProvidersFromListOfTargets( + JavaPluginInfoProvider.class, ruleContext.getPrerequisites(attribute, mode)); } return ImmutableList.of(); } + JavaPluginInfoProvider getJavaPluginInfoProvider(RuleContext ruleContext) { + ImmutableSet<String> processorClasses = getProcessorClasses(ruleContext); + NestedSet<Artifact> processorClasspath = getRuntimeClasspath(); + ImmutableSet<String> apiGeneratingProcessorClasses; + NestedSet<Artifact> apiGeneratingProcessorClasspath; + if (ruleContext.attributes().get("generates_api", Type.BOOLEAN)) { + apiGeneratingProcessorClasses = processorClasses; + apiGeneratingProcessorClasspath = processorClasspath; + } else { + apiGeneratingProcessorClasses = ImmutableSet.of(); + apiGeneratingProcessorClasspath = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); + } + + return new JavaPluginInfoProvider( + processorClasses, + processorClasspath, + apiGeneratingProcessorClasses, + apiGeneratingProcessorClasspath); + } + + /** + * Returns the class that should be passed to javac in order to run the annotation processor this + * class represents. + */ + private static ImmutableSet<String> getProcessorClasses(RuleContext ruleContext) { + return ruleContext.getRule().isAttributeValueExplicitlySpecified("processor_class") + ? ImmutableSet.of(ruleContext.attributes().get("processor_class", Type.STRING)) + : ImmutableSet.<String>of(); + } + public static JavaPluginInfoProvider getTransitivePlugins(RuleContext ruleContext) { return JavaPluginInfoProvider.merge(Iterables.concat( getPluginInfoProvidersForAttribute(ruleContext, "exported_plugins", Mode.HOST), 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 81f051d813..28255ccff2 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 @@ -48,13 +48,16 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException, RuleErrorException { JavaCommon common = new JavaCommon(ruleContext, semantics); - RuleConfiguredTargetBuilder builder = - init(ruleContext, common, false /* includeGeneratedExtensionRegistry */); - return builder != null ? builder.build() : null; + return init( + ruleContext, + common, + /* includeGeneratedExtensionRegistry = */false, + /* includeJavaPluginInfoProvider = */ false); } - final RuleConfiguredTargetBuilder init( - RuleContext ruleContext, final JavaCommon common, boolean includeGeneratedExtensionRegistry) + final ConfiguredTarget init( + RuleContext ruleContext, final JavaCommon common, boolean includeGeneratedExtensionRegistry, + boolean includeJavaPluginInfoProvider) throws InterruptedException { JavaTargetAttributes.Builder attributesBuilder = common.initCommon(); @@ -211,13 +214,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { NestedSet<Artifact> proguardSpecs = new ProguardLibrary(ruleContext).collectProguardSpecs(); CcLinkParamsProvider ccLinkParamsProvider = new CcLinkParamsProvider(ccLinkParamsStore); - JavaProvider javaProvider = JavaProvider.Builder.create() - .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider) - .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider) - .addProvider(ProtoJavaApiInfoAspectProvider.class, protoAspectBuilder.build()) - .addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider) - // java_library doesn't need to return JavaRunfilesProvider - .build(); + builder .addSkylarkTransitiveInfo( JavaSkylarkApiProvider.NAME, JavaSkylarkApiProvider.fromRuleContext()) @@ -230,10 +227,8 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { .addProvider(new JavaNeverlinkInfoProvider(neverLink)) .addProvider(transitiveCppDeps) .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider) - .addProvider(javaProvider) .addProvider(ccLinkParamsProvider) .addNativeDeclaredProvider(ccLinkParamsProvider) - .addNativeDeclaredProvider(javaProvider) .addProvider(new JavaNativeLibraryProvider(transitiveJavaNativeLibraries)) .addProvider(JavaSourceInfoProvider.fromJavaTargetAttributes(attributes, semantics)) // TODO(bazel-team): this should only happen for java_plugin @@ -243,10 +238,25 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { .addOutputGroup(JavaSemantics.SOURCE_JARS_OUTPUT_GROUP, transitiveSourceJars) .addOutputGroup(OutputGroupProvider.HIDDEN_TOP_LEVEL, proguardSpecs); + // java_library doesn't need to return JavaRunfilesProvider + JavaProvider.Builder javaProviderBuilder = JavaProvider.Builder.create() + .addProvider(JavaCompilationArgsProvider.class, compilationArgsProvider) + .addProvider(JavaSourceJarsProvider.class, sourceJarsProvider) + .addProvider(ProtoJavaApiInfoAspectProvider.class, protoAspectBuilder.build()) + .addProvider(JavaRuleOutputJarsProvider.class, ruleOutputJarsProvider); + if (includeJavaPluginInfoProvider) { + JavaPluginInfoProvider javaPluginInfoProvider = common.getJavaPluginInfoProvider(ruleContext); + javaProviderBuilder.addProvider(JavaPluginInfoProvider.class, javaPluginInfoProvider); + builder.addProvider(javaPluginInfoProvider); + } + JavaProvider javaProvider = javaProviderBuilder.build(); + builder.addProvider(javaProvider); + builder.addNativeDeclaredProvider(javaProvider); + if (ruleContext.hasErrors()) { return null; } - return builder; + return builder.build(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java index 5024f1d7f3..87568b3747 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java @@ -53,6 +53,7 @@ public final class JavaLibraryHelper { */ private final List<JavaCompilationArgsProvider> deps = new ArrayList<>(); private final List<JavaCompilationArgsProvider> exports = new ArrayList<>(); + private final List<JavaPluginInfoProvider> plugins = new ArrayList<>(); private ImmutableList<String> javacOpts = ImmutableList.of(); private ImmutableList<Artifact> sourcePathEntries = ImmutableList.of(); private StrictDepsMode strictDepsMode = StrictDepsMode.OFF; @@ -119,6 +120,11 @@ public final class JavaLibraryHelper { return this; } + public JavaLibraryHelper addAllPlugins(Iterable<JavaPluginInfoProvider> providers) { + Iterables.addAll(plugins, providers); + return this; + } + /** * Sets the compiler options. */ @@ -163,6 +169,7 @@ public final class JavaLibraryHelper { attributes.setRuleKind(ruleContext.getRule().getRuleClass()); attributes.setTargetLabel(ruleContext.getLabel()); attributes.setSourcePath(sourcePathEntries); + JavaCommon.addPlugins(attributes, plugins); for (Artifact resource : resources) { attributes.addResource( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java index d3a3d02391..d8b4097ff7 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java @@ -13,17 +13,9 @@ // limitations under the License. package com.google.devtools.build.lib.rules.java; -import com.google.common.collect.ImmutableSet; -import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; -import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.collect.nestedset.NestedSet; -import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; -import com.google.devtools.build.lib.collect.nestedset.Order; -import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; -import com.google.devtools.build.lib.syntax.Type; /** * Implementation for the java_plugin rule. @@ -39,41 +31,10 @@ public class JavaPlugin implements RuleConfiguredTargetFactory { @Override public final ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException, RuleErrorException { - JavaLibrary javaLibrary = new JavaLibrary(semantics); - JavaCommon common = new JavaCommon(ruleContext, semantics); - RuleConfiguredTargetBuilder builder = - javaLibrary.init(ruleContext, common, true /* includeGeneratedExtensionRegistry */); - if (builder == null) { - return null; - } - ImmutableSet<String> processorClasses = getProcessorClasses(ruleContext); - NestedSet<Artifact> processorClasspath = common.getRuntimeClasspath(); - ImmutableSet<String> apiGeneratingProcessorClasses; - NestedSet<Artifact> apiGeneratingProcessorClasspath; - if (ruleContext.attributes().get("generates_api", Type.BOOLEAN)) { - apiGeneratingProcessorClasses = processorClasses; - apiGeneratingProcessorClasspath = processorClasspath; - } else { - apiGeneratingProcessorClasses = ImmutableSet.of(); - apiGeneratingProcessorClasspath = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); - } - builder.addProvider( - new JavaPluginInfoProvider( - processorClasses, - processorClasspath, - apiGeneratingProcessorClasses, - apiGeneratingProcessorClasspath)); - return builder.build(); - } - - /** - * Returns the class that should be passed to javac in order to run the annotation processor this - * class represents. - */ - private static ImmutableSet<String> getProcessorClasses(RuleContext ruleContext) { - if (ruleContext.getRule().isAttributeValueExplicitlySpecified("processor_class")) { - return ImmutableSet.of(ruleContext.attributes().get("processor_class", Type.STRING)); - } - return ImmutableSet.of(); + return new JavaLibrary(semantics).init( + ruleContext, + new JavaCommon(ruleContext, semantics), + /* includeGeneratedExtensionRegistry = */ true, + /* includeJavaPluginInfoProvider = */ true); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java index 1a07ff3d0e..4e7ed9f11a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.java; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; @@ -45,7 +46,8 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive JavaSourceJarsProvider.class, ProtoJavaApiInfoAspectProvider.class, JavaRuleOutputJarsProvider.class, - JavaRunfilesProvider.class + JavaRunfilesProvider.class, + JavaPluginInfoProvider.class ); private final TransitiveInfoProviderMap providers; @@ -74,6 +76,8 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive JavaProvider.fetchProvidersFromList(providers, ProtoJavaApiInfoAspectProvider.class); List<JavaRunfilesProvider> javaRunfilesProviders = JavaProvider.fetchProvidersFromList(providers, JavaRunfilesProvider.class); + List<JavaPluginInfoProvider> javaPluginInfoProviders = + JavaProvider.fetchProvidersFromList(providers, JavaPluginInfoProvider.class); Runfiles mergedRunfiles = Runfiles.EMPTY; for (JavaRunfilesProvider javaRunfilesProvider : javaRunfilesProviders) { @@ -94,6 +98,8 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive // it doesn't have any output jars. .addProvider(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder().build()) .addProvider(JavaRunfilesProvider.class, new JavaRunfilesProvider(mergedRunfiles)) + .addProvider( + JavaPluginInfoProvider.class, JavaPluginInfoProvider.merge(javaPluginInfoProviders)) .build(); } @@ -152,6 +158,23 @@ public final class JavaProvider extends SkylarkClassObject implements Transitive return providersList; } + /** + * Returns a list of the given provider class with all the said providers retrieved from the + * given {@link JavaProvider}s. + */ + public static <T extends TransitiveInfoProvider> ImmutableList<T> + getProvidersFromListOfJavaProviders( + Class<T> providerClass, Iterable<JavaProvider> javaProviders) { + ImmutableList.Builder<T> providersList = new ImmutableList.Builder<>(); + for (JavaProvider javaProvider : javaProviders) { + T provider = javaProvider.getProvider(providerClass); + if (provider != null) { + providersList.add(provider); + } + } + return providersList.build(); + } + private JavaProvider(TransitiveInfoProviderMap providers) { super(JAVA_PROVIDER, ImmutableMap.<String, Object>of( "transitive_runtime_jars", SkylarkNestedSet.of( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java index 41454aa340..a0a07419e4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java @@ -191,6 +191,24 @@ public class JavaSkylarkCommon { doc = "A list of exports. Optional." ), @Param( + name = "plugins", + positional = false, + named = true, + type = SkylarkList.class, + generic1 = JavaProvider.class, + defaultValue = "[]", + doc = "A list of plugins. Optional." + ), + @Param( + name = "exported_plugins", + positional = false, + named = true, + type = SkylarkList.class, + generic1 = JavaProvider.class, + defaultValue = "[]", + doc = "A list of exported plugins. Optional." + ), + @Param( name = "strict_deps", defaultValue = "'ERROR'", positional = false, @@ -241,6 +259,8 @@ public class JavaSkylarkCommon { SkylarkList<String> javacOpts, SkylarkList<JavaProvider> deps, SkylarkList<JavaProvider> exports, + SkylarkList<JavaProvider> plugins, + SkylarkList<JavaProvider> exportedPlugins, String strictDepsMode, ConfiguredTarget javaToolchain, ConfiguredTarget hostJavabase, @@ -265,6 +285,10 @@ public class JavaSkylarkCommon { helper.setCompilationStrictDepsMode(getStrictDepsMode(strictDepsMode)); MiddlemanProvider hostJavabaseProvider = hostJavabase.getProvider(MiddlemanProvider.class); + helper.addAllPlugins( + JavaProvider.fetchProvidersFromList(plugins, JavaPluginInfoProvider.class)); + helper.addAllPlugins(JavaProvider.fetchProvidersFromList(deps, JavaPluginInfoProvider.class)); + NestedSet<Artifact> hostJavabaseArtifacts = hostJavabaseProvider == null ? NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER) @@ -285,11 +309,21 @@ public class JavaSkylarkCommon { helper.buildCompilationArgsProvider(artifacts, true); Runfiles runfiles = new Runfiles.Builder(skylarkRuleContext.getWorkspaceName()).addArtifacts( javaCompilationArgsProvider.getRecursiveJavaCompilationArgs().getRuntimeJars()).build(); + + JavaPluginInfoProvider transitivePluginsProvider = + JavaPluginInfoProvider.merge(Iterables.concat( + JavaProvider.getProvidersFromListOfJavaProviders( + JavaPluginInfoProvider.class, exportedPlugins), + JavaProvider.getProvidersFromListOfJavaProviders( + JavaPluginInfoProvider.class, exports) + )); + return JavaProvider.Builder.create() .addProvider(JavaCompilationArgsProvider.class, javaCompilationArgsProvider) .addProvider(JavaSourceJarsProvider.class, createJavaSourceJarsProvider(sourceJars)) .addProvider(JavaRuleOutputJarsProvider.class, javaRuleOutputJarsProvider) .addProvider(JavaRunfilesProvider.class, new JavaRunfilesProvider(runfiles)) + .addProvider(JavaPluginInfoProvider.class, transitivePluginsProvider) .build(); } |