diff options
author | cushon <cushon@google.com> | 2017-11-29 22:22:30 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2017-11-29 22:24:35 -0800 |
commit | c7633e582e49f8a4c47c8ea0060ac3c9b0b6d71b (patch) | |
tree | 935879ae2988ef4d6b03ce082b4b2af24d6d5316 /src/main/java/com/google/devtools/build | |
parent | 89ec374424a585c4923df942c848c6a88ddd9db7 (diff) |
Add support for package specification-based java_plugin configuration
This change allows java_plugins to be enabled for the set of packages
described by a package group, using a new java_plugin_configuration rule
that can be added to a java_toolchain configuration.
PiperOrigin-RevId: 177410831
Diffstat (limited to 'src/main/java/com/google/devtools/build')
9 files changed, 241 insertions, 4 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 2baf5f3bc7..cc0385a207 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -725,6 +725,8 @@ java_library( "rules/java/JavaInfo.java", "rules/java/JavaLibrary.java", "rules/java/JavaPlugin.java", + "rules/java/JavaPluginConfiguration.java", + "rules/java/JavaPluginConfigurationRule.java", "rules/java/JavaPrimaryClassProvider.java", "rules/java/JavaRuntime.java", "rules/java/JavaRuntimeAlias.java", @@ -823,6 +825,7 @@ java_library( "rules/java/JavaNativeLibraryProvider.java", "rules/java/JavaNeverlinkInfoProvider.java", "rules/java/JavaOptions.java", + "rules/java/JavaPluginConfigurationProvider.java", "rules/java/JavaPluginInfoProvider.java", "rules/java/JavaRuleClasses.java", "rules/java/JavaRuleOutputJarsProvider.java", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 4c2d45d2c7..c6cd791be9 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -120,6 +120,7 @@ import com.google.devtools.build.lib.rules.java.JavaConfigurationLoader; import com.google.devtools.build.lib.rules.java.JavaImportBaseRule; import com.google.devtools.build.lib.rules.java.JavaInfo; import com.google.devtools.build.lib.rules.java.JavaOptions; +import com.google.devtools.build.lib.rules.java.JavaPluginConfigurationRule; import com.google.devtools.build.lib.rules.java.JavaRuleClasses.IjarBaseRule; import com.google.devtools.build.lib.rules.java.JavaRuntimeAlias; import com.google.devtools.build.lib.rules.java.JavaRuntimeRule; @@ -435,6 +436,7 @@ public class BazelRuleClassProvider { builder.addRuleDefinition(new BazelJavaTestRule()); builder.addRuleDefinition(new BazelJavaPluginRule()); builder.addRuleDefinition(new JavaToolchainRule()); + builder.addRuleDefinition(new JavaPluginConfigurationRule()); builder.addRuleDefinition(new JavaRuntimeRule()); builder.addRuleDefinition(new JavaRuntimeSuiteRule()); builder.addRuleDefinition(new JavaRuntimeAlias.JavaRuntimeAliasRule()); 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 10610aa4cf..f13287bf24 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 @@ -816,6 +816,13 @@ public class JavaCommon { getPluginInfoProvidersForAttribute(ruleContext, ":java_plugins", Mode.HOST)); Iterables.addAll(result, getPluginInfoProvidersForAttribute(ruleContext, "plugins", Mode.HOST)); Iterables.addAll(result, getPluginInfoProvidersForAttribute(ruleContext, "deps", Mode.TARGET)); + // Enable any plugins from java_toolchain.plugins that are configured for the current package. + JavaToolchainProvider.from(ruleContext) + .pluginConfiguration() + .stream() + .filter(p -> p.matches(ruleContext.getLabel())) + .map(JavaPluginConfigurationProvider::plugin) + .forEachOrdered(result::add); return ImmutableList.copyOf(result); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfiguration.java new file mode 100644 index 0000000000..ac9ac3017c --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfiguration.java @@ -0,0 +1,49 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.java; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.PackageSpecificationProvider; +import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; +import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; +import com.google.devtools.build.lib.analysis.RuleContext; +import com.google.devtools.build.lib.analysis.Runfiles; +import com.google.devtools.build.lib.analysis.RunfilesProvider; +import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.collect.nestedset.Order; +import java.util.List; + +/** Implementation for the java_plugin_configuration rule. */ +public class JavaPluginConfiguration implements RuleConfiguredTargetFactory { + + @Override + public ConfiguredTarget create(RuleContext ruleContext) { + List<PackageSpecificationProvider> packages = + ImmutableList.copyOf( + ruleContext.getPrerequisites( + "packages", Mode.HOST, PackageSpecificationProvider.class)); + JavaPluginInfoProvider plugins = + JavaPluginInfoProvider.merge( + JavaInfo.getProvidersFromListOfTargets( + JavaPluginInfoProvider.class, ruleContext.getPrerequisites("plugins", Mode.HOST))); + return new RuleConfiguredTargetBuilder(ruleContext) + .addProvider(RunfilesProvider.class, RunfilesProvider.simple(Runfiles.EMPTY)) + .setFilesToBuild(NestedSetBuilder.emptySet(Order.STABLE_ORDER)) + .addProvider(JavaPluginConfigurationProvider.create(packages, plugins)) + .build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationProvider.java new file mode 100644 index 0000000000..e1ca135759 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationProvider.java @@ -0,0 +1,52 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.java; + +import com.google.auto.value.AutoValue; +import com.google.common.collect.Streams; +import com.google.devtools.build.lib.analysis.PackageSpecificationProvider; +import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import java.util.List; + +/** A provider for Java plugin configuration. */ +@AutoValue +@Immutable +public abstract class JavaPluginConfigurationProvider implements TransitiveInfoProvider { + + /** Creates a {@link JavaPluginConfigurationProvider}. */ + public static JavaPluginConfigurationProvider create( + List<PackageSpecificationProvider> packageSpecifications, JavaPluginInfoProvider plugin) { + return new AutoValue_JavaPluginConfigurationProvider(packageSpecifications, plugin); + } + + /** Package specifications for which the plugins should be enabled. */ + abstract List<PackageSpecificationProvider> packageSpecifications(); + + /** The Java plugins described by this configuration. */ + abstract JavaPluginInfoProvider plugin(); + + /** + * Returns true if this plugin configuration matches the current label: that is, if the label's + * package is contained by any of the {@link #packageSpecifications}. + */ + public boolean matches(Label label) { + return packageSpecifications() + .stream() + .flatMap(p -> Streams.stream(p.getPackageSpecifications())) + .anyMatch(p -> p.containsPackage(label.getPackageIdentifier())); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationRule.java new file mode 100644 index 0000000000..5e4522201d --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationRule.java @@ -0,0 +1,100 @@ +// Copyright 2017 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.rules.java; + +import static com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition.HOST; +import static com.google.devtools.build.lib.packages.Attribute.attr; +import static com.google.devtools.build.lib.packages.BuildType.LICENSE; +import static com.google.devtools.build.lib.rules.java.JavaRuleClasses.CONTAINS_JAVA_PROVIDER; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.analysis.BaseRuleClasses; +import com.google.devtools.build.lib.analysis.PackageSpecificationProvider; +import com.google.devtools.build.lib.analysis.RuleDefinition; +import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment; +import com.google.devtools.build.lib.packages.BuildType; +import com.google.devtools.build.lib.packages.RuleClass; +import com.google.devtools.build.lib.packages.RuleClass.Builder; + +/** Rule definition for {@code java_plugin_configuration} */ +public class JavaPluginConfigurationRule implements RuleDefinition { + + @Override + public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) { + return builder + /* <!-- #BLAZE_RULE(java_plugin_configuration).ATTRIBUTE(packages) --> + The set of <code><a href="${link package_group}">package_group</a></code>s + the plugins in this configuration should be enabled for. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add( + attr("packages", BuildType.LABEL_LIST) + .cfg(HOST) + .allowedFileTypes() + .mandatoryNativeProviders(ImmutableList.of(PackageSpecificationProvider.class))) + /* <!-- #BLAZE_RULE(java_plugin_configuration).ATTRIBUTE(packages) --> + The list of <code><a href="${link java_plugin}">java_plugin</a></code>s included in this + configuration. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add( + attr("plugins", BuildType.LABEL_LIST) + .cfg(HOST) + .allowedFileTypes() + .mandatoryProvidersList(ImmutableList.of(CONTAINS_JAVA_PROVIDER))) + .add(attr("output_licenses", LICENSE)) + .build(); + } + + @Override + public Metadata getMetadata() { + return RuleDefinition.Metadata.builder() + .name("java_plugin_configuration") + .ancestors(BaseRuleClasses.BaseRule.class) + .factoryClass(JavaPluginConfiguration.class) + .build(); + } +} +/*<!-- #BLAZE_RULE (NAME = java_plugin_configuration, TYPE = OTHER, FAMILY = Java) --> + +<p> +Configures a set of <code><a href="${link java_plugin}">java_plugin</a></code>s to run on a set of +packages. Plugin configurations can be added to +<code><a href="${link java_toolchain.plugins}">java_toolchain.plugins</a></code>s. +</p> + +<h4 id="java_plugin_configuration">Example:</h4> + +<pre class="code"> +java_plugin_configuration( + plugins = [":my_java_plugin"], + packages = [":plugin_packages"], +) + +package_group( + name = "plugin_packages", + packages = [ + "//com/my/project/...", + "-//com/my/project/testing/...", + ], +) + +java_toolchain( + ..., + plugin_configuration = [ + ":my_plugin", + ] +) +</pre> + +<!-- #END_BLAZE_RULE -->*/ diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java index 5f077e5a03..b4df602f81 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java @@ -82,6 +82,11 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory { ImmutableMap.<Label, ImmutableCollection<Artifact>>of( AliasProvider.getDependencyLabel(javacDep), ImmutableList.of(javac))); + ImmutableList<JavaPluginConfigurationProvider> pluginConfiguration = + ImmutableList.copyOf( + ruleContext.getPrerequisites( + "plugin_configuration", Mode.HOST, JavaPluginConfigurationProvider.class)); + JavaToolchainData toolchainData = new JavaToolchainData( source, @@ -113,7 +118,8 @@ public final class JavaToolchain implements RuleConfiguredTargetFactory { resourceJarBuilder, timezoneData, ijar, - compatibleJavacOptions); + compatibleJavacOptions, + pluginConfiguration); RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext) .addSkylarkTransitiveInfo( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java index be1656db14..d1866203f2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java @@ -80,7 +80,8 @@ public class JavaToolchainProvider extends ToolchainInfo { @Nullable Artifact resourceJarBuilder, @Nullable Artifact timezoneData, FilesToRunProvider ijar, - ImmutableListMultimap<String, String> compatibleJavacOptions) { + ImmutableListMultimap<String, String> compatibleJavacOptions, + ImmutableList<JavaPluginConfigurationProvider> pluginConfiguration) { return new JavaToolchainProvider( label, data.getSourceVersion(), @@ -108,7 +109,8 @@ public class JavaToolchainProvider extends ToolchainInfo { .addAll(defaultJavacFlags) .build(), data.getJvmOptions(), - data.getJavacSupportsWorkers()); + data.getJavacSupportsWorkers(), + pluginConfiguration); } private final Label label; @@ -133,6 +135,7 @@ public class JavaToolchainProvider extends ToolchainInfo { private final ImmutableList<String> javacOptions; private final ImmutableList<String> jvmOptions; private final boolean javacSupportsWorkers; + private final ImmutableList<JavaPluginConfigurationProvider> pluginConfiguration; private JavaToolchainProvider( Label label, @@ -156,7 +159,8 @@ public class JavaToolchainProvider extends ToolchainInfo { ImmutableListMultimap<String, String> compatibleJavacOptions, ImmutableList<String> javacOptions, ImmutableList<String> jvmOptions, - boolean javacSupportsWorkers) { + boolean javacSupportsWorkers, + ImmutableList<JavaPluginConfigurationProvider> pluginConfiguration) { super(ImmutableMap.of(), Location.BUILTIN); this.label = label; @@ -181,6 +185,7 @@ public class JavaToolchainProvider extends ToolchainInfo { this.javacOptions = javacOptions; this.jvmOptions = jvmOptions; this.javacSupportsWorkers = javacSupportsWorkers; + this.pluginConfiguration = pluginConfiguration; } /** Returns the label for this {@code java_toolchain}. */ @@ -311,4 +316,9 @@ public class JavaToolchainProvider extends ToolchainInfo { public boolean getJavacSupportsWorkers() { return javacSupportsWorkers; } + + /** Returns the global {@code java_plugin_configuration} data. */ + public ImmutableList<JavaPluginConfigurationProvider> pluginConfiguration() { + return pluginConfiguration; + } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java index a18128ba4a..d6961cbf1b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java @@ -201,6 +201,14 @@ public final class JavaToolchainRule implements RuleDefinition { attr("compatible_javacopts", STRING_LIST_DICT) .undocumented("internal") .value(ImmutableMap.<String, List<String>>of())) + /* <!-- #BLAZE_RULE(java_toolchain).ATTRIBUTE(plugin_configuration) --> + Java plugins that should be enabled for the specified package groups. + <!-- #END_BLAZE_RULE.ATTRIBUTE --> */ + .add( + attr("plugin_configuration", LABEL_LIST) + .cfg(HOST) + .allowedFileTypes() + .mandatoryNativeProviders(ImmutableList.of(JavaPluginConfigurationProvider.class))) .build(); } |