diff options
author | cushon <cushon@google.com> | 2018-07-25 21:21:03 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-07-25 21:22:26 -0700 |
commit | ca2977c2504df02ca2c8f8b6b2db75c6dad759ef (patch) | |
tree | 764c91feffa9e2627c175f4861d29fbaf89e1783 /src/main/java/com/google/devtools/build/lib/rules/java | |
parent | 75810d5910073aa7a1550bbd36544971f3c95ae1 (diff) |
Automated rollback of commit ce8f52060e2cf1e5a49a522039f0cba2a340f7e3.
PiperOrigin-RevId: 206102499
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/java')
10 files changed, 154 insertions, 264 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 d74c42b8c0..861ee0983a 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 @@ -46,6 +46,7 @@ import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.rules.cpp.LinkerInput; import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider.ClasspathType; +import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider.JavaPluginInfo; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.FileTypeSet; import com.google.devtools.build.lib.vfs.FileSystemUtils; @@ -97,7 +98,7 @@ public class JavaCommon { targetsTreatedAsDeps; private final ImmutableList<Artifact> sources; - private ImmutableList<JavaPluginInfoProvider> activePlugins = ImmutableList.of(); + private JavaPluginInfoProvider activePlugins = JavaPluginInfoProvider.empty(); private final RuleContext ruleContext; private final JavaSemantics semantics; @@ -742,33 +743,21 @@ public class JavaCommon { * 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. + * <p>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); - } - // Now get the plugin-libraries runtime classpath. - attributes.addProcessorPath(plugin.getProcessorClasspath()); - - // Add api-generating plugins - for (String name : plugin.getApiGeneratingProcessorClasses()) { - attributes.addApiGeneratingProcessorName(name); - } - attributes.addApiGeneratingProcessorPath(plugin.getApiGeneratingProcessorClasspath()); - } + JavaTargetAttributes.Builder attributes, JavaPluginInfoProvider activePlugins) { + attributes.addPlugin(activePlugins); } - private ImmutableList<JavaPluginInfoProvider> collectPlugins() { + private JavaPluginInfoProvider collectPlugins() { List<JavaPluginInfoProvider> result = new ArrayList<>(); Iterables.addAll(result, getPluginInfoProvidersForAttribute(ruleContext, ":java_plugins", Mode.HOST)); Iterables.addAll(result, getPluginInfoProvidersForAttribute(ruleContext, "plugins", Mode.HOST)); Iterables.addAll(result, getPluginInfoProvidersForAttribute(ruleContext, "deps", Mode.TARGET)); - return ImmutableList.copyOf(result); + return JavaPluginInfoProvider.merge(result); } private static Iterable<JavaPluginInfoProvider> getPluginInfoProvidersForAttribute( @@ -781,23 +770,12 @@ public class JavaCommon { } JavaPluginInfoProvider getJavaPluginInfoProvider(RuleContext ruleContext) { - ImmutableSet<String> processorClasses = getProcessorClasses(ruleContext); + NestedSet<String> processorClasses = + NestedSetBuilder.wrap(Order.NAIVE_LINK_ORDER, 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); + return JavaPluginInfoProvider.create( + JavaPluginInfo.create(processorClasses, processorClasspath), + ruleContext.attributes().get("generates_api", Type.BOOLEAN)); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java index 388c55efb4..db303aecf0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompilationHelper.java @@ -229,8 +229,7 @@ public final class JavaCompilationHelper { builder.setSourceGenDirectory(sourceGenDir(classJar)); builder.setTempDirectory(tempDir(classJar)); builder.setClassDirectory(classDir(classJar)); - builder.setProcessorPaths(attributes.getProcessorPath()); - builder.addProcessorNames(attributes.getProcessorNames()); + builder.setPlugins(attributes.plugins().plugins()); builder.setStrictJavaDeps(attributes.getStrictJavaDeps()); builder.setFixDepsTool(getJavaConfiguration().getFixDepsTool()); builder.setDirectJars(attributes.getDirectJars()); @@ -405,8 +404,7 @@ public final class JavaCompilationHelper { ImmutableList.copyOf(Iterables.concat(getBootclasspathOrDefault(), getExtdirInputs()))); // only run API-generating annotation processors during header compilation - builder.setProcessorPaths(attributes.getApiGeneratingProcessorPath()); - builder.addProcessorNames(attributes.getApiGeneratingProcessorNames()); + builder.setPlugins(attributes.plugins().apiGeneratingPlugins()); builder.setJavacOpts(getJavacOpts()); builder.setTempDirectory(tempDir(headerJar)); builder.setOutputJar(headerJar); @@ -459,7 +457,10 @@ public final class JavaCompilationHelper { */ public boolean usesAnnotationProcessing() { JavaTargetAttributes attributes = getAttributes(); - return getJavacOpts().contains("-processor") || !attributes.getProcessorNames().isEmpty(); + return getJavacOpts().contains("-processor") + // The target may have a processorpath even if no annotation processors are enabled, + // so check for processor names. + || !attributes.plugins().plugins().processorClasses().isEmpty(); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java index cdca40369d..dc960d7b0d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCompileAction.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.java; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; import static java.nio.charset.StandardCharsets.ISO_8859_1; import com.google.common.annotations.VisibleForTesting; @@ -56,6 +57,7 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; import com.google.devtools.build.lib.rules.java.JavaConfiguration.JavaClasspathMode; +import com.google.devtools.build.lib.rules.java.JavaPluginInfoProvider.JavaPluginInfo; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.util.LazyString; @@ -115,10 +117,8 @@ public final class JavaCompileAction extends SpawnAction { /** The list of classpath entries to search for annotation processors. */ private final NestedSet<Artifact> processorPath; - /** - * The list of annotation processor classes to run. - */ - private final ImmutableList<String> processorNames; + /** The list of annotation processor classes to run. */ + private final NestedSet<String> processorNames; /** Set of additional Java source files to compile. */ private final ImmutableList<Artifact> sourceJars; @@ -189,7 +189,7 @@ public final class JavaCompileAction extends SpawnAction { ImmutableList<Artifact> sourcePathEntries, ImmutableList<Artifact> extdirInputs, NestedSet<Artifact> processorPath, - List<String> processorNames, + NestedSet<String> processorNames, Collection<Artifact> sourceJars, ImmutableSet<Artifact> sourceFiles, List<String> javacOpts, @@ -226,7 +226,7 @@ public final class JavaCompileAction extends SpawnAction { this.sourcePathEntries = ImmutableList.copyOf(sourcePathEntries); this.extdirInputs = extdirInputs; this.processorPath = processorPath; - this.processorNames = ImmutableList.copyOf(processorNames); + this.processorNames = processorNames; this.sourceJars = ImmutableList.copyOf(sourceJars); this.sourceFiles = sourceFiles; this.javacOpts = ImmutableList.copyOf(javacOpts); @@ -318,7 +318,7 @@ public final class JavaCompileAction extends SpawnAction { */ @VisibleForTesting public List<String> getProcessorNames() { - return processorNames; + return processorNames.toList(); } /** @@ -456,8 +456,7 @@ public final class JavaCompileAction extends SpawnAction { private PathFragment sourceGenDirectory; private PathFragment tempDirectory; private PathFragment classDirectory; - private NestedSet<Artifact> processorPath = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); - private final List<String> processorNames = new ArrayList<>(); + private JavaPluginInfo plugins = JavaPluginInfo.empty(); private Label targetLabel; @Nullable private String injectingRuleKind; @@ -572,7 +571,7 @@ public final class JavaCompileAction extends SpawnAction { NestedSetBuilder.<Artifact>stableOrder() .addTransitive(classpathEntries) .addTransitive(compileTimeDependencyArtifacts) - .addTransitive(processorPath) + .addTransitive(plugins.processorClasspath()) .addAll(sourceJars) .addAll(sourceFiles) .addAll(javabaseInputs) @@ -633,8 +632,8 @@ public final class JavaCompileAction extends SpawnAction { bootclasspathEntries, sourcePathEntries, extdirInputs, - processorPath, - processorNames, + plugins.processorClasspath(), + plugins.processorClasses(), sourceJars, sourceFiles, internedJcopts, @@ -685,12 +684,8 @@ public final class JavaCompileAction extends SpawnAction { if (!sourcePathEntries.isEmpty()) { result.addExecPaths("--sourcepath", sourcePathEntries); } - if (!processorPath.isEmpty()) { - result.addExecPaths("--processorpath", processorPath); - } - if (!processorNames.isEmpty()) { - result.addAll("--processors", ImmutableList.copyOf(processorNames)); - } + result.addExecPaths("--processorpath", plugins.processorClasspath()); + result.addAll("--processors", plugins.processorClasses()); if (!sourceJars.isEmpty()) { result.addExecPaths("--source_jars", ImmutableList.copyOf(sourceJars)); } @@ -776,12 +771,12 @@ public final class JavaCompileAction extends SpawnAction { } private String getProcessorNames() { - if (processorNames.isEmpty()) { + if (plugins.processorClasses().isEmpty()) { return ""; } StringBuilder sb = new StringBuilder(); List<String> shortNames = new ArrayList<>(); - for (String name : processorNames) { + for (String name : plugins.processorClasses()) { // Annotation processor names are qualified class names. Omit the package part for the // progress message, e.g. `com.google.Foo` -> `Foo`. int idx = name.lastIndexOf('.'); @@ -953,13 +948,10 @@ public final class JavaCompileAction extends SpawnAction { return this; } - public Builder setProcessorPaths(NestedSet<Artifact> processorPaths) { - this.processorPath = processorPaths; - return this; - } - - public Builder addProcessorNames(Collection<String> processorNames) { - this.processorNames.addAll(processorNames); + public Builder setPlugins(JavaPluginInfo plugins) { + checkNotNull(plugins, "plugins must not be null"); + checkState(this.plugins.isEmpty()); + this.plugins = plugins; return this; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java index c5923776c5..b748dbb96a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaGenJarsProvider.java @@ -22,9 +22,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skylarkbuildapi.java.JavaAnnotationProcessingApi; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Set; import javax.annotation.Nullable; /** The collection of gen jars from the transitive closure. */ @@ -49,7 +46,7 @@ public final class JavaGenJarsProvider boolean usesAnnotationProcessing, @Nullable Artifact genClassJar, @Nullable Artifact genSourceJar, - List<JavaPluginInfoProvider> plugins, + JavaPluginInfoProvider plugins, Iterable<JavaGenJarsProvider> transitiveJavaGenJars) { NestedSetBuilder<Artifact> classJarsBuilder = NestedSetBuilder.stableOrder(); NestedSetBuilder<Artifact> sourceJarsBuilder = NestedSetBuilder.stableOrder(); @@ -64,20 +61,12 @@ public final class JavaGenJarsProvider classJarsBuilder.addTransitive(dep.getTransitiveGenClassJars()); sourceJarsBuilder.addTransitive(dep.getTransitiveGenSourceJars()); } - - NestedSetBuilder<Artifact> processorClasspathsBuilder = NestedSetBuilder.naiveLinkOrder(); - Set<String> processorNames = new LinkedHashSet<>(); - for (JavaPluginInfoProvider plugin : plugins) { - processorClasspathsBuilder.addTransitive(plugin.getProcessorClasspath()); - processorNames.addAll(plugin.getProcessorClasses()); - } - return new JavaGenJarsProvider( usesAnnotationProcessing, genClassJar, genSourceJar, - processorClasspathsBuilder.build(), - ImmutableList.copyOf(processorNames), + plugins.plugins().processorClasspath(), + ImmutableList.copyOf(plugins.plugins().processorClasses().toList()), classJarsBuilder.build(), sourceJarsBuilder.build()); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java index 7f6436f8c9..5d7d66fd0e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaHeaderCompileAction.java @@ -52,6 +52,7 @@ import com.google.devtools.build.lib.cmdline.Label; 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.rules.java.JavaPluginInfoProvider.JavaPluginInfo; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.LazyString; @@ -211,8 +212,7 @@ public class JavaHeaderCompileAction extends SpawnAction { private NestedSet<Artifact> compileTimeDependencyArtifacts = NestedSetBuilder.emptySet(Order.STABLE_ORDER); private ImmutableList<String> javacOpts; - private NestedSet<Artifact> processorPath = NestedSetBuilder.emptySet(Order.STABLE_ORDER); - private final List<String> processorNames = new ArrayList<>(); + private JavaPluginInfo plugins = JavaPluginInfo.empty(); private NestedSet<Artifact> additionalInputs = NestedSetBuilder.emptySet(Order.STABLE_ORDER); private Artifact javacJar; @@ -285,16 +285,10 @@ public class JavaHeaderCompileAction extends SpawnAction { } /** Sets the annotation processors classpath entries. */ - public Builder setProcessorPaths(NestedSet<Artifact> processorPaths) { - checkNotNull(processorPaths, "processorPaths must not be null"); - this.processorPath = processorPaths; - return this; - } - - /** Sets the fully-qualified class names of annotation processors to run. */ - public Builder addProcessorNames(Collection<String> processorNames) { - checkNotNull(processorNames, "processorNames must not be null"); - this.processorNames.addAll(processorNames); + public Builder setPlugins(JavaPluginInfo plugins) { + checkNotNull(plugins, "plugins must not be null"); + checkState(this.plugins.isEmpty()); + this.plugins = plugins; return this; } @@ -361,8 +355,6 @@ public class JavaHeaderCompileAction extends SpawnAction { checkNotNull( compileTimeDependencyArtifacts, "compileTimeDependencyArtifacts must not be null"); checkNotNull(javacOpts, "javacOpts must not be null"); - checkNotNull(processorPath, "processorPath must not be null"); - checkNotNull(processorNames, "processorNames must not be null"); // Invariant: if strictJavaDeps is OFF, then directJars and // dependencyArtifacts are ignored @@ -373,7 +365,7 @@ public class JavaHeaderCompileAction extends SpawnAction { // The compilation uses API-generating annotation processors and has to fall back to // javac-turbine. - boolean requiresAnnotationProcessing = !processorNames.isEmpty(); + boolean requiresAnnotationProcessing = !plugins.isEmpty(); NestedSet<Artifact> tools = NestedSetBuilder.<Artifact>stableOrder() @@ -444,7 +436,7 @@ public class JavaHeaderCompileAction extends SpawnAction { NestedSetBuilder.<Artifact>stableOrder() .addTransitive(baseInputs) .addTransitive(classpathEntries) - .addTransitive(processorPath) + .addTransitive(plugins.processorClasspath()) .addTransitive(compileTimeDependencyArtifacts); final CommandLines commandLines; @@ -532,7 +524,7 @@ public class JavaHeaderCompileAction extends SpawnAction { private LazyString getProgressMessageWithAnnotationProcessors() { List<String> shortNames = new ArrayList<>(); - for (String name : processorNames) { + for (String name : plugins.processorClasses()) { shortNames.add(name.substring(name.lastIndexOf('.') + 1)); } String tail = " and running annotation processors (" + Joiner.on(", ").join(shortNames) + ")"; @@ -619,12 +611,8 @@ public class JavaHeaderCompileAction extends SpawnAction { private CommandLine transitiveCommandLine() { CustomCommandLine.Builder result = CustomCommandLine.builder(); baseCommandLine(result, classpathEntries); - if (!processorNames.isEmpty()) { - result.addAll("--processors", ImmutableList.copyOf(processorNames)); - } - if (!processorPath.isEmpty()) { - result.addExecPaths("--processorpath", processorPath); - } + result.addAll("--processors", plugins.processorClasses()); + result.addExecPaths("--processorpath", plugins.processorClasspath()); if (strictJavaDeps != BuildConfiguration.StrictDepsMode.OFF) { result.addExecPaths("--direct_dependencies", directJars); if (!compileTimeDependencyArtifacts.isEmpty()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java index 0bab58e1ec..560c02d0eb 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java @@ -20,6 +20,7 @@ import static com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvid import static java.util.stream.Stream.concat; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionRegistry; import com.google.devtools.build.lib.actions.Artifact; @@ -466,8 +467,11 @@ final class JavaInfoBuildHelper { helper.addAllExports(exportsCompilationArgsProviders); helper.setCompilationStrictDepsMode(getStrictDepsMode(strictDepsMode.toUpperCase())); - helper.addAllPlugins(JavaInfo.fetchProvidersFromList(plugins, JavaPluginInfoProvider.class)); - helper.addAllPlugins(JavaInfo.fetchProvidersFromList(deps, JavaPluginInfoProvider.class)); + helper.setPlugins( + JavaPluginInfoProvider.merge( + Iterables.concat( + JavaInfo.fetchProvidersFromList(plugins, JavaPluginInfoProvider.class), + JavaInfo.fetchProvidersFromList(deps, JavaPluginInfoProvider.class)))); helper.setNeverlink(neverlink); JavaRuleOutputJarsProvider.Builder outputJarsBuilder = JavaRuleOutputJarsProvider.builder(); 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 2363803e69..fe24d8c65d 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 @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.java; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Preconditions.checkState; import static com.google.devtools.build.lib.analysis.config.BuildConfiguration.StrictDepsMode.OFF; import static com.google.devtools.build.lib.rules.java.JavaCommon.collectJavaCompilationArgs; @@ -52,7 +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 JavaPluginInfoProvider plugins = JavaPluginInfoProvider.empty(); private ImmutableList<String> javacOpts = ImmutableList.of(); private ImmutableList<Artifact> sourcePathEntries = ImmutableList.of(); private StrictDepsMode strictDepsMode = StrictDepsMode.OFF; @@ -131,8 +132,10 @@ public final class JavaLibraryHelper { return this; } - public JavaLibraryHelper addAllPlugins(Iterable<JavaPluginInfoProvider> providers) { - Iterables.addAll(plugins, providers); + public JavaLibraryHelper setPlugins(JavaPluginInfoProvider plugins) { + checkNotNull(plugins, "plugins must not be null"); + checkState(this.plugins.isEmpty()); + this.plugins = plugins; return this; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java index 59ed632abc..48241d4ccf 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPluginInfoProvider.java @@ -14,76 +14,93 @@ package com.google.devtools.build.lib.rules.java; -import com.google.common.collect.ImmutableSet; +import com.google.auto.value.AutoValue; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; 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.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import java.util.ArrayList; +import java.util.List; /** Provider for users of Java plugins. */ @AutoCodec @Immutable -public final class JavaPluginInfoProvider implements TransitiveInfoProvider { +@AutoValue +public abstract class JavaPluginInfoProvider implements TransitiveInfoProvider { - public static JavaPluginInfoProvider merge(Iterable<JavaPluginInfoProvider> providers) { - ImmutableSet.Builder<String> processorClasses = ImmutableSet.builder(); - NestedSetBuilder<Artifact> processorClasspath = NestedSetBuilder.naiveLinkOrder(); - ImmutableSet.Builder<String> apiGeneratingProcessorClasses = ImmutableSet.builder(); - NestedSetBuilder<Artifact> apiGeneratingProcessorClasspath = NestedSetBuilder.naiveLinkOrder(); + /** Information about a Java plugin, except for whether it generates API. */ + @AutoCodec + @Immutable + @AutoValue + public abstract static class JavaPluginInfo { - for (JavaPluginInfoProvider provider : providers) { - processorClasses.addAll(provider.getProcessorClasses()); - processorClasspath.addTransitive(provider.getProcessorClasspath()); - apiGeneratingProcessorClasses.addAll(provider.getApiGeneratingProcessorClasses()); - apiGeneratingProcessorClasspath.addTransitive(provider.getApiGeneratingProcessorClasspath()); + public static JavaPluginInfo create( + NestedSet<String> processorClasses, NestedSet<Artifact> processorClasspath) { + return new AutoValue_JavaPluginInfoProvider_JavaPluginInfo( + processorClasses, processorClasspath); } - return new JavaPluginInfoProvider( - processorClasses.build(), - processorClasspath.build(), - apiGeneratingProcessorClasses.build(), - apiGeneratingProcessorClasspath.build()); - } - private final ImmutableSet<String> processorClasses; - private final NestedSet<Artifact> processorClasspath; - private final ImmutableSet<String> apiGeneratingProcessorClasses; - private final NestedSet<Artifact> apiGeneratingProcessorClasspath; - - public JavaPluginInfoProvider( - ImmutableSet<String> processorClasses, - NestedSet<Artifact> processorClasspath, - ImmutableSet<String> apiGeneratingProcessorClasses, - NestedSet<Artifact> apiGeneratingProcessorClasspath) { - this.processorClasses = processorClasses; - this.processorClasspath = processorClasspath; - this.apiGeneratingProcessorClasses = apiGeneratingProcessorClasses; - this.apiGeneratingProcessorClasspath = apiGeneratingProcessorClasspath; + @AutoCodec.Instantiator + public static JavaPluginInfo empty() { + return create( + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER), + NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER)); + } + + public static JavaPluginInfo merge(Iterable<JavaPluginInfo> plugins) { + NestedSetBuilder<String> processorClasses = NestedSetBuilder.naiveLinkOrder(); + NestedSetBuilder<Artifact> processorClasspath = NestedSetBuilder.naiveLinkOrder(); + for (JavaPluginInfo plugin : plugins) { + processorClasses.addTransitive(plugin.processorClasses()); + processorClasspath.addTransitive(plugin.processorClasspath()); + } + return create(processorClasses.build(), processorClasspath.build()); + } + + /** + * Returns the class that should be passed to javac in order to run the annotation processor + * this class represents. + */ + public abstract NestedSet<String> processorClasses(); + + /** Returns the artifacts to add to the runtime classpath for this plugin. */ + public abstract NestedSet<Artifact> processorClasspath(); + + public boolean isEmpty() { + return processorClasses().isEmpty() && processorClasspath().isEmpty(); + } } - /** - * Returns the class that should be passed to javac in order - * to run the annotation processor this class represents. - */ - public ImmutableSet<String> getProcessorClasses() { - return processorClasses; + public static JavaPluginInfoProvider merge(Iterable<JavaPluginInfoProvider> providers) { + List<JavaPluginInfo> plugins = new ArrayList<>(); + List<JavaPluginInfo> apiGeneratingPlugins = new ArrayList<>(); + for (JavaPluginInfoProvider provider : providers) { + plugins.add(provider.plugins()); + apiGeneratingPlugins.add(provider.apiGeneratingPlugins()); + } + return new AutoValue_JavaPluginInfoProvider( + JavaPluginInfo.merge(plugins), JavaPluginInfo.merge(apiGeneratingPlugins)); } - /** - * Returns the artifacts to add to the runtime classpath for this plugin. - */ - public NestedSet<Artifact> getProcessorClasspath() { - return processorClasspath; + public static JavaPluginInfoProvider create(JavaPluginInfo javaPluginInfo, Boolean generatesApi) { + return new AutoValue_JavaPluginInfoProvider( + javaPluginInfo, generatesApi ? javaPluginInfo : JavaPluginInfo.empty()); } - /** Returns the class names of API-generating annotation processors. */ - public ImmutableSet<String> getApiGeneratingProcessorClasses() { - return apiGeneratingProcessorClasses; + @AutoCodec.Instantiator + public static JavaPluginInfoProvider empty() { + return new AutoValue_JavaPluginInfoProvider(JavaPluginInfo.empty(), JavaPluginInfo.empty()); } - /** Returns the artifacts to add to the runtime classpath of the API-generating processors. */ - public NestedSet<Artifact> getApiGeneratingProcessorClasspath() { - return apiGeneratingProcessorClasspath; + public abstract JavaPluginInfo plugins(); + + public abstract JavaPluginInfo apiGeneratingPlugins(); + + public boolean isEmpty() { + // apiGeneratingPlugins is a subset of plugins, so checking if plugins is empty is sufficient + return plugins().isEmpty(); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceInfoProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceInfoProvider.java index f29e90e306..ea09db174c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceInfoProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSourceInfoProvider.java @@ -18,9 +18,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; -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.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; @@ -37,8 +34,6 @@ public final class JavaSourceInfoProvider implements TransitiveInfoProvider { private final Collection<Artifact> jarFiles; private final Collection<Artifact> sourceJarsForJarFiles; private final Map<PathFragment, Artifact> resources; - private final Collection<String> processorNames; - private final NestedSet<Artifact> processorPath; @VisibleForSerialization JavaSourceInfoProvider( @@ -46,16 +41,12 @@ public final class JavaSourceInfoProvider implements TransitiveInfoProvider { Collection<Artifact> sourceJars, Collection<Artifact> jarFiles, Collection<Artifact> sourceJarsForJarFiles, - Map<PathFragment, Artifact> resources, - Collection<String> processorNames, - NestedSet<Artifact> processorPath) { + Map<PathFragment, Artifact> resources) { this.sourceFiles = sourceFiles; this.sourceJars = sourceJars; this.jarFiles = jarFiles; this.sourceJarsForJarFiles = sourceJarsForJarFiles; this.resources = resources; - this.processorNames = processorNames; - this.processorPath = processorPath; } /** Gets the original Java source files provided as inputs to this rule. */ @@ -102,16 +93,6 @@ public final class JavaSourceInfoProvider implements TransitiveInfoProvider { return resources; } - /** Gets the names of the annotation processors which operate on this rule's sources. */ - public Collection<String> getProcessorNames() { - return processorNames; - } - - /** Gets the classpath for the annotation processors which operate on this rule's sources. */ - public NestedSet<Artifact> getProcessorPath() { - return processorPath; - } - /** * Constructs a JavaSourceInfoProvider using the sources in the given JavaTargetAttributes. * @@ -124,8 +105,6 @@ public final class JavaSourceInfoProvider implements TransitiveInfoProvider { .setSourceFiles(attributes.getSourceFiles()) .setSourceJars(attributes.getSourceJars()) .setResources(attributes.getResources()) - .setProcessorNames(attributes.getProcessorNames()) - .setProcessorPath(attributes.getProcessorPath()) .build(); } @@ -136,8 +115,6 @@ public final class JavaSourceInfoProvider implements TransitiveInfoProvider { private Collection<Artifact> jarFiles = ImmutableList.<Artifact>of(); private Collection<Artifact> sourceJarsForJarFiles = ImmutableList.<Artifact>of(); private Map<PathFragment, Artifact> resources = ImmutableMap.<PathFragment, Artifact>of(); - private Collection<String> processorNames = ImmutableList.<String>of(); - private NestedSet<Artifact> processorPath = NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER); /** Sets the source files included as part of the sources of this rule. */ public Builder setSourceFiles(Collection<Artifact> sourceFiles) { @@ -180,29 +157,10 @@ public final class JavaSourceInfoProvider implements TransitiveInfoProvider { return this; } - /** Sets the names of the annotation processors used by this rule. */ - public Builder setProcessorNames(Collection<String> processorNames) { - this.processorNames = Preconditions.checkNotNull(processorNames); - return this; - } - - /** Sets the classpath used by this rule for annotation processing. */ - public Builder setProcessorPath(NestedSet<Artifact> processorPath) { - Preconditions.checkNotNull(processorPath); - this.processorPath = processorPath; - return this; - } - /** Constructs the JavaSourceInfoProvider from the provided Java sources. */ public JavaSourceInfoProvider build() { return new JavaSourceInfoProvider( - sourceFiles, - sourceJars, - jarFiles, - sourceJarsForJarFiles, - resources, - processorNames, - processorPath); + sourceFiles, sourceJars, jarFiles, sourceJarsForJarFiles, resources); } } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java index 9f51626b54..d75c9dad76 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaTargetAttributes.java @@ -70,14 +70,7 @@ public class JavaTargetAttributes { private final List<Artifact> sourcePath = new ArrayList<>(); private final List<Artifact> nativeLibraries = new ArrayList<>(); - private final NestedSetBuilder<Artifact> processorPath = NestedSetBuilder.naiveLinkOrder(); - // Classpath directories can't be represented as artifacts (TreeArtifact isn't appropriate - // here since all we need is a path string to apply to the command line). - private final Set<String> processorNames = new LinkedHashSet<>(); - - private final NestedSetBuilder<Artifact> apiGeneratingProcessorPath = - NestedSetBuilder.naiveLinkOrder(); - private final Set<String> apiGeneratingProcessorNames = new LinkedHashSet<>(); + private JavaPluginInfoProvider plugins = JavaPluginInfoProvider.empty(); private final Map<PathFragment, Artifact> resources = new LinkedHashMap<>(); private final NestedSetBuilder<Artifact> resourceJars = NestedSetBuilder.stableOrder(); @@ -304,27 +297,10 @@ public class JavaTargetAttributes { return this; } - public Builder addProcessorName(String processor) { - Preconditions.checkArgument(!built); - processorNames.add(processor); - return this; - } - - public Builder addProcessorPath(NestedSet<Artifact> jars) { - Preconditions.checkArgument(!built); - processorPath.addTransitive(jars); - return this; - } - - public Builder addApiGeneratingProcessorName(String processor) { - Preconditions.checkArgument(!built); - apiGeneratingProcessorNames.add(processor); - return this; - } - - public Builder addApiGeneratingProcessorPath(NestedSet<Artifact> jars) { + public Builder addPlugin(JavaPluginInfoProvider plugins) { Preconditions.checkArgument(!built); - apiGeneratingProcessorPath.addTransitive(jars); + Preconditions.checkArgument(this.plugins.isEmpty()); + this.plugins = plugins; return this; } @@ -358,10 +334,7 @@ public class JavaTargetAttributes { bootClassPath, sourcePath, nativeLibraries, - processorPath.build(), - processorNames, - apiGeneratingProcessorPath.build(), - apiGeneratingProcessorNames, + plugins, resources, resourceJars.build(), messages, @@ -391,19 +364,28 @@ public class JavaTargetAttributes { return !sourceFiles.isEmpty() || !sourceJars.isEmpty(); } - /** @deprecated prefer {@link JavaTargetAttributes#hasSourceFiles} */ + /** + * @deprecated prefer to use a built {@link JavaTargetAttributes} instead of accessing mutable + * state in the {@link Builder}. + */ @Deprecated public boolean hasSourceFiles() { return !sourceFiles.isEmpty(); } - /** @deprecated prefer {@link JavaTargetAttributes#getInstrumentationMetadata} */ + /** + * @deprecated prefer to use a built {@link JavaTargetAttributes} instead of accessing mutable + * state in the {@link Builder}. + */ @Deprecated public List<Artifact> getInstrumentationMetadata() { return instrumentationMetadata; } - /** @deprecated prefer {@link JavaTargetAttributes#hasSourceJars} */ + /** + * @deprecated prefer to use a built {@link JavaTargetAttributes} instead of accessing mutable + * state in the {@link Builder}. + */ @Deprecated public boolean hasSourceJars() { return !sourceJars.isEmpty(); @@ -423,11 +405,7 @@ public class JavaTargetAttributes { private final ImmutableList<Artifact> sourcePath; private final ImmutableList<Artifact> nativeLibraries; - private final NestedSet<Artifact> processorPath; - private final ImmutableSet<String> processorNames; - - private final NestedSet<Artifact> apiGeneratingProcessorPath; - private final ImmutableSet<String> apiGeneratingProcessorNames; + private final JavaPluginInfoProvider plugins; private final ImmutableMap<PathFragment, Artifact> resources; private final NestedSet<Artifact> resourceJars; @@ -455,10 +433,7 @@ public class JavaTargetAttributes { List<Artifact> bootClassPath, List<Artifact> sourcePath, List<Artifact> nativeLibraries, - NestedSet<Artifact> processorPath, - Set<String> processorNames, - NestedSet<Artifact> apiGeneratingProcessorPath, - Set<String> apiGeneratingProcessorNames, + JavaPluginInfoProvider plugins, Map<PathFragment, Artifact> resources, NestedSet<Artifact> resourceJars, List<Artifact> messages, @@ -482,10 +457,7 @@ public class JavaTargetAttributes { this.bootClassPath = ImmutableList.copyOf(bootClassPath); this.sourcePath = ImmutableList.copyOf(sourcePath); this.nativeLibraries = ImmutableList.copyOf(nativeLibraries); - this.processorPath = processorPath; - this.processorNames = ImmutableSet.copyOf(processorNames); - this.apiGeneratingProcessorPath = apiGeneratingProcessorPath; - this.apiGeneratingProcessorNames = ImmutableSet.copyOf(apiGeneratingProcessorNames); + this.plugins = plugins; this.resources = ImmutableMap.copyOf(resources); this.resourceJars = resourceJars; this.messages = ImmutableList.copyOf(messages); @@ -589,16 +561,8 @@ public class JavaTargetAttributes { return sourcePath; } - public NestedSet<Artifact> getProcessorPath() { - return processorPath; - } - - public NestedSet<Artifact> getApiGeneratingProcessorPath() { - return apiGeneratingProcessorPath; - } - - public ImmutableSet<String> getApiGeneratingProcessorNames() { - return apiGeneratingProcessorNames; + public JavaPluginInfoProvider plugins() { + return plugins; } public ImmutableSet<Artifact> getSourceFiles() { @@ -609,10 +573,6 @@ public class JavaTargetAttributes { return nativeLibraries; } - public Collection<String> getProcessorNames() { - return processorNames; - } - public boolean hasSources() { return !sourceFiles.isEmpty() || !sourceJars.isEmpty(); } |