From 8c0c0f9d6c0deef9adfa55fd43e02ff5820c0671 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Tue, 12 Jul 2011 13:41:57 +0200 Subject: [PATCH] generate no-arg typeinfo --- .../jet/codegen/ExpressionCodegen.java | 19 +++++++++++++++---- ...{typeOfOperator.jet => oneArgTypeinfo.jet} | 0 .../jetbrains/jet/codegen/TypeInfoTest.java | 9 ++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) rename idea/testData/codegen/typeInfo/{typeOfOperator.jet => oneArgTypeinfo.jet} (100%) diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index ab362550b7a..c0c2cfec643 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -829,11 +829,18 @@ public class ExpressionCodegen extends JetVisitor { if (args.size() == 1) { gen(args.get(0).getArgumentExpression(), JET_OBJECT_TYPE); v.invokeinterface("jet/JetObject", "getTypeInfo", "()Ljet/typeinfo/TypeInfo;"); - myStack.push(StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO)); + } + else if (args.size() == 0) { + final List typeArguments = expression.getTypeArguments(); + if (typeArguments.size() != 1) { + throw new UnsupportedOperationException("one type argument expected"); + } + pushTypeArgument(typeArguments.get(0)); } else { - throw new UnsupportedOperationException("only one-arg form of typeinfo() is now supported"); + throw new UnsupportedOperationException("no such form of typeinfo()"); } + myStack.push(StackValue.onStack(JetTypeMapper.TYPE_TYPEINFO)); } private PsiElement resolveCalleeToDeclaration(DeclarationDescriptor funDescriptor) { @@ -1503,11 +1510,15 @@ public class ExpressionCodegen extends JetVisitor { private void pushTypeArguments(JetCall expression) { for (JetTypeProjection jetTypeArgument : expression.getTypeArguments()) { - JetType typeArgument = bindingContext.resolveTypeReference(jetTypeArgument.getTypeReference()); - generateTypeInfo(typeArgument); + pushTypeArgument(jetTypeArgument); } } + private void pushTypeArgument(JetTypeProjection jetTypeArgument) { + JetType typeArgument = bindingContext.resolveTypeReference(jetTypeArgument.getTypeReference()); + generateTypeInfo(typeArgument); + } + private void pushOuterClassArguments(ClassDescriptor classDecl) { if (classDecl.getContainingDeclaration() instanceof ClassDescriptor) { v.load(0, JetTypeMapper.jetImplementationType(classDecl)); diff --git a/idea/testData/codegen/typeInfo/typeOfOperator.jet b/idea/testData/codegen/typeInfo/oneArgTypeinfo.jet similarity index 100% rename from idea/testData/codegen/typeInfo/typeOfOperator.jet rename to idea/testData/codegen/typeInfo/oneArgTypeinfo.jet diff --git a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java index 539a02e0271..d440c3abd22 100644 --- a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java @@ -23,13 +23,20 @@ public class TypeInfoTest extends CodegenTestCase { assertNotNull(typeInfo); } - public void testTypeOfOperator() throws Exception { + public void testOneArgTypeinfo() throws Exception { loadFile(); Method foo = generateFunction(); TypeInfo typeInfo = (TypeInfo) foo.invoke(null); assertNotNull(typeInfo); } + public void testNoArgTypeinfo() throws Exception { + loadText("fun foo() = typeinfo.typeinfo()"); + Method foo = generateFunction(); + TypeInfo typeInfo = (TypeInfo) foo.invoke(null); + assertSame(TypeInfo.INT_TYPE_INFO, typeInfo); + } + public void testAsSafeOperator() throws Exception { loadText("fun foo(x: Any) = x as? Runnable"); Method foo = generateFunction();