Update to errorprone 2.9.0, using -Xplugin to pass it to javac

The gwt.javac presetdef is now a macrodef, to allow for appending
instead of replacing the -Xplugin arguments and processorpath
references, and the output directory is created as-needed as part
of gwt.javac instead of requiring an extra call for it.

Change-Id: Id47397d70f11b9d11615232449bdac46ce0fe870
diff --git a/build_tools/doctool/build.xml b/build_tools/doctool/build.xml
index c8d5d79..abd3026 100644
--- a/build_tools/doctool/build.xml
+++ b/build_tools/doctool/build.xml
@@ -6,7 +6,6 @@
   <property.ensure name="java.tools.path" location="${java.home}/../lib/tools.jar" unless="build.host.ismac" message="Cannot find ${java.home}/../lib/tools.jar; please use a JDK when building doc rather than a JRE." />
 
   <target name="compile" description="Compiles this project">
-    <mkdir dir="${javac.out}" />
     <gwt.javac>
       <classpath>
         <pathelement location="${java.tools.path}" />
diff --git a/common.ant.xml b/common.ant.xml
index 9c19fa8..7c5d26e 100755
--- a/common.ant.xml
+++ b/common.ant.xml
@@ -1,4 +1,4 @@
-<project name="common" xmlns:if="ant:if">
+<project name="common" xmlns:if="ant:if" xmlns:unless="ant:unless">
   <!-- it's okay for this not to exist, but it gives a place to store
        personal property settings, if any, persistently.  For example, you
        might use it to set gwt.junit.testcase.includes to a narrower subset
@@ -66,6 +66,14 @@
   <property name="javac.target" value="8"/>
   <property name="javac.nowarn" value="true"/>
 
+  <!-- javac and errorprone instructions from https://errorprone.info/docs/installation#ant -->
+  <property name="errorprone.javac.jar" location="${gwt.tools.lib}/errorprone/javac-9+181-r4173-1.jar"/>
+  <path id="errorprone.processorpath.ref">
+    <pathelement location="${gwt.tools.lib}/errorprone/error_prone_core-2.9.0-with-dependencies.jar"/>
+    <pathelement location="${gwt.tools.lib}/errorprone/jFormatString-3.0.0.jar"/>
+    <pathelement location="${gwt.tools.lib}/errorprone/dataflow-errorprone-3.15.0.jar"/>
+  </path>
+
   <property name="junit.out" location="${project.build}/test"/>
   <property name="emma.dir" value="${gwt.tools.redist}/emma"/>
   <property name="emma.filter.exclude" value=""/>
@@ -147,13 +155,45 @@
     </ant>
   </presetdef>
 
-  <presetdef name="gwt.javac">
-    <javac srcdir="src" destdir="${javac.out}" debug="${javac.debug}"
-           debuglevel="${javac.debuglevel}" source="${javac.source}" target="${javac.target}"
-           nowarn="${javac.nowarn}" encoding="${javac.encoding}"
-           includeantruntime="false" fork="true" compiler="modern">
-    </javac>
-  </presetdef>
+  <macrodef name="gwt.javac">
+    <attribute name="srcdir" default="src" />
+    <attribute name="destdir" default="${javac.out}" />
+    <attribute name="source" default="${javac.source}" />
+    <attribute name="target" default="${javac.target}" />
+    <attribute name="excludes" default="" />
+    <attribute name="processorpath" default="" />
+    <attribute name="errorprone.args" default="" />
+    <element name="javaccontents" implicit="true" optional="true" />
+
+    <sequential>
+      <path id="mergedprocessorpath.ref">
+        <path refid="errorprone.processorpath.ref"/>
+        <path refid="@{processorpath}" unless:blank="@{processorpath}" />
+      </path>
+      <mkdir dir="@{destdir}"/>
+      <javac srcdir="@{srcdir}" sourcepath="@{srcdir}" destdir="@{destdir}" debug="${javac.debug}"
+             debuglevel="${javac.debuglevel}" source="@{source}" target="@{target}"
+             nowarn="${javac.nowarn}" encoding="${javac.encoding}" includeantruntime="false"
+             fork="true" compiler="modern" excludes="@{excludes}">
+        <compilerarg value="-J-Xbootclasspath/p:${errorprone.javac.jar}" if:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED" unless:true="${isJava8}"/>
+        <compilerarg value="-XDcompilePolicy=simple"/>
+        <compilerarg value="-processorpath"/>
+        <compilerarg pathref="mergedprocessorpath.ref"/>
+        <compilerarg value="-Xplugin:ErrorProne @{errorprone.args}" />
+        <javaccontents />
+      </javac>
+    </sequential>
+  </macrodef>
 
   <macrodef name="gwt.jar">
     <attribute name="destfile" default="${project.lib}"/>
diff --git a/dev/build.xml b/dev/build.xml
index e65df23..69962fd 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -22,16 +22,17 @@
 
   <target name="compile.tests" depends="build, compile.emma.if.enabled, build.alldeps.jar"
           description="Compiles the test code for this project">
-    <mkdir dir="${javac.junit.out}"/>
-    <gwt.javac srcdir="" destdir="${javac.junit.out}">
-      <src path="core/src"/>
-      <src path="core/test"/>
-      <compilerarg value="-Xep:MissingCasesInEnumSwitch:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:FallThrough:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:ReturnValueIgnored:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:EqualsIncompatibleType:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:SelfComparison:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:SelfEquals:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
+    <gwt.javac srcdir="" destdir="${javac.junit.out}" errorprone.args="
+                                                         -Xep:MissingCasesInEnumSwitch:OFF
+                                                         -Xep:FallThrough:OFF
+                                                         -Xep:ReturnValueIgnored:OFF
+                                                         -Xep:EqualsIncompatibleType:OFF
+                                                         -Xep:SelfComparison:OFF
+                                                         -Xep:SelfEquals:OFF
+                                                         -Xep:ComparableType:OFF
+                                                       ">
+        <src path="core/src"/>
+        <src path="core/test"/>
       <classpath>
         <pathelement location="${javac.out}"/>
         <pathelement location="${alldeps.jar}"/>
@@ -39,13 +40,15 @@
       </classpath>
     </gwt.javac>
     <gwt.javac srcdir="" destdir="${javac.junit.out}"
-               excludes="**/EmulatedCharset.java,**/HashCodes.java,**/ConsoleLogger.java,**/NativeRegExp.java,**/SuperDevModeLogger.java">
+               excludes="**/EmulatedCharset.java,**/HashCodes.java,**/ConsoleLogger.java,**/NativeRegExp.java,**/SuperDevModeLogger.java"
+               errorprone.args="
+                 -Xep:MissingCasesInEnumSwitch:OFF
+                 -Xep:FallThrough:OFF
+                 -Xep:ReturnValueIgnored:OFF
+                 -Xep:EqualsIncompatibleType:OFF
+               ">
       <src path="${gwt.root}/user/src" />
       <src path="${gwt.root}/user/super/com/google/gwt/emul/javaemul/internal"/>
-      <compilerarg value="-Xep:MissingCasesInEnumSwitch:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:FallThrough:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:ReturnValueIgnored:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:EqualsIncompatibleType:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
       <classpath>
         <pathelement location="${javac.out}"/>
         <pathelement location="${gwt.tools.lib}/gss/2015-11-04/closure-stylesheets-library-20151104-rebased.jar"/>
@@ -64,7 +67,6 @@
         <pathelement location="${gwt.tools.lib}/jsinterop/jsinterop-annotations-2.0.0.jar"/>
       </classpath>
     </gwt.javac>
-
   </target>
 
   <target name="build.alldeps.jar" description="Merges all dependency jars into a single jar">
@@ -199,7 +201,12 @@
           description="Validates that the standalone gwt-compiler project can build.">
     <mkdir dir="${javac.out}"/>
     <gwt.javac srcdir="core/super" excludes="com/google/gwt/dev/jjs/intrinsic/"/>
-    <gwt.javac srcdir="core/src">
+    <gwt.javac srcdir="core/src" errorprone.args="
+                                    -Xep:MissingCasesInEnumSwitch:OFF
+                                    -Xep:FallThrough:OFF
+                                    -Xep:ReturnValueIgnored:OFF
+                                    -Xep:EqualsIncompatibleType:OFF
+                                  ">
       <include name="com/google/gwt/core/ext/**"/>
       <include name="com/google/gwt/core/linker/**"/>
       <include name="com/google/gwt/dev/About.java"/>
@@ -216,10 +223,6 @@
       <include name="com/google/gwt/soyc/**"/>
       <include name="com/google/gwt/util/**"/>
       <include name="org/eclipse/jdt/**"/>
-      <compilerarg value="-Xep:MissingCasesInEnumSwitch:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:FallThrough:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:ReturnValueIgnored:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:EqualsIncompatibleType:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
       <classpath>
         <pathelement location="${gwt.tools.lib}/apache/ant-zipscanner/ant-zipscanner-1.6.5-1-rebased.jar"/>
         <pathelement location="${gwt.tools.lib}/colt/colt-1.2.jar"/>
@@ -246,12 +249,12 @@
 
   <target name="compile" depends="compiler.standalone, build.alldeps.jar"
           description="Compiles this project">
-    <gwt.javac srcdir="" excludes="${filter.pattern}">
-      <src path="core/src"/>
-      <compilerarg value="-Xep:MissingCasesInEnumSwitch:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:FallThrough:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:ReturnValueIgnored:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:EqualsIncompatibleType:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
+    <gwt.javac srcdir="core/src" excludes="${filter.pattern}" errorprone.args="
+                                                                 -Xep:MissingCasesInEnumSwitch:OFF
+                                                                 -Xep:FallThrough:OFF
+                                                                 -Xep:ReturnValueIgnored:OFF
+                                                                 -Xep:EqualsIncompatibleType:OFF
+                                                               ">
       <classpath>
         <pathelement location="${alldeps.jar}"/>
       </classpath>
diff --git a/dev/codeserver/build.xml b/dev/codeserver/build.xml
index 7277f67..2d59a7e 100755
--- a/dev/codeserver/build.xml
+++ b/dev/codeserver/build.xml
@@ -6,7 +6,6 @@
   <property.ensure name="gwt.dev.jar" location="${gwt.build.lib}/gwt-dev.jar" />
 
   <target name="compile">
-    <mkdir dir="${javac.out}" />
     <gwt.javac srcdir="java">
       <classpath>
         <pathelement location="${gwt.dev.jar}" />
@@ -16,7 +15,6 @@
 
   <target name="compile.tests" depends="compile"
           description="Compile tests java source">
-    <mkdir dir="${javac.junit.out}" />
     <gwt.javac srcdir="" destdir="${javac.junit.out}">
       <src path="java" />
       <src path="javatests" />
diff --git a/tools/api-checker/build.xml b/tools/api-checker/build.xml
index 5f63f66..7349ad1 100755
--- a/tools/api-checker/build.xml
+++ b/tools/api-checker/build.xml
@@ -12,7 +12,6 @@
   <property.ensure name="gwt.user.jar" location="${gwt.build.lib}/gwt-user.jar" />
 
   <target name="compile" description="Compile all class files">
-    <mkdir dir="${javac.out}" />
     <gwt.javac>
       <classpath>
         <pathelement location="${gwt.dev.jar}" />
@@ -31,7 +30,6 @@
   <target name="compile.tests"
       depends="compile.dev.tests, compile.emma.if.enabled"
       description="Compiles the test code for this project">
-    <mkdir dir="${javac.junit.out}" />
     <gwt.javac srcdir="test" destdir="${javac.junit.out}">
       <classpath>
         <pathelement location="${javac.out}" />
diff --git a/tools/cldr-import/build.xml b/tools/cldr-import/build.xml
index 2c95558..9535445 100644
--- a/tools/cldr-import/build.xml
+++ b/tools/cldr-import/build.xml
@@ -44,9 +44,8 @@
   </path>
 
   <target name="compile" description="Compile java source">
-    <mkdir dir="${javac.out}" />
     <gwt.javac>
-      <classpath refid="project.class.path"/>
+      <classpath refid="project.class.path" />
     </gwt.javac>
     <copy todir="${javac.out}">
       <fileset dir="src" excludes="**/*.java"/>
@@ -54,7 +53,6 @@
   </target>
 
   <target name="compile.tests" description="Compile java source">
-    <mkdir dir="${javac.junit.out}" />
     <gwt.javac srcdir="test" destdir="${javac.junit.out}">
       <classpath>
         <pathelement location="${javac.out}"/>
diff --git a/user/build.xml b/user/build.xml
index 615ea77..1c5aa2e 100755
--- a/user/build.xml
+++ b/user/build.xml
@@ -101,15 +101,17 @@
 
   <target name="compile" description="Compile all class files"
           unless="compile.complete">
-    <mkdir dir="${javac.out}"/>
-    <gwt.javac excludes="**/EmulatedCharset.java,**/HashCodes.java,**/ConsoleLogger.java,**/NativeRegExp.java,**/SuperDevModeLogger.java">
-      <src path="super/com/google/gwt/emul/javaemul/internal"/>
-      <compilerarg value="-Xep:MissingCasesInEnumSwitch:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:SelfComparison:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:SelfEquals:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:FallThrough:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:ReturnValueIgnored:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:EqualsIncompatibleType:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
+    <gwt.javac
+            excludes="**/EmulatedCharset.java,**/HashCodes.java,**/ConsoleLogger.java,**/NativeRegExp.java,**/SuperDevModeLogger.java"
+            errorprone.args="
+              -Xep:MissingCasesInEnumSwitch:OFF
+              -Xep:SelfComparison:OFF
+              -Xep:SelfEquals:OFF
+              -Xep:FallThrough:OFF
+              -Xep:ReturnValueIgnored:OFF
+              -Xep:EqualsIncompatibleType:OFF
+            ">
+      <src path="super/com/google/gwt/emul/javaemul/internal" />
       <classpath>
         <pathelement location="${gwt.tools.lib}/gss/2015-10-07/closure-stylesheets-library-20151007-rebased.jar"/>
         <pathelement location="${gwt.tools.lib}/gss/2015-11-04/closure-stylesheets-library-20151104-rebased.jar"/>
@@ -153,19 +155,27 @@
   </target>
 
   <target name="-compile.tests.java8" if="isJava8" depends="compile.dev.tests, compile.emma.if.enabled">
-    <mkdir dir="${javac.junit.out}"/>
     <gwt.javac srcdir="test" destdir="${javac.junit.out}"
-               excludes="com/google/gwt/langtest/**,**/super/**">
-      <compilerarg value="-Xep:MissingCasesInEnumSwitch:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:SelfComparison:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:SelfEquals:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:FallThrough:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:ReturnValueIgnored:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:EqualsIncompatibleType:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:IdentityBinaryExpression:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:LoopConditionChecker:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:JUnitAssertSameCheck:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
-      <compilerarg value="-Xep:CollectionIncompatibleType:OFF" compiler="com.google.errorprone.ErrorProneAntCompilerAdapter"/>
+               excludes="com/google/gwt/langtest/**,**/super/**"
+               processorpath="test.extraclasspath"
+               errorprone.args="
+                 -Xep:SelfAssignment:OFF
+                 -Xep:MissingCasesInEnumSwitch:OFF
+                 -Xep:SelfComparison:OFF
+                 -Xep:SelfEquals:OFF
+                 -Xep:FallThrough:OFF
+                 -Xep:ReturnValueIgnored:OFF
+                 -Xep:EqualsIncompatibleType:OFF
+                 -Xep:IdentityBinaryExpression:OFF
+                 -Xep:LoopConditionChecker:OFF
+                 -Xep:JUnitAssertSameCheck:OFF
+                 -Xep:CollectionIncompatibleType:OFF
+                 -Xep:DeadThread:OFF
+                 -Xep:ComplexBooleanConstant:OFF
+                 -Xep:ComparableType:OFF
+                 -Xep:DoNotCall:OFF
+                 -Xep:BadAnnotationImplementation:OFF
+               ">
       <classpath>
         <pathelement location="${javac.out}"/>
         <pathelement location="${gwt.tools.lib}/junit/junit-4.8.2.jar"/>