From 0284a7ed0984c5487d65fc0dc271eaf6eac9ecf0 Mon Sep 17 00:00:00 2001 From: Peter Gromov Date: Thu, 24 Sep 2009 22:24:05 +0400 Subject: [PATCH] surrender and pass all the possible classpath (includeing impossible groovy) to groovyc runner --- .../groovy/compiler/rt/GroovycRunner.java | 21 +++---- .../groovy/compiler/GroovyCompilerBase.java | 65 +++++++--------------- .../groovy/compiler/GroovyCompilerExtension.java | 2 +- 3 files changed, 27 insertions(+), 61 deletions(-) diff --git a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/GroovycRunner.java b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/GroovycRunner.java index 8ba63af466..4847dace2a 100644 --- a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/GroovycRunner.java +++ b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/GroovycRunner.java @@ -23,7 +23,6 @@ import org.codehaus.groovy.control.messages.WarningMessage; import org.codehaus.groovy.tools.javac.JavaStubCompilationUnit; import java.io.*; -import java.net.URLClassLoader; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.*; @@ -36,7 +35,6 @@ import java.util.*; public class GroovycRunner { - public static final String CLASSPATH = "classpath"; public static final String PATCHERS = "patchers"; public static final String ENCODING = "encoding"; public static final String OUTPUTPATH = "outputpath"; @@ -109,11 +107,11 @@ public class GroovycRunner { final List srcFiles = new ArrayList(); final Map class2File = new HashMap(); - final String moduleClasspath = fillFromArgsFile(argsFile, compilerConfiguration, patchers, compilerMessages, srcFiles, class2File); + fillFromArgsFile(argsFile, compilerConfiguration, patchers, compilerMessages, srcFiles, class2File); if (srcFiles.isEmpty()) return; System.out.println(PRESENTABLE_MESSAGE + "Groovy compiler: loading sources..."); - final CompilationUnit unit = createCompilationUnit(moduleClasspath, forStubs, compilerConfiguration); + final CompilationUnit unit = createCompilationUnit(forStubs, compilerConfiguration); addSources(forStubs, srcFiles, unit); runPatchers(patchers, compilerMessages, class2File, unit); @@ -172,7 +170,7 @@ public class GroovycRunner { String line; - while ((line = reader.readLine()) != null && !line.equals(CLASSPATH)) { + while ((line = reader.readLine()) != null && !line.equals(OUTPUTPATH)) { if (SRC_FILE.equals(line)) { final File file = new File(reader.readLine()); srcFiles.add(file); @@ -184,10 +182,6 @@ public class GroovycRunner { } while (line != null) { - if (line.startsWith(CLASSPATH)) { - moduleClasspath = reader.readLine(); - } - if (line.startsWith(PATCHERS)) { String s; while (!END.equals(s = reader.readLine())) { @@ -323,9 +317,8 @@ public class GroovycRunner { compilerMessages.add(new CompilerMessage(CompilerMessage.WARNING, message + ":\n" + writer, "", -1, -1)); } - private static CompilationUnit createCompilationUnit(String classpath, boolean forStubs, - final CompilerConfiguration compilerConfiguration) { - compilerConfiguration.setClasspath(classpath); + private static CompilationUnit createCompilationUnit(boolean forStubs, final CompilerConfiguration compilerConfiguration) { + compilerConfiguration.setClasspathList(Collections.EMPTY_LIST); final GroovyClassLoader classLoader = buildClassLoaderFor(compilerConfiguration); @@ -353,8 +346,7 @@ public class GroovycRunner { static GroovyClassLoader buildClassLoaderFor(final CompilerConfiguration compilerConfiguration) { return (GroovyClassLoader) AccessController.doPrivileged(new PrivilegedAction() { public Object run() { - URLClassLoader urlClassLoader = new URLClassLoader(GroovyCompilerUtil.convertClasspathToUrls(compilerConfiguration)); - return new GroovyClassLoader(urlClassLoader, compilerConfiguration) { + return new GroovyClassLoader(getClass().getClassLoader(), compilerConfiguration) { public Class loadClass(String name, boolean lookupScriptFiles, boolean preferClassOverScript) throws ClassNotFoundException, CompilationFailedException { try { @@ -362,6 +354,7 @@ public class GroovycRunner { } catch (NoClassDefFoundError e) { final String ncdfe = e.getMessage(); + throw new RuntimeException("Groovyc error: " + ncdfe + " class not found while resolving class " + name + "; try compiling " + ncdfe + " explicitly", e); } catch (LinkageError e) { 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 220bc0a269..56e691a20e 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java @@ -41,9 +41,9 @@ import com.intellij.openapi.projectRoots.SdkType; import com.intellij.openapi.roots.ModuleFileIndex; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.CharsetToolkit; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; @@ -61,8 +61,8 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.groovy.compiler.rt.CompilerMessage; import org.jetbrains.groovy.compiler.rt.GroovycRunner; import org.jetbrains.plugins.groovy.GroovyFileType; +import org.jetbrains.plugins.groovy.config.GroovyConfigUtils; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; -import org.jetbrains.plugins.groovy.util.LibrariesUtil; import java.io.*; import java.nio.charset.Charset; @@ -97,12 +97,22 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { final PathsList classPathBuilder = new PathsList(); classPathBuilder.add(PathUtil.getJarPathForClass(GroovycRunner.class)); - addGroovyJars(module, classPathBuilder); - final ModuleChunk chunk = createChunk(module, compileContext); + + final Library[] libraries = GroovyConfigUtils.getInstance().getSDKLibrariesByModule(module); + if (libraries.length > 0) { + classPathBuilder.addVirtualFiles(Arrays.asList(libraries[0].getFiles(OrderRootType.COMPILATION_CLASSES))); + } + + classPathBuilder.addVirtualFiles(chunk.getCompilationClasspathFiles()); + appendOutputPath(module, classPathBuilder, false); + if (tests) { + appendOutputPath(module, classPathBuilder, true); + } + final List patchers = new SmartList(); for (final GroovyCompilerExtension extension : GroovyCompilerExtension.EP_NAME.getExtensions()) { - extension.enhanceCompilerClassPath(chunk, classPathBuilder); + extension.enhanceCompilationClassPath(chunk, classPathBuilder); patchers.addAll(extension.getCompilationUnitPatchers(chunk)); } @@ -132,7 +142,7 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { try { File fileWithParameters = File.createTempFile("toCompile", ""); - fillFileWithGroovycParameters(module, toCompile, fileWithParameters, compileContext, outputDir, patchers, tests); + fillFileWithGroovycParameters(toCompile, fileWithParameters, outputDir, patchers); commandLine.addParameter(forStubs ? "stubs" : "groovyc"); commandLine.addParameter(fileWithParameters.getPath()); @@ -190,32 +200,6 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { } } - private static void addGroovyJars(Module module, PathsList to) { - final VirtualFile[] classEntries = ModuleRootManager.getInstance(module).getFiles(OrderRootType.CLASSES); - if (!LibrariesUtil.isEmbeddableDistribution(classEntries)) { - final String home = LibrariesUtil.getGroovyLibraryHome(classEntries); - assert StringUtil.isNotEmpty(home); - final String libPath = home + "/lib"; - final File libDir = new File(FileUtil.toSystemDependentName(libPath)); - if (libDir.exists()) { - for (File file : libDir.listFiles()) { - if (file.getName().endsWith(".jar")) { - to.add(file); - } - } - return; - } - } - - //non-traditional distribution - //groovy-all.jar doesn't contain some dependencies like JUnit, so we should find them ourselves in module classpath - for (VirtualFile file : classEntries) { - if (NONTRADITIONAL_GROOVYC_RUNNER_REQUIRED.matcher(file.getName()).matches()) { - to.add(file); - } - } - } - private static CompilerMessageCategory getMessageCategory(CompilerMessage compilerMessage) { String category; category = compilerMessage.getCategory(); @@ -228,8 +212,7 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { return CompilerMessageCategory.ERROR; } - private void fillFileWithGroovycParameters(Module module, List virtualFiles, File f, CompileContext context, - VirtualFile outputDir, final List patchers, boolean tests) { + private void fillFileWithGroovycParameters(List virtualFiles, File f, VirtualFile outputDir, final List patchers) { if (LOG.isDebugEnabled()) { LOG.debug("Running groovyc on: " + virtualFiles.toString()); } @@ -261,15 +244,6 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { printer.println(GroovycRunner.END); } - printer.println(GroovycRunner.CLASSPATH); - final ModuleChunk chunk = createChunk(module, context); - StringBuilder compileClasspath = new StringBuilder(chunk.getCompilationClasspath()); - appendOutputPath(module, compileClasspath, false); - if (tests) { - appendOutputPath(module, compileClasspath, true); - } - printer.println(compileClasspath.toString()); - if (!patchers.isEmpty()) { printer.println(GroovycRunner.PATCHERS); for (final String patcher : patchers) { @@ -290,11 +264,10 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { printer.close(); } - private static void appendOutputPath(Module module, StringBuilder compileClasspath, final boolean forTestClasses) { + private static void appendOutputPath(Module module, PathsList compileClasspath, final boolean forTestClasses) { String output = CompilerPaths.getModuleOutputPath(module, forTestClasses); if (output != null) { - compileClasspath.append(File.pathSeparator); - compileClasspath.append(FileUtil.toSystemDependentName(output)); + compileClasspath.add(FileUtil.toSystemDependentName(output)); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerExtension.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerExtension.java index 44743f8ba6..df545b87a5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerExtension.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerExtension.java @@ -29,7 +29,7 @@ import java.util.List; public abstract class GroovyCompilerExtension { public static final ExtensionPointName EP_NAME = ExtensionPointName.create("org.intellij.groovy.compilerExtension"); - public abstract void enhanceCompilerClassPath(@NotNull ModuleChunk chunk, @NotNull PathsList classPath); + public abstract void enhanceCompilationClassPath(@NotNull ModuleChunk chunk, @NotNull PathsList classPath); @NotNull public abstract List getCompilationUnitPatchers(@NotNull ModuleChunk chunk); -- 2.11.4.GIT