diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java index cfa747615ca..da442ec18ed 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -729,24 +729,8 @@ public class JetTypeMapper extends BindingTraceAware { writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter); signatureWriter.writeParametersStart(); - - if (kind == OwnerKind.TRAIT_IMPL) { - @SuppressWarnings("ConstantConditions") ClassDescriptor containingDeclaration = (ClassDescriptor) parentDescriptor; - signatureWriter.writeParameterType(JvmMethodParameterKind.THIS); - mapType(containingDeclaration.getDefaultType(), signatureWriter, JetTypeMapperMode.IMPL); - signatureWriter.writeParameterTypeEnd(); - } - else { - if (descriptor instanceof AccessorForPropertyDescriptor) { - signatureWriter.writeParameterType(JvmMethodParameterKind.THIS); - mapType(((ClassifierDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), signatureWriter, - JetTypeMapperMode.VALUE); - signatureWriter.writeParameterTypeEnd(); - } - } - + writeThisIfNeeded(descriptor, kind, signatureWriter); writeReceiverIfNeeded(descriptor.getReceiverParameter(), signatureWriter); - signatureWriter.writeParametersEnd(); signatureWriter.writeReturnType(); @@ -767,34 +751,15 @@ public class JetTypeMapper extends BindingTraceAware { writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter); - JetType outType = descriptor.getType(); - signatureWriter.writeParametersStart(); - - String name = PropertyCodegen.setterName(descriptor.getName()); - if (kind == OwnerKind.TRAIT_IMPL) { - ClassDescriptor containingDeclaration = (ClassDescriptor) descriptor.getContainingDeclaration(); - signatureWriter.writeParameterType(JvmMethodParameterKind.THIS); - mapType(containingDeclaration.getDefaultType(), signatureWriter, JetTypeMapperMode.VALUE); - signatureWriter.writeParameterTypeEnd(); - } - else { - if (descriptor instanceof AccessorForPropertyDescriptor) { - signatureWriter.writeParameterType(JvmMethodParameterKind.THIS); - mapType(((ClassifierDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), signatureWriter, - JetTypeMapperMode.VALUE); - signatureWriter.writeParameterTypeEnd(); - } - } - + writeThisIfNeeded(descriptor, kind, signatureWriter); writeReceiverIfNeeded(descriptor.getReceiverParameter(), signatureWriter); - - writeParameter(signatureWriter, outType); - + writeParameter(signatureWriter, descriptor.getType()); signatureWriter.writeParametersEnd(); signatureWriter.writeVoidReturn(); + String name = PropertyCodegen.setterName(descriptor.getName()); JvmMethodSignature jvmMethodSignature = signatureWriter.makeJvmMethodSignature(name); return new JvmPropertyAccessorSignature(jvmMethodSignature, jvmMethodSignature.getKotlinParameterType(jvmMethodSignature.getParameterCount() - 1)); diff --git a/compiler/testData/codegen/box/traits/withRequiredGenericProperty.kt b/compiler/testData/codegen/box/traits/withRequiredGenericProperty.kt new file mode 100644 index 00000000000..23019a5e84b --- /dev/null +++ b/compiler/testData/codegen/box/traits/withRequiredGenericProperty.kt @@ -0,0 +1,19 @@ +abstract class Base { + abstract var s: T +} + +trait Trait : Base { + var value : T + get() = s + set(value) { s = value } +} + +class Derived : Trait, Base() { + override var s = "Fail" +} + +fun box(): String { + val d = Derived() + d.value = "OK" + return d.value +} diff --git a/compiler/testData/codegen/box/traits/withRequiredProperty.kt b/compiler/testData/codegen/box/traits/withRequiredProperty.kt new file mode 100644 index 00000000000..8aac0835791 --- /dev/null +++ b/compiler/testData/codegen/box/traits/withRequiredProperty.kt @@ -0,0 +1,17 @@ +open class Base { + var s = "Fail" +} + +trait Trait : Base { + var value : String + get() = s + set(value) { s = value } +} + +class Derived : Trait, Base() + +fun box(): String { + val d = Derived() + d.value = "OK" + return d.value +} diff --git a/compiler/testData/codegen/box/traits/withRequiredPropertyViaBridge.kt b/compiler/testData/codegen/box/traits/withRequiredPropertyViaBridge.kt new file mode 100644 index 00000000000..aa2acc635a3 --- /dev/null +++ b/compiler/testData/codegen/box/traits/withRequiredPropertyViaBridge.kt @@ -0,0 +1,14 @@ +open class Base + +trait Trait : Base { + private val value : String + get() = "OK" + + fun toString() = object { + fun foo() = value + }.foo() +} + +class Derived : Trait, Base() + +fun box() = "${Derived()}" diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 3535ef1d278..5f412e318bb 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -3275,6 +3275,21 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/traits/withRequired.kt"); } + @TestMetadata("withRequiredGenericProperty.kt") + public void testWithRequiredGenericProperty() throws Exception { + doTest("compiler/testData/codegen/box/traits/withRequiredGenericProperty.kt"); + } + + @TestMetadata("withRequiredProperty.kt") + public void testWithRequiredProperty() throws Exception { + doTest("compiler/testData/codegen/box/traits/withRequiredProperty.kt"); + } + + @TestMetadata("withRequiredPropertyViaBridge.kt") + public void testWithRequiredPropertyViaBridge() throws Exception { + doTest("compiler/testData/codegen/box/traits/withRequiredPropertyViaBridge.kt"); + } + @TestMetadata("withRequiredSuper.kt") public void testWithRequiredSuper() throws Exception { doTest("compiler/testData/codegen/box/traits/withRequiredSuper.kt");