From 427e22df3b403e56623a169e33d49b4734591b56 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 27 Oct 2011 18:17:09 +0200 Subject: [PATCH] compile grails without traversing psi to get qualified class names --- ...oader.java => AstAwareResourceLoader.java} | 16 ++++++------ .../groovy/compiler/rt/GroovycRunner.java | 25 +++++++++++-------- .../groovy/compiler/GroovyCompilerBase.java | 17 ------------- 3 files changed, 24 insertions(+), 34 deletions(-) rename plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/{PsiAwareResourceLoader.java => AstAwareResourceLoader.java} (82%) diff --git a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/PsiAwareResourceLoader.java b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/AstAwareResourceLoader.java similarity index 82% rename from plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/PsiAwareResourceLoader.java rename to plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/AstAwareResourceLoader.java index 6d598c854b66..b62c17d64b5b 100644 --- a/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/PsiAwareResourceLoader.java +++ b/plugins/groovy/rt/src/org/jetbrains/groovy/compiler/rt/AstAwareResourceLoader.java @@ -18,16 +18,18 @@ package org.jetbrains.groovy.compiler.rt; import groovy.lang.GroovyResourceLoader; -import java.util.Map; -import java.net.URL; -import java.net.MalformedURLException; import java.io.File; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; -public class PsiAwareResourceLoader implements GroovyResourceLoader { - private final Map myClass2File; +public class AstAwareResourceLoader implements GroovyResourceLoader { + final Map myClass2File; - PsiAwareResourceLoader(Map class2File) { - myClass2File = class2File; + AstAwareResourceLoader() { + myClass2File = Collections.synchronizedMap(new HashMap()); } public URL loadGroovySource(String className) throws MalformedURLException { 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 137894abfa06..f15d86c210a8 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 @@ -16,6 +16,7 @@ package org.jetbrains.groovy.compiler.rt; import groovy.lang.GroovyClassLoader; +import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.control.*; import org.codehaus.groovy.control.messages.WarningMessage; import org.codehaus.groovy.tools.javac.JavaAwareCompilationUnit; @@ -111,10 +112,9 @@ public class GroovycRunner { final List compilerMessages = new ArrayList(); final List patchers = new ArrayList(); final List srcFiles = new ArrayList(); - final Map class2File = new HashMap(); final String[] finalOutput = new String[1]; - fillFromArgsFile(argsFile, compilerConfiguration, patchers, compilerMessages, srcFiles, class2File, finalOutput); + fillFromArgsFile(argsFile, compilerConfiguration, patchers, compilerMessages, srcFiles, finalOutput); if (srcFiles.isEmpty()) return; if (forStubs) { @@ -126,7 +126,7 @@ public class GroovycRunner { System.out.println(PRESENTABLE_MESSAGE + "Groovyc: loading sources..."); final CompilationUnit unit = createCompilationUnit(forStubs, compilerConfiguration, finalOutput[0]); addSources(forStubs, srcFiles, unit); - runPatchers(patchers, compilerMessages, class2File, unit); + runPatchers(patchers, compilerMessages, unit); System.out.println(PRESENTABLE_MESSAGE + "Groovyc: compiling..."); final List compiledFiles = GroovyCompilerWrapper.compile(compilerMessages, forStubs, unit); @@ -173,7 +173,7 @@ public class GroovycRunner { } private static String fillFromArgsFile(File argsFile, CompilerConfiguration compilerConfiguration, List patchers, List compilerMessages, - List srcFiles, Map class2File, String[] finalOutput) { + List srcFiles, String[] finalOutput) { String moduleClasspath = null; BufferedReader reader = null; @@ -192,10 +192,6 @@ public class GroovycRunner { final File file = new File(reader.readLine()); srcFiles.add(file); - while (!END.equals(line = reader.readLine())) { - class2File.put(line, file); - } - } while (line != null) { @@ -269,9 +265,18 @@ public class GroovycRunner { } } - private static void runPatchers(List patchers, List compilerMessages, Map class2File, CompilationUnit unit) { + private static void runPatchers(List patchers, List compilerMessages, CompilationUnit unit) { if (!patchers.isEmpty()) { - final PsiAwareResourceLoader loader = new PsiAwareResourceLoader(class2File); + final AstAwareResourceLoader loader = new AstAwareResourceLoader(); + unit.addPhaseOperation(new CompilationUnit.SourceUnitOperation() { + public void call(SourceUnit source) throws CompilationFailedException { + File file = new File(source.getName()); + List classes = source.getAST().getClasses(); + for (int i = 0; i < classes.size(); i++) { + loader.myClass2File.put(((ClassNode)classes.get(i)).getName(), file); + } + } + }, Phases.CONVERSION); for (int i = 0; i < patchers.size(); i++) { final CompilationUnitPatcher patcher = (CompilationUnitPatcher)patchers.get(i); try { 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 76d76fb8faf5..3c1ae5c679f9 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/compiler/GroovyCompilerBase.java @@ -57,7 +57,6 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.encoding.EncodingProjectManager; -import com.intellij.psi.PsiClass; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.util.Chunk; @@ -77,7 +76,6 @@ import org.jetbrains.plugins.groovy.config.GroovyConfigUtils; import org.jetbrains.plugins.groovy.extensions.GroovyScriptType; import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; -import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.util.GroovyUtils; import javax.swing.*; @@ -333,21 +331,6 @@ public abstract class GroovyCompilerBase implements TranslatingCompiler { for (final VirtualFile item : virtualFiles) { printer.println(GroovycRunner.SRC_FILE); printer.println(FileUtil.toSystemDependentName(item.getPath())); - - AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock(); - try { - final PsiFile file = PsiManager.getInstance(myProject).findFile(item); - if (file instanceof GroovyFileBase) { - for (PsiClass psiClass : ((GroovyFileBase)file).getClasses()) { - printer.println(psiClass.getQualifiedName()); - } - } - } - finally { - accessToken.finish(); - } - - printer.println(GroovycRunner.END); } if (!patchers.isEmpty()) {