diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index aa0c0d88e4d..ba161f31dff 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1688,10 +1688,7 @@ public class ExpressionCodegen extends JetVisitor { private void generateInstanceOf(Runnable expressionGen, JetType jetType, boolean leaveExpressionOnStack) { DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); - if (!(descriptor instanceof ClassDescriptor)) { - throw new UnsupportedOperationException("don't know how to handle non-class types"); - } - if (jetType.getArguments().size() > 0) { + if (jetType.getArguments().size() > 0 || !(descriptor instanceof ClassDescriptor)) { generateTypeInfo(jetType); expressionGen.run(); if (leaveExpressionOnStack) { @@ -1712,14 +1709,8 @@ public class ExpressionCodegen extends JetVisitor { private void generateTypeInfo(JetType jetType) { DeclarationDescriptor declarationDescriptor = jetType.getConstructor().getDeclarationDescriptor(); if (declarationDescriptor instanceof TypeParameterDescriptor) { - DeclarationDescriptor containingDeclaration = declarationDescriptor.getContainingDeclaration(); - if (containingDeclaration == contextType && contextType instanceof ClassDescriptor) { - loadTypeInfo(typeMapper, (ClassDescriptor) contextType, v); - v.iconst(((TypeParameterDescriptor) declarationDescriptor).getIndex()); - v.invokevirtual("jet/typeinfo/TypeInfo", "getTypeParameter", "(I)Ljet/typeinfo/TypeInfo;"); - return; - } - throw new UnsupportedOperationException("don't know what this type parameter resolves to"); + loadTypeParameterTypeInfo(declarationDescriptor); + return; } final Type jvmType = typeMapper.mapType(jetType, OwnerKind.INTERFACE); @@ -1751,6 +1742,17 @@ public class ExpressionCodegen extends JetVisitor { } } + private void loadTypeParameterTypeInfo(DeclarationDescriptor declarationDescriptor) { + DeclarationDescriptor containingDeclaration = declarationDescriptor.getContainingDeclaration(); + if (containingDeclaration == contextType && contextType instanceof ClassDescriptor) { + loadTypeInfo(typeMapper, (ClassDescriptor) contextType, v); + v.iconst(((TypeParameterDescriptor) declarationDescriptor).getIndex()); + v.invokevirtual("jet/typeinfo/TypeInfo", "getTypeParameter", "(I)Ljet/typeinfo/TypeInfo;"); + return; + } + throw new UnsupportedOperationException("don't know what this type parameter resolves to"); + } + @Override public void visitWhenExpression(JetWhenExpression expression) { JetExpression expr = expression.getSubjectExpression(); diff --git a/idea/testData/codegen/typeInfo/isTypeParameter.jet b/idea/testData/codegen/typeInfo/isTypeParameter.jet new file mode 100644 index 00000000000..dc4beebff2e --- /dev/null +++ b/idea/testData/codegen/typeInfo/isTypeParameter.jet @@ -0,0 +1,13 @@ +class Foo() {} +class Bar() {} + +class InstanceChecker() { + fun check(obj: Any?) = obj is T +} + +fun box(): String { + val checker = InstanceChecker() + if (!checker.check(Foo())) return "fail 1" + if (checker.check(Bar())) return "fail 2" + return "OK" +} diff --git a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java index 79b950310aa..1535e5e062b 100644 --- a/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java +++ b/idea/tests/org/jetbrains/jet/codegen/TypeInfoTest.java @@ -73,6 +73,10 @@ public class TypeInfoTest extends CodegenTestCase { assertFalse((Boolean) foo.invoke(null)); } + public void testIsTypeParameter() throws Exception { + blackBoxFile("typeInfo/isTypeParameter.jet"); + } + public void testAsSafeWithGenerics() throws Exception { loadFile(); Method foo = generateFunction();