aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
authorGravatar cushon <cushon@google.com>2017-11-29 22:22:30 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2017-11-29 22:24:35 -0800
commitc7633e582e49f8a4c47c8ea0060ac3c9b0b6d71b (patch)
tree935879ae2988ef4d6b03ce082b4b2af24d6d5316 /src/main/java/com/google/devtools/build
parent89ec374424a585c4923df942c848c6a88ddd9db7 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD3
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfiguration.java49
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationProvider.java52
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginConfigurationRule.java100
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainProvider.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainRule.java8
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();
}