From 89b8bbec57f0bc2db8ef1a99c7dddb8e93d6a1b8 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 6 Nov 2012 15:42:22 +0400 Subject: [PATCH] Do not add extra 'this' parameter for TImpl's accessor Fixes weird cases like super-call from a closure inside a trait with a required class --- .../jet/codegen/state/JetTypeMapper.java | 5 +++-- .../codegen/traits/withRequiredSuper.kt | 16 +++++++++++++++ .../traits/withRequiredSuperViaBridge.kt | 20 +++++++++++++++++++ .../org/jetbrains/jet/codegen/TraitsTest.java | 8 ++++++++ 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/traits/withRequiredSuper.kt create mode 100644 compiler/testData/codegen/traits/withRequiredSuperViaBridge.kt 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 81ace0e8fb6..36102ba929f 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -519,8 +519,6 @@ public class JetTypeMapper extends BindingTraceAware { signatureVisitor.writeParametersStart(); - writeThisForAccessorIfNeeded(f, signatureVisitor); - if (kind == OwnerKind.TRAIT_IMPL) { ClassDescriptor containingDeclaration = (ClassDescriptor) f.getContainingDeclaration(); JetType jetType = CodegenUtil.getSuperClass(containingDeclaration); @@ -534,6 +532,9 @@ public class JetTypeMapper extends BindingTraceAware { signatureVisitor.writeAsmType(type, jetType.isNullable()); signatureVisitor.writeParameterTypeEnd(); } + else { + writeThisForAccessorIfNeeded(f, signatureVisitor); + } if (receiverType != null) { signatureVisitor.writeParameterType(JvmMethodParameterKind.RECEIVER); diff --git a/compiler/testData/codegen/traits/withRequiredSuper.kt b/compiler/testData/codegen/traits/withRequiredSuper.kt new file mode 100644 index 00000000000..b4a3231ecaa --- /dev/null +++ b/compiler/testData/codegen/traits/withRequiredSuper.kt @@ -0,0 +1,16 @@ +open class Base { + open fun foo() { } +} + +trait Derived : Base { + override fun foo() { + super.foo() + } +} + +class DerivedImpl : Derived, Base() + +fun box(): String { + DerivedImpl().foo() + return "OK" +} diff --git a/compiler/testData/codegen/traits/withRequiredSuperViaBridge.kt b/compiler/testData/codegen/traits/withRequiredSuperViaBridge.kt new file mode 100644 index 00000000000..ddf9a8cae58 --- /dev/null +++ b/compiler/testData/codegen/traits/withRequiredSuperViaBridge.kt @@ -0,0 +1,20 @@ +open class Base { + open fun foo() { } +} + +trait Derived : Base { + override fun foo() { + object { + fun bar() { + super@Derived.foo() + } + }.bar() + } +} + +class DerivedImpl : Derived, Base() + +fun box(): String { + DerivedImpl().foo() + return "OK" +} diff --git a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java index 66641e776c4..c1cc1330412 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java +++ b/compiler/tests/org/jetbrains/jet/codegen/TraitsTest.java @@ -88,4 +88,12 @@ public class TraitsTest extends CodegenTestCase { public void testKt2963() { blackBoxFile("regressions/kt2963.kt"); } + + public void testWithRequiredSuper() { + blackBoxFile("traits/withRequiredSuper.kt"); + } + + public void testWithRequiredSuperViaBridge() { + blackBoxFile("traits/withRequiredSuperViaBridge.kt"); + } }