diff options
author | Googler <noreply@google.com> | 2016-07-20 17:46:36 +0000 |
---|---|---|
committer | John Cater <jcater@google.com> | 2016-07-20 19:54:26 +0000 |
commit | ff8ea95fb2e4c77104263bebbf21c7e4e7a00d00 (patch) | |
tree | 9086db3b3867b3e9c528565e2a2fc33b7608040a | |
parent | 1c4ae47d2d1df697e1ac074b084b124da6ce5405 (diff) |
Description redacted.
--
MOS_MIGRATED_REVID=127962492
9 files changed, 170 insertions, 168 deletions
diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD index 8dc934e8ac..c9c6b24983 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/BUILD @@ -21,17 +21,11 @@ java_library( java_library( name = "javac", - srcs = glob( - [ - "javac/*.java", - ], - exclude = [ - "javac/JavacOptions.java", - ], - ), + srcs = glob([ + "javac/*.java", + ]), deps = [ ":invalid_command_line_exception", - ":javac_options", "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins", "//third_party:guava", "//third_party:jsr305", @@ -51,7 +45,6 @@ java_library( deps = [ ":invalid_command_line_exception", ":javac", - ":javac_options", "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar/jarhelper", "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins", "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins:classloader", @@ -76,13 +69,8 @@ java_library( srcs = [ "javac/JavacOptions.java", ], - visibility = [ - "//java/com/google/devtools/build/buildjar:__pkg__", - "//src/java_tools/buildjar/java/com/google/devtools/build/java/bazel:__pkg__", - "//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac:__pkg__", - ], + visibility = ["//java/com/google/devtools/build/buildjar:__pkg__"], deps = [ - "//third_party:auto_value", "//third_party:guava", ], ) @@ -103,7 +91,6 @@ load("//tools/build_rules:java_rules_skylark.bzl", "bootstrap_java_library", "bo bootstrap_java_library( name = "skylark-deps", jars = [ - "//third_party:auto_value-jars", "//third_party:error_prone-jars", "//third_party:guava-jars", "//third_party:jsr305-jars", diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/JavacOptions.java b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/JavacOptions.java index 4f7e749c7e..e4452a36a0 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/JavacOptions.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/JavacOptions.java @@ -14,85 +14,45 @@ package com.google.devtools.build.buildjar.javac; -import com.google.auto.value.AutoValue; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; + import java.util.ArrayList; -import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; /** - * Preprocess javac -Xlint options. We also need to make the different versions of javac treat - * -Xlint options uniformly. + * Preprocess javac -Xlint options. We + * also need to make the different versions of javac treat -Xlint options + * uniformly. + * + * <p>Some versions of javac now process the -Xlint options without allowing + * later options to override earlier ones on the command line. For example, + * {@code -Xlint:All -Xlint:None} results in all warnings being enabled. * - * <p>Some versions of javac now process the -Xlint options without allowing later options to - * override earlier ones on the command line. For example, {@code -Xlint:All -Xlint:None} results in - * all warnings being enabled. + * <p>This class preprocesses the -Xlint options within the javac options to + * achieve a command line that is sensitive to ordering. That is, with this + * preprocessing step, {@code -Xlint:all -Xlint:none} results in no + * warnings being enabled. * - * <p>This class preprocesses the -Xlint options within the javac options to achieve a command line - * that is sensitive to ordering. That is, with this preprocessing step, {@code -Xlint:all - * -Xlint:none} results in no warnings being enabled. + * <p>TODO(bazel-team): Convince the current javac owners that the javac options + * need to behave the way this class behaves. :-) */ public final class JavacOptions { - /** Returns an immutable list containing all the non-Bazel specific Javac flags. */ - public static ImmutableList<String> removeBazelSpecificFlags(String[] javacopts) { - return removeBazelSpecificFlags(Arrays.asList(javacopts)); - } - - /** Returns an immutable list containing all the non-Bazel specific Javac flags. */ - public static ImmutableList<String> removeBazelSpecificFlags(Iterable<String> javacopts) { - return filterJavacopts(javacopts).standardJavacopts(); - } - - /** A collection of javac flags, divided into Bazel-specific and standard options. */ - @AutoValue - public abstract static class FilteredJavacopts { - /** Bazel-specific javac flags, e.g. Error Prone's -Xep: flags. */ - public abstract ImmutableList<String> bazelJavacopts(); - - /** Standard javac flags. */ - public abstract ImmutableList<String> standardJavacopts(); - - /** Creates a {@link FilteredJavacopts}. */ - public static FilteredJavacopts create( - ImmutableList<String> bazelJavacopts, ImmutableList<String> standardJavacopts) { - return new AutoValue_JavacOptions_FilteredJavacopts(bazelJavacopts, standardJavacopts); - } - } - - /** Filters a list of javac flags into Bazel-specific and standard flags. */ - public static FilteredJavacopts filterJavacopts(Iterable<String> javacopts) { - ImmutableList.Builder<String> bazelJavacopts = ImmutableList.builder(); - ImmutableList.Builder<String> standardJavacopts = ImmutableList.builder(); - for (String opt : javacopts) { - if (isBazelSpecificFlag(opt)) { - bazelJavacopts.add(opt); - } else { - standardJavacopts.add(opt); - } - } - return FilteredJavacopts.create(bazelJavacopts.build(), standardJavacopts.build()); - } - - private static boolean isBazelSpecificFlag(String opt) { - return opt.startsWith("-Werror:") || opt.startsWith("-Xep"); - } - private static final XlintOptionNormalizer XLINT_OPTION_NORMALIZER = new XlintOptionNormalizer(); /** * Interface to define an option normalizer. For instance, to group all -Xlint: option into one * place. - * - * <p>All normalizers used by the JavacOptions class will be started by calling the {@link - * #start()} method when starting the parsing of a list of option. For each option, the first - * option normalized whose {@link #processOption(String)} method returns true stops its parsing - * and the option is supposed to be added at the end to the normalized list of option with the - * {@link #normalize(List)} method. Options not handled by a normalizer will be returned as such - * in the normalized option list. + * + * <p>All normalizers used by the JavacOptions class will be started by calling the + * {@link #start()} method when starting the parsing of a list of option. For each option, the + * first option normalized whose {@link #processOption(String)} method returns true stops its + * parsing and the option is supposed to be added at the end to the normalized list of option with + * the {@link #normalize(List)} method. Options not handled by a normalizer will be returned as + * such in the normalized option list. */ public static interface JavacOptionNormalizer { /** Resets the state of the normalizer to start a new option parsing. */ diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BUILD index 3ede677953..5b2b0b7955 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BUILD +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BUILD @@ -91,11 +91,7 @@ java_library( name = "JavaBuilderConfig", srcs = ["JavaBuilderConfig.java"], data = ["@bazel_tools//tools/jdk:JavaBuilder_deploy.jar"], - deps = [ - ":javabuilder-javacopts-lib", - "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:javac_options", - "//third_party:guava", - ], + deps = [":javabuilder-javacopts-lib"], ) # Provides programmatic access to a bazel compatible javac. @@ -112,7 +108,6 @@ java_library( ":JavaBuilderConfig", ":JavaLangtools", ":JavacBootclasspath", - "//third_party:guava", ], ) diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BazelJavaCompiler.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BazelJavaCompiler.java index 206d0b66e1..6a4156ad9f 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BazelJavaCompiler.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/BazelJavaCompiler.java @@ -14,7 +14,6 @@ package com.google.devtools.build.java.bazel; -import com.google.common.collect.ImmutableList; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -24,7 +23,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.nio.charset.Charset; -import java.util.Collections; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Set; @@ -49,18 +49,27 @@ import javax.tools.StandardLocation; public class BazelJavaCompiler { // The default blessed javac options. - + private static final String DEFAULT_BOOTCLASSPATH = JavacBootclasspath.asString(); - private static final ImmutableList<String> DEFAULT_JAVACOPTS = - ImmutableList.<String>builder() - .addAll(JavaBuilderConfig.defaultJavacOpts()) - // The bootclasspath must be specified both via an invocation option and - // via fileManager.setLocation(PLATFORM_CLASS_PATH), to work around what - // appears to be a bug in jdk[6,8] javac. - .add("-bootclasspath") - .add(DEFAULT_BOOTCLASSPATH) - .build(); + private static final String[] DEFAULT_JAVACOPTS; + static { + List<String> defaultJavacopts = new ArrayList<>(); + for (String javacopt : JavaBuilderConfig.defaultJavacOpts()) { + if (javacopt.startsWith("-Xep")) { + // ignore Error Prone-specific flags accepted by JavaBuilder + continue; + } + defaultJavacopts.add(javacopt); + } + + // The bootclasspath must be specified both via an invocation option and + // via fileManager.setLocation(PLATFORM_CLASS_PATH), to work around what + // appears to be a bug in jdk[6,8] javac. + defaultJavacopts.addAll(Arrays.asList("-bootclasspath", DEFAULT_BOOTCLASSPATH)); + + DEFAULT_JAVACOPTS = defaultJavacopts.toArray(new String[defaultJavacopts.size()]); + } private static final Class<? extends JavaCompiler> JAVA_COMPILER_CLASS = getJavaCompilerClass(); @@ -100,10 +109,12 @@ public class BazelJavaCompiler { public static File getLangtoolsJar() { return JavaLangtools.file(); } - - /** Returns the default javacopts, including the blessed bootclasspath. */ + + /** + * Returns the default javacopts, including the blessed bootclasspath. + */ public static List<String> getDefaultJavacopts() { - return DEFAULT_JAVACOPTS; + return new ArrayList<>(Arrays.asList(DEFAULT_JAVACOPTS)); } /** @@ -175,62 +186,70 @@ public class BazelJavaCompiler { private static JavaCompiler newInstance(final JavaCompiler delegate) { // We forward most operations to the JavaCompiler implementation in langtools.jar. return new JavaCompiler() { - @Override - public CompilationTask getTask( - Writer out, - JavaFileManager fileManager, - DiagnosticListener<? super JavaFileObject> diagnosticListener, - Iterable<String> options, - Iterable<String> classes, - Iterable<? extends JavaFileObject> compilationUnits) { - // We prepend bazel's default javacopts to user javacopts, - // so that the user can override them. javac supports this - // "last option wins" style of option override. - ImmutableList.Builder<String> fullOptions = ImmutableList.builder(); - fullOptions.addAll(getDefaultJavacopts()); - if (options != null) { - fullOptions.addAll(options); + @Override + public CompilationTask getTask( + Writer out, + JavaFileManager fileManager, + DiagnosticListener<? super JavaFileObject> diagnosticListener, + Iterable<String> options, + Iterable<String> classes, + Iterable<? extends JavaFileObject> compilationUnits) { + // We prepend bazel's default javacopts to user javacopts, + // so that the user can override them. javac supports this + // "last option wins" style of option override. + List<String> fullOptions = getDefaultJavacopts(); + if (options != null) { + for (String option : options) { + fullOptions.add(option); + } + } + return delegate.getTask(out, + fileManager, + diagnosticListener, + fullOptions, + classes, + compilationUnits); } - return delegate.getTask( - out, fileManager, diagnosticListener, fullOptions.build(), classes, compilationUnits); - } - @Override - public StandardJavaFileManager getStandardFileManager( - DiagnosticListener<? super JavaFileObject> diagnosticListener, - Locale locale, - Charset charset) { - StandardJavaFileManager fileManager = - delegate.getStandardFileManager(diagnosticListener, locale, charset); - - try { - fileManager.setLocation( - StandardLocation.PLATFORM_CLASS_PATH, // bootclasspath - JavacBootclasspath.asFiles()); - } catch (IOException e) { - // Should never happen, according to javadocs for setLocation - throw new RuntimeException(e); + @Override + public StandardJavaFileManager getStandardFileManager( + DiagnosticListener<? super JavaFileObject> diagnosticListener, + Locale locale, + Charset charset) { + StandardJavaFileManager fileManager = delegate.getStandardFileManager( + diagnosticListener, + locale, + charset); + + try { + fileManager.setLocation( + StandardLocation.PLATFORM_CLASS_PATH, // bootclasspath + JavacBootclasspath.asFiles()); + } catch (IOException e) { + // Should never happen, according to javadocs for setLocation + throw new RuntimeException(e); + } + return fileManager; } - return fileManager; - } - @Override - public int run(InputStream in, OutputStream out, OutputStream err, String... arguments) { - // prepend bazel's default javacopts to user arguments - List<String> args = getDefaultJavacopts(); - Collections.addAll(args, arguments); - return delegate.run(in, out, err, args.toArray(new String[0])); - } + @Override + public int run(InputStream in, OutputStream out, OutputStream err, + String... arguments) { + // prepend bazel's default javacopts to user arguments + List<String> args = getDefaultJavacopts(); + args.addAll(Arrays.asList(arguments)); + return delegate.run(in, out, err, args.toArray(new String[0])); + } - @Override - public Set<SourceVersion> getSourceVersions() { - return delegate.getSourceVersions(); - } + @Override + public Set<SourceVersion> getSourceVersions() { + return delegate.getSourceVersions(); + } - @Override - public int isSupportedOption(String option) { - return delegate.isSupportedOption(option); - } - }; + @Override + public int isSupportedOption(String option) { + return delegate.isSupportedOption(option); + } + }; } } diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/JavaBuilderConfig.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/JavaBuilderConfig.java index c86291dd0b..511dfa584f 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/JavaBuilderConfig.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/bazel/JavaBuilderConfig.java @@ -14,18 +14,18 @@ package com.google.devtools.build.java.bazel; -import com.google.common.collect.ImmutableList; -import com.google.devtools.build.buildjar.javac.JavacOptions; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; -/** Utility class to provide Java-level access to the blessed JavaBuilder javacopts. */ +/** + * Utility class to provide java-level access to the blessed javabuilder javacopts. + */ public class JavaBuilderConfig { - - private static final ImmutableList<String> JAVACOPTS = - ImmutableList.copyOf( - JavacOptions.removeBazelSpecificFlags(JavaBuilderJavacOpts.DEFAULT_JAVACOPTS)); - + public static List<String> defaultJavacOpts() { - return JAVACOPTS; + List<String> result = new ArrayList<>(); + Collections.addAll(result, JavaBuilderJavacOpts.DEFAULT_JAVACOPTS); + return result; } } diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/BUILD b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/BUILD index 9ab49b9ca7..9e3e6cbeea 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/BUILD +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/BUILD @@ -14,7 +14,6 @@ java_library( ":javac_turbine_compiler", ":zip_output_file_manager", ":zip_util", - "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar:javac_options", "//src/java_tools/buildjar/java/com/google/devtools/build/buildjar/javac/plugins:dependency", "//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine:turbine_options", "//src/java_tools/buildjar/java/com/google/devtools/build/java/turbine:turbine_options_parser", diff --git a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java index 8959d3613b..b294bd2a3c 100644 --- a/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java +++ b/src/java_tools/buildjar/java/com/google/devtools/build/java/turbine/javac/JavacTurbine.java @@ -15,10 +15,10 @@ package com.google.devtools.build.java.turbine.javac; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.CharMatcher; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.devtools.build.buildjar.javac.JavacOptions; import com.google.devtools.build.buildjar.javac.plugins.dependency.DependencyModule; import com.google.devtools.build.buildjar.javac.plugins.dependency.DependencyModule.StrictJavaDeps; import com.google.devtools.build.buildjar.javac.plugins.dependency.StrictJavaDepsPlugin; @@ -119,7 +119,7 @@ public class JavacTurbine implements AutoCloseable { ImmutableList.Builder<String> argbuilder = ImmutableList.builder(); - argbuilder.addAll(JavacOptions.removeBazelSpecificFlags(turbineOptions.javacOpts())); + filterJavacopts(argbuilder, turbineOptions.javacOpts()); // Disable compilation of implicit source files. // This is insurance: the sourcepath is empty, so we don't expect implicit sources. @@ -321,6 +321,31 @@ public class JavacTurbine implements AutoCloseable { return result.build(); } + @VisibleForTesting + static void filterJavacopts( + ImmutableList.Builder<String> javacArgs, Iterable<String> defaultJavacopts) { + for (String opt : defaultJavacopts) { + + // TODO(cushon): temporary hack until 4149f08bcc8bd1318d4021cf372ec89240ee3dbb is released + opt = CharMatcher.is('\'').trimFrom(opt); + + if (isErrorProneFlag(opt)) { + // drop Error Prone's fake javacopts + continue; + } + javacArgs.add(opt); + } + } + + /** + * Returns true for flags that are specific to Error Prone. + * + * <p>WARNING: keep in sync with ErrorProneOptions#isSupportedOption + */ + static boolean isErrorProneFlag(String opt) { + return opt.startsWith("-Xep"); + } + /** Extra sources in srcjars to disk. */ private static List<String> extractSourceJars(TurbineOptions turbineOptions, Path tmpdir) throws IOException { diff --git a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java index fb5f6249de..0f20f16112 100644 --- a/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java +++ b/src/java_tools/buildjar/javatests/com/google/devtools/build/java/turbine/javac/JavacTurbineTest.java @@ -350,6 +350,29 @@ public class JavacTurbineTest { }; @Test + public void filterJavacopts() { + ImmutableList.Builder<String> output = ImmutableList.builder(); + JavacTurbine.filterJavacopts( + output, + Arrays.asList( + "-g", + "-source", + "6", + "-target", + "6", + "-Xlint:all", + "-source", + "7", + "-target", + "7", + "-Xep:GuardedBy:ERROR")); + assertThat(output.build()) + .containsExactly( + "-g", "-source", "6", "-target", "6", "-Xlint:all", "-source", "7", "-target", "7") + .inOrder(); + } + + @Test public void jdeps() throws Exception { Path libC = temp.newFile("libc.jar").toPath(); diff --git a/third_party/BUILD b/third_party/BUILD index bedcb021f5..87c45bfdb4 100644 --- a/third_party/BUILD +++ b/third_party/BUILD @@ -220,12 +220,6 @@ java_import( jars = ["auto/auto-value-1.2.jar"], ) -# For bootstrapping JavaBuilder -filegroup( - name = "auto_value-jars", - srcs = ["auto/auto-value-1.2.jar"], -) - java_library( name = "dagger", exported_plugins = [":dagger_plugin"], |