IDEA-192450 Can't use Groovy-Eclipse compiler on JDK9

This commit is contained in:
peter
2018-05-23 16:13:22 +02:00
parent c20ae5e097
commit 3b3bd266e9
3 changed files with 38 additions and 25 deletions
@@ -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<Boolean> 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<JavaSourceRootDescriptor, ModuleBuildTarget> 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<String> args, StringWriter out, StringWriter err, Map<String, List<String>> 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<String> args,
StringWriter out,
StringWriter err,
Map<String, List<String>> 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;
}
}
@@ -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<String> 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<String> chunkRebuildMessage(String builder) {
return []
}
@@ -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)