diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index d7431e8ff05..f366741c4eb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -748,8 +748,26 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { if (jetClass.isTrait()) { int flags = ACC_PUBLIC; // TODO. - Method function = typeMapper.mapSignature(fun.getName(), fun).getAsmMethod(); - Method functionOriginal = typeMapper.mapSignature(fun.getName(), fun.getOriginal()).getAsmMethod(); + Method function; + Method functionOriginal; + if (fun instanceof PropertyAccessorDescriptor) { + PropertyDescriptor property = ((PropertyAccessorDescriptor) fun).getCorrespondingProperty(); + if (fun instanceof PropertyGetterDescriptor) { + function = typeMapper.mapGetterSignature(property, OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod(); + functionOriginal = typeMapper.mapGetterSignature(property.getOriginal(), OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod(); + } + else if (fun instanceof PropertySetterDescriptor) { + function = typeMapper.mapSetterSignature(property, OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod(); + functionOriginal = typeMapper.mapSetterSignature(property.getOriginal(), OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod(); + } + else { + throw new IllegalStateException("Accessor is neither getter, nor setter, what is it?"); + } + } + else { + function = typeMapper.mapSignature(fun.getName(), fun).getAsmMethod(); + functionOriginal = typeMapper.mapSignature(fun.getName(), fun.getOriginal()).getAsmMethod(); + } final MethodVisitor mv = v.newMethod(myClass, flags, function.getName(), function.getDescriptor(), null, null); AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(fun); @@ -758,12 +776,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv); if (fun instanceof PropertyAccessorDescriptor) { aw.writeFlags(JvmStdlibNames.JET_METHOD_FLAG_PROPERTY_BIT); + aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); + aw.writePropertyType(jvmSignature.getKotlinReturnType()); } else { aw.writeFlags(); + aw.writeNullableReturnType(fun.getReturnType().isNullable()); + aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); + aw.writeReturnType(jvmSignature.getKotlinReturnType()); } - aw.writeNullableReturnType(fun.getReturnType().isNullable()); - aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter()); - aw.writeReturnType(jvmSignature.getKotlinReturnType()); aw.visitEnd(); if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) { diff --git a/compiler/testData/codegen/traits/inheritedFun.jet b/compiler/testData/codegen/traits/inheritedFun.jet new file mode 100644 index 00000000000..47fe9223907 --- /dev/null +++ b/compiler/testData/codegen/traits/inheritedFun.jet @@ -0,0 +1,10 @@ +//KT-2206 +trait A { + fun f():Int = 239 +} + +class B() : A + +fun box() : String { + return if (B().f() == 239) "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/testData/codegen/traits/inheritedVar.jet b/compiler/testData/codegen/traits/inheritedVar.jet new file mode 100644 index 00000000000..b24548fad27 --- /dev/null +++ b/compiler/testData/codegen/traits/inheritedVar.jet @@ -0,0 +1,14 @@ +//KT-2206 + +trait A { + var a:Int + get() = 239 + set(value) { + } +} + +class B() : A + +fun box() : String { + return if (B().a == 239) "OK" else "fail" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java index f690a0791d5..7bce2e8163f 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java @@ -48,4 +48,12 @@ public class TraitsTest extends CodegenTestCase { public void testStdlib () throws Exception { blackBoxFile("traits/stdlib.jet"); } + + public void testInheritedFun() throws Exception { + blackBoxFile("traits/inheritedFun.jet"); + } + + public void testInheritedVar() throws Exception { + blackBoxFile("traits/inheritedVar.jet"); + } }