summaryrefslogtreecommitdiff
path: root/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java')
-rw-r--r--plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java24
1 files changed, 21 insertions, 3 deletions
diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java
index 855deba56575..03e3b544b5ed 100644
--- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java
+++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java
@@ -18,6 +18,7 @@ package org.jetbrains.jps.incremental.groovy;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.SystemInfo;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
@@ -58,6 +59,8 @@ import org.jetbrains.jps.model.library.sdk.JpsSdk;
import org.jetbrains.jps.service.JpsServiceManager;
import org.jetbrains.jps.service.SharedThreadPool;
import org.jetbrains.org.objectweb.asm.ClassReader;
+import org.jetbrains.org.objectweb.asm.ClassVisitor;
+import org.jetbrains.org.objectweb.asm.Opcodes;
import java.io.File;
import java.io.IOException;
@@ -434,9 +437,14 @@ public class GroovyBuilder extends ModuleLevelBuilder {
final String sourcePath = FileUtil.toSystemIndependentName(item.sourcePath);
final String outputPath = FileUtil.toSystemIndependentName(item.outputPath);
final File outputFile = new File(outputPath);
- outputConsumer.registerOutputFile(target, outputFile, Collections.singleton(sourcePath));
+ final File srcFile = new File(sourcePath);
try {
- callback.associate(outputPath, sourcePath, new ClassReader(FileUtil.loadFileBytes(outputFile)));
+ final byte[] bytes = FileUtil.loadFileBytes(outputFile);
+ outputConsumer.registerCompiledClass(
+ target,
+ new CompiledClass(outputFile, srcFile, readClassName(bytes), new BinaryContent(bytes))
+ );
+ callback.associate(outputPath, sourcePath, new ClassReader(bytes));
}
catch (Throwable e) {
// need this to make sure that unexpected errors in, for example, ASM will not ruin the compilation
@@ -446,7 +454,7 @@ public class GroovyBuilder extends ModuleLevelBuilder {
myBuilderName, BuildMessage.Kind.WARNING, message + "\n" + CompilerMessage.getTextFromThrowable(e), sourcePath)
);
}
- successfullyCompiledFiles.add(new File(sourcePath));
+ successfullyCompiledFiles.add(srcFile);
}
}
}
@@ -454,6 +462,16 @@ public class GroovyBuilder extends ModuleLevelBuilder {
return JavaBuilderUtil.updateMappings(context, delta, dirtyFilesHolder, chunk, toCompile, successfullyCompiledFiles);
}
+ private static String readClassName(byte[] classBytes) throws IOException{
+ final Ref<String> nameRef = Ref.create(null);
+ new ClassReader(classBytes).accept(new ClassVisitor(Opcodes.ASM5) {
+ public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+ nameRef.set(name.replace('/', '.'));
+ }
+ }, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
+ return nameRef.get();
+ }
+
private static Collection<String> generateClasspath(CompileContext context, ModuleChunk chunk) {
final Set<String> cp = new LinkedHashSet<String>();
//groovy_rt.jar