aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar elenairina <elenairina@google.com>2017-06-30 16:43:23 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-07-03 09:05:59 +0200
commitc00ec98dc27893ee8cc688ae8b5bf60bdb56dfaa (patch)
treeb436d7d20edbf412a6b0d86fb80d15721bc8b45a /src/main/java/com/google/devtools
parented3ba0325e8a41eccf2f9c5e2bf95a2572d9394d (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java46
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java49
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaProvider.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java34
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();
}