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);