diff --git a/jps/jps-builders/jps-builders.iml b/jps/jps-builders/jps-builders.iml
index d1369153c229..0ccf7c772704 100644
--- a/jps/jps-builders/jps-builders.iml
+++ b/jps/jps-builders/jps-builders.iml
@@ -28,6 +28,7 @@
+
diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java
index 7fc1a61dea8a..cc864d20227f 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java
@@ -1,5 +1,6 @@
package org.jetbrains.jps.incremental;
+import org.jetbrains.jps.incremental.groovy.GroovyBuilder;
import org.jetbrains.jps.incremental.java.JavaBuilder;
import org.jetbrains.jps.incremental.resourses.ResourcesBuilder;
@@ -37,6 +38,7 @@ public class BuilderRegistry {
// todo: some builder registration mechanism needed
myBuilders.get(BuilderCategory.TRANSLATOR).add(new JavaBuilder(myTasksExecutor));
myBuilders.get(BuilderCategory.TRANSLATOR).add(new ResourcesBuilder());
+ myBuilders.get(BuilderCategory.TRANSLATOR).add(new GroovyBuilder());
}
diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java
index 5c5e186f8b43..7c55a97f81f3 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java
@@ -1,9 +1,22 @@
package org.jetbrains.jps.incremental.groovy;
+
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.util.SystemProperties;
+import org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper;
import org.jetbrains.jps.ModuleChunk;
import org.jetbrains.jps.incremental.Builder;
import org.jetbrains.jps.incremental.CompileContext;
+import org.jetbrains.jps.incremental.FilesCollector;
import org.jetbrains.jps.incremental.ProjectBuildException;
+import org.jetbrains.jps.server.ClasspathBootstrap;
+
+import java.io.*;
+import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
/**
* @author Eugene Zhuravlev
@@ -16,11 +29,126 @@ public class GroovyBuilder extends Builder {
return BUILDER_NAME;
}
- public ExitCode build(CompileContext context, ModuleChunk chunk) throws ProjectBuildException {
+ public Builder.ExitCode build(CompileContext context, ModuleChunk chunk) throws ProjectBuildException {
+ FilesCollector collector = new FilesCollector(new FileFilter() {
+ @Override
+ public boolean accept(File pathname) {
+ return pathname.getPath().endsWith(".groovy"); //todo file type check
+ }
+ });
+ try {
+ context.processFiles(chunk, collector);
+ }
+ catch (Exception e) {
+ throw new ProjectBuildException(e);
+ }
+
+ if (collector.getFiles().isEmpty()) {
+ return Builder.ExitCode.OK;
+ }
+
+ List cp = new ArrayList();
+
+ try {
+ Collection boot =
+ context.getProjectPaths().getPlatformCompilationClasspath(chunk, context.isCompilingTests(), context.isMake());
+ for (File file : boot) {
+ file.toURI().toURL();
+ }
+ Collection main =
+ context.getProjectPaths().getCompilationClasspath(chunk, context.isCompilingTests(), context.isMake());
+ for (File file : main) {
+ cp.add(FileUtil.toSystemIndependentName(file.getPath()));
+ }
+ cp.add(ClasspathBootstrap.getResourcePath(GroovyCompilerWrapper.class).getPath()); //groovy_rt.jar
+ }
+ catch (MalformedURLException e) {
+ throw new ProjectBuildException(e);
+ }
+
+ try {
+ File tempFile = FileUtil.createTempFile("ideaGroovyToCompile", ".txt", true);
+
+ List cmd = new ArrayList();
+ cmd.add(SystemProperties.getJavaHome() + "/bin/java"); //todo module jdk path
+ // todo cmd.add("-bootclasspath");
+ cmd.add("-cp");
+ cmd.add(StringUtil.join(cp, File.pathSeparator));
+ cmd.add("org.jetbrains.groovy.compiler.rt.GroovycRunner");
+ cmd.add("groovyc");
+ cmd.add(tempFile.getPath());
+
+ File dir = context.getProjectPaths().getModuleOutputDir(chunk.getModules().iterator().next(), context.isCompilingTests());
+ assert dir != null;
+ fillFileWithGroovycParameters(collector, tempFile, dir.getPath());
+
+ Process process = Runtime.getRuntime().exec(cmd.toArray(new String[cmd.size()]));
+ StreamReader stdout = new StreamReader(process.getInputStream(), System.out);
+ stdout.start();
+ StreamReader stderr = new StreamReader(process.getErrorStream(), System.out);
+ stderr.start();
+ stdout.join();
+ stderr.join();
+ process.waitFor();
+ }
+ catch (Exception e) {
+ throw new ProjectBuildException(e);
+ }
+
return ExitCode.OK;
}
+ private static void fillFileWithGroovycParameters(FilesCollector collector, File tempFile, final String outputDir) throws IOException {
+ String fileText = "";
+ for (File file : collector.getFiles()) {
+ fileText += "src_file\n";
+ fileText += file.getPath() + "\n";
+ //todo file2Classes
+ fileText += "end" + "\n";
+ }
+
+ //todo patchers
+ fileText += "encoding\n";
+ fileText += "UTF-8\n"; //todo encoding
+ fileText += "outputpath\n";
+ fileText += outputDir + "\n";
+ fileText += "finaloutputpath\n";
+ fileText += outputDir + "\n";
+
+ FileWriter writer = new FileWriter(tempFile);
+ writer.write(fileText);
+ writer.close();
+ }
+
public String getDescription() {
return "Groovy builder";
}
+
+ static class StreamReader extends Thread {
+ private final BufferedReader myStream;
+ private final PrintStream myWriter;
+
+ StreamReader(InputStream stream, PrintStream writer) {
+ myStream = new BufferedReader(new InputStreamReader(stream));
+ myWriter = writer;
+ }
+
+ @Override
+ public void run() {
+ while (true) {
+ String line = null;
+ try {
+ line = myStream.readLine();
+ }
+ catch (IOException e) {
+ e.printStackTrace(); //todo change body of catch statement use File | Settings | File Templates.
+ }
+ if (line == null) {
+ break;
+ }
+
+ myWriter.println(line);
+ }
+ }
+ }
}
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovycOSProcessHandler.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovycOSProcessHandler.java
similarity index 94%
rename from plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovycOSProcessHandler.java
rename to jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovycOSProcessHandler.java
index 69d8e788ed91..3924819662a0 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovycOSProcessHandler.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/groovy/GroovycOSProcessHandler.java
@@ -14,9 +14,9 @@
* limitations under the License.
*/
-package org.jetbrains.plugins.groovy.compiler;
+package org.jetbrains.jps.incremental.groovy;
-import com.intellij.execution.process.OSProcessHandler;
+import com.intellij.execution.process.BaseOSProcessHandler;
import com.intellij.execution.process.ProcessOutputTypes;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
@@ -28,6 +28,7 @@ import org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper;
import org.jetbrains.groovy.compiler.rt.GroovycRunner;
import java.io.File;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@@ -37,16 +38,16 @@ import java.util.Set;
* @author: Dmitry.Krasilschikov
* @date: 16.04.2007
*/
-public class GroovycOSProcessHandler extends OSProcessHandler {
+public class GroovycOSProcessHandler extends BaseOSProcessHandler {
private final List myCompiledItems = new ArrayList();
private final Set toRecompileFiles = new HashSet();
private final List compilerMessages = new ArrayList();
private final StringBuffer stdErr = new StringBuffer();
- private static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.compiler.GroovycOSProcessHandler");
+ private static final Logger LOG = Logger.getInstance("org.jetbrains.jps.incremental.groovy.GroovycOSProcessHandler");
public GroovycOSProcessHandler(Process process, String s) {
- super(process, s);
+ super(process, s, Charset.forName("UTF-8"));
}
public void notifyTextAvailable(final String text, final Key outputType) {
diff --git a/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java b/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java
index 9ee8e9724bc2..3f98223aac9c 100644
--- a/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java
+++ b/jps/jps-builders/src/org/jetbrains/jps/server/ClasspathBootstrap.java
@@ -27,6 +27,7 @@ import gnu.trove.TIntHash;
import net.n3.nanoxml.IXMLBuilder;
import org.codehaus.groovy.GroovyException;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper;
import org.jetbrains.jps.MacroExpander;
import org.objectweb.asm.ClassWriter;
@@ -84,6 +85,7 @@ public class ClasspathBootstrap {
cp.add(getResourcePath(CellConstraints.class)); // jgoodies-forms
cp.add(getResourcePath(NotNullVerifyingInstrumenter.class)); // not-null
cp.add(getResourcePath(IXMLBuilder.class)); // nano-xml
+ cp.add(getResourcePath(GroovyCompilerWrapper.class)); // groovy_rt
final Class optimizedFileManagerClass = getOptimizedFileManagerClass();
if (optimizedFileManagerClass != null) {
diff --git a/plugins/groovy/jetgroovy.iml b/plugins/groovy/jetgroovy.iml
index 883b5316b0df..bcb38c12e2ff 100644
--- a/plugins/groovy/jetgroovy.iml
+++ b/plugins/groovy/jetgroovy.iml
@@ -29,6 +29,7 @@
+
diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java
index e3f09ca1f332..49615536597a 100644
--- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java
+++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java
@@ -72,6 +72,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.groovy.compiler.rt.CompilerMessage;
import org.jetbrains.groovy.compiler.rt.GroovyCompilerWrapper;
import org.jetbrains.groovy.compiler.rt.GroovycRunner;
+import org.jetbrains.jps.incremental.groovy.GroovycOSProcessHandler;
import org.jetbrains.plugins.groovy.GroovyFileType;
import org.jetbrains.plugins.groovy.config.GroovyConfigUtils;
import org.jetbrains.plugins.groovy.extensions.GroovyScriptType;