From 7c3abaec21a688c8d3cb554c848878db577a27d4 Mon Sep 17 00:00:00 2001 From: Stephan Schroevers Date: Mon, 23 May 2022 22:51:25 +0200 Subject: [PATCH] Sharing: yes we can --- error-prone-contrib/pom.xml | 5 ++ .../errorprone/bugpatterns/RefasterCheck.java | 12 ++++ plexus-compiler-javac-caching/pom.xml | 7 +- .../javac/caching/CachingJavacCompiler.java | 70 ++++++++++++++++++- .../resources/META-INF/plexus/components.xml | 46 ++++++------ pom.xml | 5 ++ 6 files changed, 119 insertions(+), 26 deletions(-) diff --git a/error-prone-contrib/pom.xml b/error-prone-contrib/pom.xml index 17ddaff2..3e29a081 100644 --- a/error-prone-contrib/pom.xml +++ b/error-prone-contrib/pom.xml @@ -39,6 +39,11 @@ error_prone_test_helpers test + + + ${project.groupId} + plexus-compiler-javac-caching + ${project.groupId} refaster-compiler diff --git a/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/RefasterCheck.java b/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/RefasterCheck.java index da291334..163747e1 100644 --- a/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/RefasterCheck.java +++ b/error-prone-contrib/src/main/java/tech/picnic/errorprone/bugpatterns/RefasterCheck.java @@ -43,9 +43,11 @@ import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Optional; +import java.util.concurrent.ConcurrentMap; import java.util.function.Supplier; import java.util.regex.Pattern; import java.util.stream.Stream; +import tech.picnic.errorprone.plexus.compiler.javac.caching.CachingJavacCompiler; /** * A {@link BugChecker} which flags code which can be simplified using Refaster templates located on @@ -89,6 +91,16 @@ public final class RefasterCheck extends BugChecker implements CompilationUnitTr @Override public Description matchCompilationUnit(CompilationUnitTree tree, VisitorState state) { + System.out.println("XXXX :" + CachingJavacCompiler.class.toString()); + ConcurrentMap cache = state.context.get(ConcurrentMap.class); + System.err.printf("XXX %s%n", cache); + if (cache != null) { + cache.compute("x", (a, b) -> b == null ? 1 : b + 1); + } else { + // We're not using the hacked compiler + System.err.printf("XXX NOP!%n"); + } + /* First, collect all matches. */ List matches = new ArrayList<>(); try { diff --git a/plexus-compiler-javac-caching/pom.xml b/plexus-compiler-javac-caching/pom.xml index 7cf0badd..9d6eb6ee 100644 --- a/plexus-compiler-javac-caching/pom.xml +++ b/plexus-compiler-javac-caching/pom.xml @@ -1,5 +1,5 @@ - + 4.0.0 @@ -14,6 +14,11 @@ Caching Javac compiler Plexus Compiler component. + + com.google.errorprone + javac + provided + org.codehaus.plexus plexus-compiler-api diff --git a/plexus-compiler-javac-caching/src/main/java/tech/picnic/errorprone/plexus/compiler/javac/caching/CachingJavacCompiler.java b/plexus-compiler-javac-caching/src/main/java/tech/picnic/errorprone/plexus/compiler/javac/caching/CachingJavacCompiler.java index 987b80af..6233b573 100644 --- a/plexus-compiler-javac-caching/src/main/java/tech/picnic/errorprone/plexus/compiler/javac/caching/CachingJavacCompiler.java +++ b/plexus-compiler-javac-caching/src/main/java/tech/picnic/errorprone/plexus/compiler/javac/caching/CachingJavacCompiler.java @@ -1,7 +1,21 @@ package tech.picnic.errorprone.plexus.compiler.javac.caching; +import com.sun.tools.javac.api.JavacTool; +import com.sun.tools.javac.util.Context; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.Writer; +import java.nio.charset.Charset; +import java.util.Locale; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; +import javax.lang.model.SourceVersion; +import javax.tools.DiagnosticListener; import javax.tools.JavaCompiler; -import javax.tools.ToolProvider; +import javax.tools.JavaFileManager; +import javax.tools.JavaFileObject; +import javax.tools.StandardJavaFileManager; import org.codehaus.plexus.compiler.CompilerConfiguration; import org.codehaus.plexus.compiler.CompilerException; import org.codehaus.plexus.compiler.CompilerResult; @@ -13,7 +27,10 @@ public final class CachingJavacCompiler extends JavaxToolsCompiler { @Override protected JavaCompiler newJavaCompiler() { // XXX: Tweak! - return ToolProvider.getSystemJavaCompiler(); + // XXX: Could we instead simply provide another `JavaCompiler` to be service-loaded? Would + // certainly be simpler. + // return ToolProvider.getSystemJavaCompiler(); + return new XxxJavaCompiler(JavacTool.create()); } // XXX: Drop? @@ -23,4 +40,53 @@ public final class CachingJavacCompiler extends JavaxToolsCompiler { getLogger().error("XXXX I'm invoked!"); return super.compileInProcess(args, config, sourceFiles); } + + // XXX: Name! + private static final class XxxJavaCompiler implements JavaCompiler { + private final ConcurrentHashMap cache = new ConcurrentHashMap<>(); + private final JavacTool delegate; + + private XxxJavaCompiler(JavacTool delegate) { + this.delegate = delegate; + } + + @Override + public CompilationTask getTask( + Writer out, + JavaFileManager fileManager, + DiagnosticListener diagnosticListener, + Iterable options, + Iterable classes, + Iterable compilationUnits) { + System.out.println("XXXX I'm invoked!"); + Context context = new Context(); + // XXX: Explain. + context.put(ConcurrentMap.class, cache); + return delegate.getTask( + out, fileManager, diagnosticListener, options, classes, compilationUnits, context); + } + + @Override + public StandardJavaFileManager getStandardFileManager( + DiagnosticListener diagnosticListener, + Locale locale, + Charset charset) { + return delegate.getStandardFileManager(diagnosticListener, locale, charset); + } + + @Override + public int isSupportedOption(String option) { + return delegate.isSupportedOption(option); + } + + @Override + public int run(InputStream in, OutputStream out, OutputStream err, String... arguments) { + return delegate.run(in, out, err, arguments); + } + + @Override + public Set getSourceVersions() { + return delegate.getSourceVersions(); + } + } } diff --git a/plexus-compiler-javac-caching/src/main/resources/META-INF/plexus/components.xml b/plexus-compiler-javac-caching/src/main/resources/META-INF/plexus/components.xml index 128db18d..9a333e11 100644 --- a/plexus-compiler-javac-caching/src/main/resources/META-INF/plexus/components.xml +++ b/plexus-compiler-javac-caching/src/main/resources/META-INF/plexus/components.xml @@ -1,26 +1,26 @@ - - - org.codehaus.plexus.compiler.Compiler - javac-with-caching - org.codehaus.plexus.compiler.javac.JavacCompiler - - false - - - org.codehaus.plexus.compiler.javac.InProcessCompiler - javac-with-caching - inProcessCompiler - - - - - org.codehaus.plexus.compiler.javac.InProcessCompiler - javac-with-caching - tech.picnic.errorprone.plexus.compiler.javac.caching.CachingJavacCompiler - - false - - + + + org.codehaus.plexus.compiler.Compiler + javac-with-caching + org.codehaus.plexus.compiler.javac.JavacCompiler + + false + + + org.codehaus.plexus.compiler.javac.InProcessCompiler + javac-with-caching + inProcessCompiler + + + + + org.codehaus.plexus.compiler.javac.InProcessCompiler + javac-with-caching + tech.picnic.errorprone.plexus.compiler.javac.caching.CachingJavacCompiler + + false + + diff --git a/pom.xml b/pom.xml index 14dca306..8ce1f76c 100644 --- a/pom.xml +++ b/pom.xml @@ -185,6 +185,11 @@ error_prone_test_helpers ${version.error-prone} + + ${project.groupId} + plexus-compiler-javac-caching + ${project.version} + ${project.groupId} refaster-compiler