From b74414dbaf107b1c452b9bcfb17ee43cdd9667b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93lafur=20P=C3=A1ll=20Geirsson?= Date: Thu, 26 Aug 2021 10:43:44 +0200 Subject: [PATCH] Properly fix issue with checkerframework Gradle plugin. Previously, `lsif-java index` had custom logic to disable the checkerframework Gradle plugin in order to prevent the error "plug-in not found: semanticdb". This commit replaces that custom logic with a proper fix to this bug, which is to automatically inject the SemanticDB compiler plugin jar to the annotation processor path as well as the compile classpath. --- .../buildtools/GradleBuildTool.scala | 12 +------- .../semanticdb_javac/SemanticdbAgent.java | 28 +++++++++++++++++++ 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleBuildTool.scala b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleBuildTool.scala index 58718a85..9bf98c31 100644 --- a/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleBuildTool.scala +++ b/lsif-java/src/main/scala/com/sourcegraph/lsif_java/buildtools/GradleBuildTool.scala @@ -78,17 +78,7 @@ class GradleBuildTool(index: IndexCommand) extends BuildTool("Gradle", index) { buildCommand += s"-Porg.gradle.java.installations.paths=${toolchains.paths()}" } - buildCommand ++= - index.finalBuildCommand( - List( - // Disable the checkerframework plugin because it updates the processorpath - // in a way that causes the error "plug-in not found: semanticdb". - // Details: https://github.com/kelloggm/checkerframework-gradle-plugin/blob/76d1926ae22144b082dfcfde1abe625750469398/src/main/groovy/org/checkerframework/gradle/plugin/CheckerFrameworkPlugin.groovy#L374-L376 - "-PskipCheckerFramework", - "clean", - "compileTestJava" - ) - ) + buildCommand ++= index.finalBuildCommand(List("clean", "compileTestJava")) buildCommand += lsifJavaDependencies val result = index.process(buildCommand, env = Map("TERM" -> "dumb")) diff --git a/semanticdb-agent/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbAgent.java b/semanticdb-agent/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbAgent.java index 544e79da..e147bcc1 100644 --- a/semanticdb-agent/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbAgent.java +++ b/semanticdb-agent/src/main/java/com/sourcegraph/semanticdb_javac/SemanticdbAgent.java @@ -49,6 +49,17 @@ public static void premain(String agentArgs, Instrumentation inst) { named("getCompileClasspath"), DefaultJvmLanguageCompileSpecAdvice.class.getName())) .installOn(inst); + new AgentBuilder.Default() + .disableClassFormatChanges() + .type( + named("org.gradle.api.internal.tasks.compile.DefaultJavaCompileSpec") + .or(named("tests.GradleDefaultJavaCompileSpec"))) + .transform( + new AgentBuilder.Transformer.ForAdvice() + .advice( + named("getAnnotationProcessorPath"), + DefaultJavaCompileSpecAdvice.class.getName())) + .installOn(inst); new AgentBuilder.Default() .type( named("org.gradle.api.internal.tasks.compile.JavaCompilerArgumentsBuilder") @@ -92,6 +103,23 @@ public static void getClasspath( } } + @SuppressWarnings("all") + public static class DefaultJavaCompileSpecAdvice { + @Advice.OnMethodExit + public static void getAnnotationProcessorPath( + @Advice.Return(readOnly = false, typing = DYNAMIC) List classpath) { + if (classpath == null) return; + String PLUGINPATH = System.getProperty("semanticdb.pluginpath"); + if (PLUGINPATH == null) throw new NoSuchElementException("-Dsemanticdb.pluginpath"); + File semanticdbJar = new File(PLUGINPATH); + if (!classpath.contains(semanticdbJar)) { + List newClasspath = new ArrayList<>(classpath); + newClasspath.add(semanticdbJar); + classpath = newClasspath; + } + } + } + @SuppressWarnings("all") public static class JavaCompilerArgumentsBuilderAdvice {