From 3b3bd266e9f44c53bfa400a0c0b545909d2f172c Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 23 May 2018 16:11:47 +0200 Subject: [PATCH] IDEA-192450 Can't use Groovy-Eclipse compiler on JDK9 --- .../incremental/groovy/GreclipseBuilder.java | 29 +++++++++++++---- .../groovy/compiler/GroovyCompilerTest.groovy | 31 ++++++++----------- .../compiler/GroovyCompilerTestCase.groovy | 3 +- 3 files changed, 38 insertions(+), 25 deletions(-) diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java index 1c959a3c412d..9acbf0725186 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GreclipseBuilder.java @@ -43,8 +43,8 @@ import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration; import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile; import org.jetbrains.jps.model.module.JpsModule; +import javax.tools.*; import java.io.File; -import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.lang.reflect.Constructor; @@ -60,6 +60,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.groovy.GreclipseBuilder"); private static final Key COMPILER_VERSION_INFO = Key.create("_greclipse_compiler_info_"); public static final String ID = "Groovy-Eclipse"; + private static final Object ourGlobalEnvironmentLock = new String("GreclipseBuilder lock"); private String myGreclipseJar; /** @@ -91,7 +92,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder { new File(jar).toURI().toURL(), new File(ObjectUtils.assertNotNull(PathManager.getJarPathForClass(GreclipseMain.class))).toURI().toURL() }; - ClassLoader loader = new URLClassLoader(urls, null); + ClassLoader loader = new URLClassLoader(urls, StandardJavaFileManager.class.getClassLoader()); Class.forName("org.eclipse.jdt.internal.compiler.batch.Main", false, loader); myGreclipseJar = jar; myGreclipseLoader = loader; @@ -113,7 +114,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder { public ExitCode build(final CompileContext context, ModuleChunk chunk, DirtyFilesHolder dirtyFilesHolder, - OutputConsumer outputConsumer) throws ProjectBuildException, IOException { + OutputConsumer outputConsumer) throws ProjectBuildException { if (!useGreclipse(context)) return ModuleLevelBuilder.ExitCode.NOTHING_DONE; try { @@ -221,10 +222,26 @@ public class GreclipseBuilder extends ModuleLevelBuilder { private boolean performCompilation(List args, StringWriter out, StringWriter err, Map> outputs, CompileContext context, ModuleChunk chunk) { String bytecodeTarget = JpsGroovycRunner.getBytecodeTarget(context, chunk); - if (bytecodeTarget != null) { - System.setProperty(JpsGroovycRunner.GROOVY_TARGET_BYTECODE, bytecodeTarget); + if (bytecodeTarget != null && System.getProperty(JpsGroovycRunner.GROOVY_TARGET_BYTECODE) == null) { + synchronized (ourGlobalEnvironmentLock) { + try { + System.setProperty(JpsGroovycRunner.GROOVY_TARGET_BYTECODE, bytecodeTarget); + return performCompilationInner(args, out, err, outputs, context, chunk); + } + finally { + System.clearProperty(JpsGroovycRunner.GROOVY_TARGET_BYTECODE); + } + } } + return performCompilationInner(args, out, err, outputs, context, chunk); + } + + private boolean performCompilationInner(List args, + StringWriter out, + StringWriter err, + Map> outputs, + CompileContext context, ModuleChunk chunk) { try { Class mainClass = Class.forName(GreclipseMain.class.getName(), true, myGreclipseLoader); Constructor constructor = mainClass.getConstructor(PrintWriter.class, PrintWriter.class, Map.class, Map.class); @@ -242,7 +259,7 @@ public class GreclipseBuilder extends ModuleLevelBuilder { return (Boolean)compileMethod.invoke(main, new Object[]{ArrayUtil.toStringArray(args)}); } catch (Exception e) { - context.processMessage(new CompilerMessage(getPresentableName(), e)); + context.processMessage(CompilerMessage.createInternalBuilderError(getPresentableName(), e)); return false; } } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy index 233f3b3ae894..317e759f880e 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTest.groovy @@ -27,15 +27,11 @@ import com.intellij.execution.process.ProcessOutputTypes import com.intellij.execution.runners.ProgramRunner import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.PathManager -import com.intellij.openapi.application.PluginPathManager import com.intellij.openapi.compiler.CompilerMessageCategory import com.intellij.openapi.compiler.options.ExcludeEntryDescription import com.intellij.openapi.compiler.options.ExcludesConfiguration import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.module.Module -import com.intellij.openapi.projectRoots.JavaSdkVersion -import com.intellij.openapi.projectRoots.JavaSdkVersionUtil -import com.intellij.openapi.roots.ModuleRootManager import com.intellij.openapi.roots.ModuleRootModificationUtil import com.intellij.openapi.util.Key import com.intellij.openapi.util.Ref @@ -51,10 +47,10 @@ import com.intellij.testFramework.PsiTestUtil import com.intellij.testFramework.TestLoggerFactory import groovy.transform.CompileStatic import org.jetbrains.annotations.NotNull +import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile import org.jetbrains.org.objectweb.asm.ClassReader import org.jetbrains.org.objectweb.asm.ClassVisitor -import org.jetbrains.org.objectweb.asm.Opcodes - +import org.jetbrains.org.objectweb.asm.Opcodes /** * @author peter */ @@ -520,6 +516,16 @@ class Usage { assertEmpty make() } + void "test with annotation processing enabled"() { + def profile = (ProcessorConfigProfile)CompilerConfiguration.getInstance(project).getAnnotationProcessingConfiguration(myModule) + profile.enabled = true + profile.obtainProcessorsFromClasspath = true + + myFixture.addFileToProject 'Foo.groovy', 'class Foo {}' + + assertEmpty make() + } + void testGenericStubs() { myFixture.addFileToProject 'Foo.groovy', 'class Foo { List list }' myFixture.addFileToProject 'Bar.java', 'class Bar {{ for (String s : new Foo().getList()) { s.hashCode(); } }}' @@ -1061,22 +1067,11 @@ class Bar {}''' ((CompilerConfigurationImpl)CompilerConfiguration.getInstance(project)).defaultCompiler = new GreclipseIdeaCompiler(project) - def jarName = "groovy-eclipse-batch-2.3.4-01.jar" - def jarPath = FileUtil.toCanonicalPath(PluginPathManager.getPluginHomePath("groovy") + "/lib/" + jarName) + def jarPath = IntelliJProjectConfiguration.getProjectLibraryClassesRootPaths("Groovy-Eclipse-Batch")[0] GreclipseIdeaCompilerSettings.getSettings(project).greclipsePath = jarPath } - @Override - void runTest() { - if (JavaSdkVersionUtil.getJavaSdkVersion(ModuleRootManager.getInstance(myModule).sdk)?.isAtLeast(JavaSdkVersion.JDK_1_9)) { - println "Groovy-Eclipse doesn't support JDK9 yet" - return - } - - super.runTest() - } - protected List chunkRebuildMessage(String builder) { return [] } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.groovy index ed5cdd456f41..06c653979a0c 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/compiler/GroovyCompilerTestCase.groovy @@ -26,6 +26,7 @@ import com.intellij.openapi.util.Key import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.text.StringUtil import com.intellij.openapi.vfs.VirtualFile +import com.intellij.pom.java.LanguageLevel import com.intellij.psi.PsiFile import com.intellij.testFramework.* import com.intellij.testFramework.builders.JavaModuleFixtureBuilder @@ -69,7 +70,7 @@ abstract class GroovyCompilerTestCase extends JavaCodeInsightFixtureTestCase imp @Override protected void tuneFixture(JavaModuleFixtureBuilder moduleBuilder) throws Exception { - moduleBuilder.setLanguageLevel(JavaSdkVersion.fromJavaVersion(JavaVersion.current()).maxLanguageLevel) + moduleBuilder.setLanguageLevel(LanguageLevel.JDK_1_8) def javaHome = FileUtil.toSystemIndependentName(SystemProperties.javaHome) moduleBuilder.addJdk(StringUtil.trimEnd(StringUtil.trimEnd(javaHome, '/'), '/jre')) super.tuneFixture(moduleBuilder)