diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 3e3fe413c90..01c767cfd25 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -1,14 +1,9 @@ package org.jetbrains.jet.codegen; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassKind; import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; -import org.jetbrains.jet.lang.psi.JetClass; -import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.TypeProjection; import org.objectweb.asm.Type; /** @@ -67,39 +62,4 @@ public class CodegenUtil { return hasOuterTypeInfo(outerClassDescriptor); } - - public static boolean hasTypeInfoField(JetType type) { - if(type.getConstructor().getParameters().size() > 0) - return true; - - for (JetType jetType : type.getConstructor().getSupertypes()) { - if(hasTypeInfoField(jetType)) - return true; - } - - ClassDescriptor outerClassDescriptor = getOuterClassDescriptor(type.getConstructor().getDeclarationDescriptor()); - if(outerClassDescriptor == null) - return false; - - return hasTypeInfoField(outerClassDescriptor.getDefaultType()); - } - - public static boolean hasDerivedTypeInfoField(JetType type, boolean exceptOwn) { - if(!exceptOwn) { - if(!isInterface(type)) - if(hasTypeInfoField(type)) - return true; - } - - for (JetType jetType : type.getConstructor().getSupertypes()) { - if(hasDerivedTypeInfoField(jetType, false)) - return true; - } - - return false; - } - - public static Type arrayElementType(Type type) { - return Type.getType(type.getDescriptor().substring(1)); - } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index ec5777f8558..1792a90c644 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -2279,7 +2279,8 @@ public class ExpressionCodegen extends JetVisitor { private void generateInstanceOf(StackValue expressionToGen, JetType jetType, boolean leaveExpressionOnStack) { DeclarationDescriptor descriptor = jetType.getConstructor().getDeclarationDescriptor(); - if (jetType.getArguments().size() > 0 || !(descriptor instanceof ClassDescriptor)) { + boolean javaClass = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor) instanceof PsiClass; + if (!javaClass && (jetType.getArguments().size() > 0 || !(descriptor instanceof ClassDescriptor))) { generateTypeInfo(jetType); expressionToGen.put(OBJECT_TYPE, v); if (leaveExpressionOnStack) { @@ -2325,7 +2326,7 @@ public class ExpressionCodegen extends JetVisitor { return; } - if(!CodegenUtil.hasTypeInfoField(jetType)) { + if(!typeMapper.hasTypeInfoField(jetType) && !(bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, jetType.getConstructor().getDeclarationDescriptor()) instanceof PsiClass)) { // TODO: we need some better checks here v.getstatic(typeMapper.mapType(jetType, OwnerKind.IMPLEMENTATION).getInternalName(), "$staticTypeInfo", "Ljet/typeinfo/TypeInfo;"); return; @@ -2387,7 +2388,7 @@ public class ExpressionCodegen extends JetVisitor { ownerType = JetTypeMapper.boxType(ownerType); if (containingDeclaration == context.getContextClass()) { if(!CodegenUtil.isInterface(descriptor)) { - if (CodegenUtil.hasTypeInfoField(defaultType)) { + if (typeMapper.hasTypeInfoField(defaultType)) { v.load(0, JetTypeMapper.TYPE_OBJECT); v.getfield(ownerType.getInternalName(), "$typeInfo", "Ljet/typeinfo/TypeInfo;"); } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 609555fd4df..98838271061 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -339,7 +339,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { iv.putfield(classname, fieldName, interfaceDesc); } - if (CodegenUtil.hasTypeInfoField(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) { + if (state.getTypeMapper().hasTypeInfoField(descriptor.getDefaultType()) && kind == OwnerKind.IMPLEMENTATION) { generateTypeInfoInitializer(frameMap.getFirstTypeParameter(), frameMap.getTypeParameterCount(), iv); } @@ -706,8 +706,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { return; JetType defaultType = descriptor.getDefaultType(); - if(CodegenUtil.hasTypeInfoField(defaultType)) { - if(!CodegenUtil.hasDerivedTypeInfoField(defaultType, true)) { + if(state.getTypeMapper().hasTypeInfoField(defaultType)) { + if(!state.getTypeMapper().hasDerivedTypeInfoField(defaultType, true)) { v.newField(myClass, Opcodes.ACC_PRIVATE, "$typeInfo", "Ljet/typeinfo/TypeInfo;", null, null); MethodVisitor mv = v.newMethod(myClass, Opcodes.ACC_PUBLIC, "getTypeInfo", "()Ljet/typeinfo/TypeInfo;", null, null); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java index 93646bbb4a0..66737f8de1e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java @@ -186,6 +186,39 @@ public class JetTypeMapper { return type; } + public boolean hasTypeInfoField(JetType type) { + if(type.getConstructor().getParameters().size() > 0) { + if(!(bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, type.getConstructor().getDeclarationDescriptor()) instanceof PsiClass)) + return true; + } + + for (JetType jetType : type.getConstructor().getSupertypes()) { + if(hasTypeInfoField(jetType)) + return true; + } + + ClassDescriptor outerClassDescriptor = CodegenUtil.getOuterClassDescriptor(type.getConstructor().getDeclarationDescriptor()); + if(outerClassDescriptor == null) + return false; + + return hasTypeInfoField(outerClassDescriptor.getDefaultType()); + } + + public boolean hasDerivedTypeInfoField(JetType type, boolean exceptOwn) { + if(!exceptOwn) { + if(!CodegenUtil.isInterface(type)) + if(hasTypeInfoField(type)) + return true; + } + + for (JetType jetType : type.getConstructor().getSupertypes()) { + if(hasDerivedTypeInfoField(jetType, false)) + return true; + } + + return false; + } + public String jvmName(ClassDescriptor jetClass, OwnerKind kind) { PsiElement declaration = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, jetClass); if (declaration instanceof PsiClass) { @@ -665,9 +698,12 @@ public class JetTypeMapper { valueParameterTypes.add(type); } - List typeParameters = classDescriptor.getTypeConstructor().getParameters(); - for (int n = typeParameters.size(); n > 0; n--) { - parameterTypes.add(TYPE_TYPEINFO); + PsiElement psiElement = bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, classDescriptor); + if(!(psiElement instanceof PsiClass)) { + List typeParameters = classDescriptor.getTypeConstructor().getParameters(); + for (int n = typeParameters.size(); n > 0; n--) { + parameterTypes.add(TYPE_TYPEINFO); + } } return new Method("", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()])); @@ -678,7 +714,7 @@ public class JetTypeMapper { final Method method = mapConstructorSignature(descriptor, valueParameterTypes); String owner = jvmName(descriptor.getContainingDeclaration(), kind); final CallableMethod result = new CallableMethod(owner, method, Opcodes.INVOKESPECIAL, valueParameterTypes); - result.setAcceptsTypeArguments(true); + result.setAcceptsTypeArguments(!(bindingContext.get(BindingContext.DESCRIPTOR_TO_DECLARATION, descriptor.getContainingDeclaration()) instanceof PsiClass)); return result; } diff --git a/compiler/testData/codegen/super/basicmethod.jet b/compiler/testData/codegen/super/basicmethod.jet new file mode 100644 index 00000000000..ab735673036 --- /dev/null +++ b/compiler/testData/codegen/super/basicmethod.jet @@ -0,0 +1,13 @@ +class N() : java.util.ArrayList() { + override fun add(el: String) : Boolean { + super.add(el) + return super.add(el + el) + } +} + +fun box(): String { + val n = N() + n.add("239") + if (n.get(0) == "239" && n.get(1) == "239239") return "OK"; + return "fail"; +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java b/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java index 66600588972..45bf1a6c19b 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/SuperGenTest.java @@ -10,4 +10,9 @@ public class SuperGenTest extends CodegenTestCase { blackBoxFile("/super/traitproperty.jet"); System.out.println(generateToText()); } + + public void testBasicMethod () { + blackBoxFile("/super/basicmethod.jet"); + System.out.println(generateToText()); + } }