Groovy-Eclipse compiler support back-end (IDEA-52379)
[idea/community.git] / plugins / groovy / jps-plugin / src / org / jetbrains / jps / incremental / groovy / GroovyBuilderService.java
index 06e91dc54ce06b3210fcc94e6c31e7027f76e4d3..dc4d5198c9018b0a49cc8f42f35a85ead560cf6b 100644 (file)
  */
 package org.jetbrains.jps.incremental.groovy;
 
+import com.intellij.openapi.application.PathManager;
+import com.intellij.util.ObjectUtils;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 import org.jetbrains.jps.incremental.BuilderService;
 import org.jetbrains.jps.incremental.ModuleLevelBuilder;
 
+import java.io.File;
+import java.net.URL;
+import java.net.URLClassLoader;
 import java.util.Arrays;
 import java.util.List;
 
@@ -26,11 +32,38 @@ import java.util.List;
  * @author peter
  */
 public class GroovyBuilderService extends BuilderService {
+  /**
+   * All Groovy-Eclipse stuff is contained in a separate classLoader to avoid clashes with ecj.jar being in the classpath of the builder process
+   */
+  @Nullable
+  private static final ClassLoader ourGreclipseLoader = createGreclipseLoader();
+
+  @Nullable
+  private static ClassLoader createGreclipseLoader() {
+    String jar = System.getProperty("groovy.eclipse.batch.jar");
+    if (jar == null) return null;
+
+    try {
+      URL[] urls = {
+        new File(jar).toURI().toURL(),
+        new File(ObjectUtils.assertNotNull(PathManager.getJarPathForClass(GreclipseMain.class))).toURI().toURL()
+      };
+      ClassLoader loader = new URLClassLoader(urls, null);
+      Class.forName("org.eclipse.jdt.internal.compiler.batch.Main", false, loader);
+      return loader;
+    }
+    catch (Exception e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   @NotNull
   @Override
   public List<? extends ModuleLevelBuilder> createModuleLevelBuilders() {
-    return Arrays.asList(new GroovyBuilder(true),
-                         new GroovyBuilder(false));
+    if (ourGreclipseLoader != null) {
+      return Arrays.asList(new GreclipseBuilder(ourGreclipseLoader));
+    }
+    return Arrays.asList(new GroovyBuilder(true), new GroovyBuilder(false));
   }
 
 }