diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml b/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml index 1fa91ade..ec6c1767 100644 --- a/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml +++ b/plexus-compilers/plexus-compiler-javac-errorprone/pom.xml @@ -29,24 +29,8 @@ com.google.errorprone error_prone_core - 2.3.4 + 2.4.0 - - - - org.apache.maven.plugins - maven-surefire-plugin - - - true - - - - - diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java index a840b6f5..f9a05951 100644 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java +++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/main/java/org/codehaus/plexus/compiler/javac/errorprone/JavacCompilerWithErrorProne.java @@ -16,26 +16,22 @@ package org.codehaus.plexus.compiler.javac.errorprone; -import com.google.errorprone.ErrorProneCompiler; -import org.codehaus.plexus.compiler.AbstractCompiler; +import com.google.errorprone.ErrorProneJavaCompiler; + import org.codehaus.plexus.compiler.CompilerConfiguration; import org.codehaus.plexus.compiler.CompilerException; import org.codehaus.plexus.compiler.CompilerMessage; -import org.codehaus.plexus.compiler.CompilerOutputStyle; import org.codehaus.plexus.compiler.CompilerResult; +import org.codehaus.plexus.compiler.javac.InProcessCompiler; import org.codehaus.plexus.compiler.javac.JavacCompiler; +import org.codehaus.plexus.compiler.javac.JavaxToolsCompiler; + +import javax.tools.JavaCompiler; +import javax.tools.ToolProvider; -import javax.tools.Diagnostic; -import javax.tools.DiagnosticListener; -import javax.tools.JavaFileObject; -import java.io.File; -import java.lang.reflect.Method; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; /** * This class overrides JavacCompiler with modifications to use the error-prone @@ -45,58 +41,8 @@ * @plexus.component role="org.codehaus.plexus.compiler.Compiler" role-hint="javac-with-errorprone" */ public class JavacCompilerWithErrorProne - extends AbstractCompiler + extends JavacCompiler { - public JavacCompilerWithErrorProne() - { - super( CompilerOutputStyle.ONE_OUTPUT_FILE_PER_INPUT_FILE, ".java", ".class", null ); - } - - public String[] createCommandLine( CompilerConfiguration config ) - throws CompilerException - { - return new String[0]; - } - - @Override - public CompilerResult performCompile( CompilerConfiguration config ) - throws CompilerException - { - File destinationDir = new File( config.getOutputLocation() ); - - if ( !destinationDir.exists() ) - { - destinationDir.mkdirs(); - } - - String[] sourceFiles = getSourceFiles( config ); - - if ( ( sourceFiles == null ) || ( sourceFiles.length == 0 ) ) - { - return new CompilerResult(); - } - - if ( ( getLogger() != null ) && getLogger().isInfoEnabled() ) - { - getLogger().info( "Compiling " + sourceFiles.length + " " // - + "source file" // - + ( sourceFiles.length == 1 ? "" : "s" ) // - + " to " + destinationDir.getAbsolutePath() ); - } - - String[] args = JavacCompiler.buildCompilerArguments( config, sourceFiles ); - - try - { - CompilerResult compilerResult = (CompilerResult) getInvoker().invoke( null, new Object[]{ args } ); - return compilerResult; - } - catch ( Exception e ) - { - throw new CompilerException( e.getMessage(), e ); - } - } - private static class NonDelegatingClassLoader extends URLClassLoader { @@ -115,6 +61,10 @@ public Class loadClass( String name, boolean complete ) { // Classes loaded inside CompilerInvoker that need to reach back to the caller if ( name.contentEquals( CompilerResult.class.getName() ) + || name.contentEquals( InProcessCompiler.class.getName() ) + || name.contentEquals( CompilerConfiguration.class.getName() ) + || name.contentEquals( CompilerConfiguration.CompilerReuseStrategy.class.getName() ) + || name.contentEquals( CompilerException.class.getName() ) || name.contentEquals( CompilerMessage.class.getName() ) || name.contentEquals( CompilerMessage.Kind.class.getName() ) ) { @@ -140,12 +90,9 @@ public Class loadClass( String name, boolean complete ) } } - private Method invokerMethod; - - private Method getInvoker() - throws CompilerException + protected InProcessCompiler inProcessCompiler() { - if ( invokerMethod == null ) + if ( Thread.currentThread().getContextClassLoader().getResource("java/lang/module/ModuleReference.class") == null ) { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); URL[] urls = ( (URLClassLoader) contextClassLoader ).getURLs(); @@ -154,14 +101,14 @@ private Method getInvoker() { loader = new NonDelegatingClassLoader( urls, contextClassLoader ); Class clazz = Class.forName( CompilerInvoker.class.getName(), true, loader ); - invokerMethod = clazz.getMethod( "compile", String[].class ); + return ( InProcessCompiler ) clazz.newInstance(); } catch ( Exception e ) { - throw new CompilerException( e.getMessage(), e ); + throw new IllegalStateException( e ); } } - return invokerMethod; + return new CompilerInvoker(); } /** @@ -170,57 +117,12 @@ private Method getInvoker() * javac.jar instead of from the bootclasspath. */ public static class CompilerInvoker + extends JavaxToolsCompiler { - private static class MessageListener - implements DiagnosticListener - { - private final List messages; - - MessageListener( List messages ) - { - this.messages = messages; - } - - public static CompilerMessage.Kind convertKind( Diagnostic diagnostic ) - { - switch ( diagnostic.getKind() ) - { - case ERROR: - return CompilerMessage.Kind.ERROR; - case WARNING: - return CompilerMessage.Kind.WARNING; - case MANDATORY_WARNING: - return CompilerMessage.Kind.MANDATORY_WARNING; - case NOTE: - return CompilerMessage.Kind.NOTE; - default: - return CompilerMessage.Kind.OTHER; - } - } - - public void report( Diagnostic diagnostic ) - { - CompilerMessage compilerMessage = - new CompilerMessage( diagnostic.getSource() == null ? null : diagnostic.getSource().getName(), // - convertKind( diagnostic ), // - (int) diagnostic.getLineNumber(), // - (int) diagnostic.getColumnNumber(), // - -1, // - -1, - // end pos line:column is hard to calculate - diagnostic.getMessage( Locale.getDefault() ) ); - messages.add( compilerMessage ); - } - } - - public static CompilerResult compile( String[] args ) - { - List messages = new ArrayList<>(); - ErrorProneCompiler compiler = // - ErrorProneCompiler.builder() // - .listenToDiagnostics( new MessageListener( messages ) ) // - .build(); - return new CompilerResult( compiler.run( args ).isOK(), messages ); - } + @Override + protected JavaCompiler newJavaCompiler() + { + return new ErrorProneJavaCompiler(); + } } } \ No newline at end of file diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/ShortSet.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/ShortSet.java new file mode 100644 index 00000000..405b34be --- /dev/null +++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/ShortSet.java @@ -0,0 +1,13 @@ +import java.util.Set; +import java.util.HashSet; + +public class ShortSet { + public static void main (String[] args) { + Set s = new HashSet<>(); + for (short i = 0; i < 100; i++) { + s.add(i); + s.remove(i - 1); + } + System.out.println(s.size()); + } +} \ No newline at end of file diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Bad.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Bad.java deleted file mode 100644 index b450e4f7..00000000 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Bad.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.codehaus.foo; - -public class Bad -{ - // Intentionally misspelled modifier. - pubic String name; -} diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Deprecation.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Deprecation.java deleted file mode 100644 index e2619472..00000000 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Deprecation.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.codehaus.foo; - -public class Deprecation -{ - public Deprecation() - { - new java.util.Date("testDate"); - } -} diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ExternalDeps.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ExternalDeps.java deleted file mode 100644 index 30ce7bc1..00000000 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ExternalDeps.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.codehaus.foo; - -import org.apache.commons.lang.StringUtils; - -public class ExternalDeps -{ - public void hello( String str ) - { - System.out.println( StringUtils.upperCase( str) ); - } -} diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Person.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Person.java deleted file mode 100644 index 0b58d0ee..00000000 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/Person.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.codehaus.foo; - -public class Person -{ -} diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ReservedWord.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ReservedWord.java deleted file mode 100644 index 3f8434fd..00000000 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/ReservedWord.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.codehaus.foo; - -public class ReservedWord -{ - String assert; -} diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/UnknownSymbol.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/UnknownSymbol.java deleted file mode 100644 index d8b752e9..00000000 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/UnknownSymbol.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.codehaus.foo; - -public class UnknownSymbol -{ - public UnknownSymbol() - { - foo(); - } -} diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/WrongClassname.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/WrongClassname.java deleted file mode 100644 index 1c4107f8..00000000 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test-input/src/main/org/codehaus/foo/WrongClassname.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.codehaus.foo; - -public class RightClassname -{ -} diff --git a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java index 55264dba..babdc696 100644 --- a/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java +++ b/plexus-compilers/plexus-compiler-javac-errorprone/src/test/java/org/codehaus/plexus/compiler/javac/JavacErrorProneCompilerTest.java @@ -24,17 +24,14 @@ * SOFTWARE. */ +import org.codehaus.classworlds.DefaultClassRealm; import org.codehaus.plexus.compiler.AbstractCompilerTest; -import org.codehaus.plexus.compiler.CompilerConfiguration; -import org.codehaus.plexus.util.StringUtils; -import java.io.File; -import java.util.ArrayList; +import java.lang.reflect.Field; +import java.net.URLClassLoader; import java.util.Arrays; import java.util.Collection; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.Collections; /** * @author Jason van Zyl @@ -43,31 +40,69 @@ public class JavacErrorProneCompilerTest extends AbstractCompilerTest { + protected boolean java8() { + return System.getProperty( "java.version" ).startsWith( "1.8" ); + } + + private ClassLoader originalTCCL; + public void setUp() throws Exception { super.setUp(); - setForceJavacCompilerUse( true ); + if ( java8() ) { + ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); + this.originalTCCL = contextClassLoader; + Field realmField = contextClassLoader.getClass().getDeclaredField("realm"); + realmField.setAccessible(true); + DefaultClassRealm realm = (DefaultClassRealm) realmField.get(contextClassLoader); + Field foreignClassLoaderField = realm.getClass().getDeclaredField("foreignClassLoader"); + foreignClassLoaderField.setAccessible(true); + URLClassLoader foreignClassLoader = (URLClassLoader) foreignClassLoaderField.get(realm); + Thread.currentThread().setContextClassLoader(foreignClassLoader); + } + } + + public void tearDown() + throws Exception + { + if ( java8() ) { + Thread.currentThread().setContextClassLoader(originalTCCL); + } + super.tearDown(); } protected String getRoleHint() { return "javac-with-errorprone"; } + protected int expectedWarnings() { - return 10; + if ( java8() ) { + return 1; + } + else + { + return 2; + } } @Override protected int expectedErrors() { - return 4; + return 1; } - protected Collection expectedOutputFiles() + @Override + public String getSourceVersion() + { + return "1.8"; + } + + @Override + public String getTargetVersion() { - return Arrays.asList( new String[]{ "org/codehaus/foo/Deprecation.class", "org/codehaus/foo/ExternalDeps.class", - "org/codehaus/foo/Person.class", "org/codehaus/foo/ReservedWord.class" } ); + return "1.8"; } } diff --git a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/InProcessCompiler.java b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/InProcessCompiler.java new file mode 100644 index 00000000..c4374eee --- /dev/null +++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/InProcessCompiler.java @@ -0,0 +1,12 @@ +package org.codehaus.plexus.compiler.javac; + +import org.codehaus.plexus.compiler.CompilerConfiguration; +import org.codehaus.plexus.compiler.CompilerException; +import org.codehaus.plexus.compiler.CompilerResult; + +public interface InProcessCompiler { + + CompilerResult compileInProcess(String[] args, final CompilerConfiguration config, String[] sourceFiles) + throws CompilerException; + +} diff --git a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java index 8f92a64c..d215d0a3 100644 --- a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java +++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavacCompiler.java @@ -173,7 +173,7 @@ public CompilerResult performCompile( CompilerConfiguration config ) { // use fqcn to prevent loading of the class on 1.5 environment ! result = - org.codehaus.plexus.compiler.javac.JavaxToolsCompiler.compileInProcess( args, config, sourceFiles ); + inProcessCompiler().compileInProcess( args, config, sourceFiles ); } else { @@ -184,6 +184,11 @@ public CompilerResult performCompile( CompilerConfiguration config ) return result; } + protected InProcessCompiler inProcessCompiler() + { + return new org.codehaus.plexus.compiler.javac.JavaxToolsCompiler(); + } + protected static boolean isJava16() { try diff --git a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java index 85b048bc..7eaa3ab0 100644 --- a/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java +++ b/plexus-compilers/plexus-compiler-javac/src/main/java/org/codehaus/plexus/compiler/javac/JavaxToolsCompiler.java @@ -41,22 +41,27 @@ * @author David M. Lloyd * @since 2.0 */ -public class JavaxToolsCompiler +public class JavaxToolsCompiler implements InProcessCompiler { /** * is that thread safe ??? */ @SuppressWarnings( "restriction" ) - static final JavaCompiler COMPILER = ToolProvider.getSystemJavaCompiler(); + private final JavaCompiler COMPILER = newJavaCompiler(); - private static List JAVA_COMPILERS = new CopyOnWriteArrayList<>(); + protected JavaCompiler newJavaCompiler() + { + return ToolProvider.getSystemJavaCompiler(); + } - protected static JavaCompiler getJavaCompiler( CompilerConfiguration compilerConfiguration ) + private List JAVA_COMPILERS = new CopyOnWriteArrayList<>(); + + private JavaCompiler getJavaCompiler( CompilerConfiguration compilerConfiguration ) { switch ( compilerConfiguration.getCompilerReuseStrategy() ) { case AlwaysNew: - return ToolProvider.getSystemJavaCompiler(); + return newJavaCompiler(); case ReuseCreated: JavaCompiler javaCompiler; synchronized ( JAVA_COMPILERS ) @@ -68,7 +73,7 @@ protected static JavaCompiler getJavaCompiler( CompilerConfiguration compilerCon return javaCompiler; } } - javaCompiler = ToolProvider.getSystemJavaCompiler(); + javaCompiler = newJavaCompiler(); return javaCompiler; case ReuseSame: default: @@ -77,7 +82,7 @@ protected static JavaCompiler getJavaCompiler( CompilerConfiguration compilerCon } - static void releaseJavaCompiler( JavaCompiler javaCompiler, CompilerConfiguration compilerConfiguration ) + private void releaseJavaCompiler( JavaCompiler javaCompiler, CompilerConfiguration compilerConfiguration ) { if ( javaCompiler == null ) { @@ -90,7 +95,7 @@ static void releaseJavaCompiler( JavaCompiler javaCompiler, CompilerConfiguratio } } - static CompilerResult compileInProcess( String[] args, final CompilerConfiguration config, String[] sourceFiles ) + public CompilerResult compileInProcess( String[] args, final CompilerConfiguration config, String[] sourceFiles ) throws CompilerException { JavaCompiler compiler = getJavaCompiler( config ); @@ -179,7 +184,7 @@ static CompilerResult compileInProcess( String[] args, final CompilerConfigurati } } - public static CompilerMessage.Kind convertKind(Diagnostic diagnostic) { + private CompilerMessage.Kind convertKind(Diagnostic diagnostic) { CompilerMessage.Kind kind; switch ( diagnostic.getKind() ) {