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;