From 1966d6d12c0edd49d39bed056b47eaad51d51a18 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 13 May 2011 13:42:17 +0200 Subject: [PATCH] implementation classes implement JetObject; initial implementation of getTypeInfo() method and typeof operator --- .../jetbrains/jet/codegen/ClassCodegen.java | 44 ++++++++++++++++++- .../org/jetbrains/jet/codegen/Codegens.java | 7 +-- .../jet/codegen/ExpressionCodegen.java | 8 ++++ .../jet/codegen/NamespaceCodegen.java | 3 +- .../testData/codegen/typeInfo/getTypeInfo.jet | 4 ++ .../codegen/typeInfo/typeOfOperator.jet | 7 +++ .../jetbrains/jet/codegen/ClassGenTest.java | 5 +-- .../jet/codegen/CodegenTestCase.java | 26 ++++++++++- .../jet/codegen/PropertyGenTest.java | 17 ++++--- .../jetbrains/jet/codegen/TypeInfoTest.java | 32 ++++++++++++++ stdlib/src/jet/typeinfo/TypeInfo.java | 7 ++- 11 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 idea/testData/codegen/typeInfo/getTypeInfo.jet create mode 100644 idea/testData/codegen/typeInfo/typeOfOperator.jet create mode 100644 idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java diff --git a/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java b/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java index 7242197181a..36975870014 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.codegen; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; +import jet.typeinfo.TypeInfo; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; @@ -27,6 +28,8 @@ public class ClassCodegen { private final Codegens factory; private final JetTypeMapper typeMapper; + private static final Type TYPEINFO_TYPE = Type.getType(TypeInfo.class); + public ClassCodegen(Project project, Codegens factory, BindingContext bindingContext) { this.project = project; this.factory = factory; @@ -73,11 +76,17 @@ public class ClassCodegen { JetTypeMapper.jvmName(descriptor, kind), null, superClass, - new String[] {JetTypeMapper.jvmNameForInterface(descriptor)} + new String[] { "jet/JetObject", JetTypeMapper.jvmNameForInterface(descriptor) } ); + v.visitField(Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC, "$typeInfo", "Ljet/typeinfo/TypeInfo;", null, null); + + generateStaticInitializer(descriptor, v); + generatePrimaryConstructor(aClass, v, kind); + generateGetTypeInfo(aClass, v); + generateClassBody(aClass, v, kind); v.visitEnd(); @@ -349,4 +358,37 @@ public class ClassCodegen { } } } + + private void generateStaticInitializer(ClassDescriptor descriptor, ClassVisitor cv) { + final MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, + "", "()V", null, null); + mv.visitCode(); + + InstructionAdapter v = new InstructionAdapter(mv); + v.anew(TYPEINFO_TYPE); + v.dup(); + v.aconst(Type.getObjectType(JetTypeMapper.jvmNameForInterface(descriptor))); + v.invokespecial("jet/typeinfo/TypeInfo", "", "(Ljava/lang/Class;)V"); + v.putstatic(JetTypeMapper.jvmNameForImplementation(descriptor), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); + + mv.visitInsn(Opcodes.RETURN); + mv.visitMaxs(0, 0); + + mv.visitEnd(); + } + + private void generateGetTypeInfo(JetClass aClass, ClassVisitor cv) { + final MethodVisitor mv = cv.visitMethod(Opcodes.ACC_PUBLIC, + "getTypeInfo", + "()Ljet/typeinfo/TypeInfo;", + null /* TODO */, + null); + mv.visitCode(); + InstructionAdapter v = new InstructionAdapter(mv); + ClassDescriptor descriptor = bindingContext.getClassDescriptor(aClass); + v.getstatic(JetTypeMapper.jvmNameForImplementation(descriptor), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); + v.areturn(TYPEINFO_TYPE); + mv.visitMaxs(0, 0); + mv.visitEnd(); + } } diff --git a/idea/src/org/jetbrains/jet/codegen/Codegens.java b/idea/src/org/jetbrains/jet/codegen/Codegens.java index af2df41fd4e..5eddebfec55 100644 --- a/idea/src/org/jetbrains/jet/codegen/Codegens.java +++ b/idea/src/org/jetbrains/jet/codegen/Codegens.java @@ -10,10 +10,7 @@ import org.objectweb.asm.util.TraceClassVisitor; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author max @@ -22,7 +19,7 @@ public class Codegens { private final Project project; private final boolean isText; private final Map ns2codegen = new HashMap(); - private final Map generators = new HashMap(); + private final Map generators = new LinkedHashMap(); private boolean isDone = false; public Codegens(Project project, boolean text) { diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 2dd632bd2b3..4260ee3e098 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -6,6 +6,7 @@ import com.intellij.psi.search.ProjectScope; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import jet.IntRange; +import jet.JetObject; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; @@ -44,6 +45,7 @@ public class ExpressionCodegen extends JetVisitor { private static final Type ITERATOR_TYPE = Type.getType(Iterator.class); private static final Type INT_RANGE_TYPE = Type.getType(IntRange.class); + private static final Type JET_OBJECT_TYPE = Type.getType(JetObject.class); private final Stack