From fc9f1eec4fd7b5561c19ba0f75f120f3520bc98e Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Fri, 8 Jul 2011 12:30:51 +0200 Subject: [PATCH] TypeInfo.getClassObject(), for now implemented via reflection --- .../codegen/typeInfo/classObjectInTypeInfo.jet | 7 +++++++ .../org/jetbrains/jet/codegen/TypeInfoTest.java | 10 ++++++++++ stdlib/src/jet/typeinfo/TypeInfo.java | 12 ++++++++++++ 3 files changed, 29 insertions(+) create mode 100644 idea/testData/codegen/typeInfo/classObjectInTypeInfo.jet diff --git a/idea/testData/codegen/typeInfo/classObjectInTypeInfo.jet b/idea/testData/codegen/typeInfo/classObjectInTypeInfo.jet new file mode 100644 index 00000000000..d44a879cc01 --- /dev/null +++ b/idea/testData/codegen/typeInfo/classObjectInTypeInfo.jet @@ -0,0 +1,7 @@ +class Point() { + class object { + fun foo(): String = "bar" + } +} + +fun foo() = Point() diff --git a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java index e44854c2a09..539a02e0271 100644 --- a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java @@ -104,6 +104,16 @@ public class TypeInfoTest extends CodegenTestCase { blackBoxFile("typeInfo/forwardTypeParameter.jet"); } + public void testClassObjectInTypeInfo() throws Exception { + loadFile(); + Method foo = generateFunction(); + JetObject jetObject = (JetObject) foo.invoke(null); + TypeInfo typeInfo = jetObject.getTypeInfo(); + final Object object = typeInfo.getClassObject(); + final Method classObjFoo = object.getClass().getMethod("foo"); + assertNotNull(classObjFoo); + } + private Runnable newRunnable() { return new Runnable() { @Override diff --git a/stdlib/src/jet/typeinfo/TypeInfo.java b/stdlib/src/jet/typeinfo/TypeInfo.java index 50c5dddff3d..56607c87bbf 100644 --- a/stdlib/src/jet/typeinfo/TypeInfo.java +++ b/stdlib/src/jet/typeinfo/TypeInfo.java @@ -2,6 +2,7 @@ package jet.typeinfo; import jet.JetObject; +import java.lang.reflect.Field; import java.util.Arrays; /** @@ -26,6 +27,17 @@ public class TypeInfo implements JetObject { this.typeParameters = typeParameters; } + public Object getClassObject() { + try { + final Class implClass = theClass.getClassLoader().loadClass(theClass.getCanonicalName() + "$$Impl"); + final Field classobj = implClass.getField("$classobj"); + return classobj.get(null); + } + catch(Exception e) { + return null; + } + } + public boolean isInstance(Object obj) { if (obj instanceof JetObject) { return isSubtypeOf(((JetObject) obj).getTypeInfo());