diff --git a/.idea/libraries/asm.xml b/.idea/libraries/asm.xml
index 479c49dcb20..fc8083b4e42 100644
--- a/.idea/libraries/asm.xml
+++ b/.idea/libraries/asm.xml
@@ -4,6 +4,8 @@
-
+
+
+
\ No newline at end of file
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java
new file mode 100644
index 00000000000..dc4075d0cf4
--- /dev/null
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java
@@ -0,0 +1,57 @@
+package org.jetbrains.jet.codegen;
+
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.util.TraceClassVisitor;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * @author max
+ */
+public interface ClassBuilderFactory {
+ ClassBuilder newClassBuilder();
+ String asText(ClassBuilder builder);
+ byte[] asBytes(ClassBuilder builder);
+
+ ClassBuilderFactory TEXT = new ClassBuilderFactory() {
+ @Override
+ public ClassBuilder newClassBuilder() {
+ return new ClassBuilder(new TraceClassVisitor(new PrintWriter(new StringWriter())));
+ }
+
+ @Override
+ public String asText(ClassBuilder builder) {
+ TraceClassVisitor visitor = (TraceClassVisitor) builder.getVisitor();
+
+ StringWriter writer = new StringWriter();
+ visitor.print(new PrintWriter(writer));
+
+ return writer.toString();
+ }
+
+ @Override
+ public byte[] asBytes(ClassBuilder builder) {
+ throw new UnsupportedOperationException("TEXT generator asked for bytes");
+ }
+ };
+
+ ClassBuilderFactory BINARIES = new ClassBuilderFactory() {
+ @Override
+ public ClassBuilder newClassBuilder() {
+ return new ClassBuilder(new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS));
+ }
+
+ @Override
+ public String asText(ClassBuilder builder) {
+ throw new UnsupportedOperationException("BINARIES generator asked for text");
+ }
+
+ @Override
+ public byte[] asBytes(ClassBuilder builder) {
+ ClassWriter visitor = (ClassWriter) builder.getVisitor();
+ return visitor.toByteArray();
+ }
+ };
+
+}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
index 0fadb452d83..98da6b5fb40 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
@@ -1,42 +1,26 @@
package org.jetbrains.jet.codegen;
-import com.intellij.openapi.project.Project;
import org.jetbrains.jet.lang.psi.JetNamespace;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ClassWriter;
-import org.objectweb.asm.util.TraceClassVisitor;
-import java.io.PrintWriter;
-import java.io.StringWriter;
import java.util.*;
/**
* @author max
*/
public class ClassFileFactory {
- private final Project project;
- private final boolean isText;
+ private final ClassBuilderFactory builderFactory;
private final Map ns2codegen = new HashMap();
private final Map generators = new LinkedHashMap();
private boolean isDone = false;
public final GenerationState state;
- public ClassFileFactory(Project project, boolean text, GenerationState state) {
- this.project = project;
- isText = text;
+ public ClassFileFactory(ClassBuilderFactory builderFactory, GenerationState state) {
+ this.builderFactory = builderFactory;
this.state = state;
}
ClassBuilder newVisitor(String filePath) {
- ClassVisitor visitor;
- if (isText) {
- visitor = new TraceClassVisitor(new PrintWriter(new StringWriter()));
- }
- else {
- visitor = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
- }
-
- final ClassBuilder answer = new ClassBuilder(visitor);
+ final ClassBuilder answer = builderFactory.newClassBuilder();
generators.put(filePath, answer);
return answer;
}
@@ -68,25 +52,13 @@ public class ClassFileFactory {
}
public String asText(String file) {
- assert isText : "Need to create with text=true";
-
done();
-
- TraceClassVisitor visitor = (TraceClassVisitor) generators.get(file).getVisitor();
-
- StringWriter writer = new StringWriter();
- visitor.print(new PrintWriter(writer));
-
- return writer.toString();
+ return builderFactory.asText(generators.get(file));
}
public byte[] asBytes(String file) {
- assert !isText : "This is debug stuff, only produces texts.";
-
done();
-
- ClassWriter visitor = (ClassWriter) generators.get(file).getVisitor();
- return visitor.toByteArray();
+ return builderFactory.asBytes(generators.get(file));
}
public List files() {
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
index 8a4ec90771a..5c50f0bcf7b 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
@@ -28,10 +28,10 @@ public class GenerationState {
private final JetStandardLibrary standardLibrary;
private final IntrinsicMethods intrinsics;
- public GenerationState(Project project, boolean text) {
+ public GenerationState(Project project, ClassBuilderFactory builderFactory) {
this.project = project;
this.standardLibrary = JetStandardLibrary.getJetStandardLibrary(project);
- this.factory = new ClassFileFactory(project, text, this);
+ this.factory = new ClassFileFactory(builderFactory, this);
this.intrinsics = new IntrinsicMethods(project, standardLibrary);
}
diff --git a/compiler/backend/src/org/jetbrains/jet/compiler/CompileSession.java b/compiler/backend/src/org/jetbrains/jet/compiler/CompileSession.java
index c166906ed87..7f643b90d14 100644
--- a/compiler/backend/src/org/jetbrains/jet/compiler/CompileSession.java
+++ b/compiler/backend/src/org/jetbrains/jet/compiler/CompileSession.java
@@ -5,6 +5,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import org.jetbrains.jet.JetCoreEnvironment;
+import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
@@ -93,7 +94,7 @@ public class CompileSession {
}
public ClassFileFactory generate() {
- GenerationState generationState = new GenerationState(myEnvironment.getProject(), false);
+ GenerationState generationState = new GenerationState(myEnvironment.getProject(), ClassBuilderFactory.BINARIES);
generationState.compileCorrectNamespaces(myBindingContext, mySourceFileNamespaces);
return generationState.getFactory();
}
diff --git a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java
index e6ec1009270..4bff106d65b 100644
--- a/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java
+++ b/compiler/tests/org/jetbrains/jet/codegen/CodegenTestCase.java
@@ -98,7 +98,7 @@ public abstract class CodegenTestCase extends JetLiteFixture {
}
protected String generateToText() {
- GenerationState state = new GenerationState(getProject(), true);
+ GenerationState state = new GenerationState(getProject(), ClassBuilderFactory.TEXT);
AnalyzingUtils.checkForSyntacticErrors(myFile);
state.compile(myFile);
@@ -152,7 +152,7 @@ public abstract class CodegenTestCase extends JetLiteFixture {
protected ClassFileFactory generateClassesInFile() {
try {
- GenerationState state = new GenerationState(getProject(), false);
+ GenerationState state = new GenerationState(getProject(), ClassBuilderFactory.BINARIES);
AnalyzingUtils.checkForSyntacticErrors(myFile);
state.compile(myFile);
diff --git a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java
index 7327491ec3c..162d97555e2 100644
--- a/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java
+++ b/idea/src/org/jetbrains/jet/plugin/compiler/JetCompiler.java
@@ -16,6 +16,7 @@ import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.util.Chunk;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.jet.codegen.ClassBuilderFactory;
import org.jetbrains.jet.codegen.ClassFileFactory;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowDataTraceFactory;
@@ -69,7 +70,7 @@ public class JetCompiler implements TranslatingCompiler {
public void run() {
VirtualFile[] allFiles = compileContext.getCompileScope().getFiles(null, true);
- GenerationState generationState = new GenerationState(compileContext.getProject(), false);
+ GenerationState generationState = new GenerationState(compileContext.getProject(), ClassBuilderFactory.BINARIES);
List namespaces = Lists.newArrayList();
for (VirtualFile virtualFile : allFiles) {
PsiFile psiFile = PsiManager.getInstance(compileContext.getProject()).findFile(virtualFile);