From b6fc0c5c136149cfc5446e8ccaf44a0791482ac6 Mon Sep 17 00:00:00 2001 From: Mikhael Bogdanov Date: Wed, 24 Apr 2013 13:18:40 +0400 Subject: [PATCH] KT-3538: Super call to trait implemetation invokes method from base class --- .../jet/codegen/state/JetTypeMapper.java | 17 +++++++++++---- compiler/testData/codegen/box/super/kt3538.kt | 21 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 5 +++++ 3 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/codegen/box/super/kt3538.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 847eef08375..15d735c55eb 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/state/JetTypeMapper.java @@ -508,9 +508,11 @@ public class JetTypeMapper extends BindingTraceAware { boolean isInterface = originalIsInterface && currentIsInterface; Type type = mapType(receiver.getDefaultType(), JetTypeMapperMode.TYPE_PARAMETER); owner = JvmClassName.byType(type); - ownerForDefaultParam = JvmClassName.byType(mapType(declarationOwner.getDefaultType(), JetTypeMapperMode.TYPE_PARAMETER)); + + ClassDescriptor declarationOwnerForDefault = (ClassDescriptor) findBaseDeclaration(functionDescriptor).getContainingDeclaration(); + ownerForDefaultParam = JvmClassName.byType(mapType(declarationOwnerForDefault.getDefaultType(), JetTypeMapperMode.TYPE_PARAMETER)); ownerForDefaultImpl = JvmClassName.byInternalName( - ownerForDefaultParam.getInternalName() + (originalIsInterface ? JvmAbi.TRAIT_IMPL_SUFFIX : "")); + ownerForDefaultParam.getInternalName() + (isInterface(declarationOwnerForDefault) ? JvmAbi.TRAIT_IMPL_SUFFIX : "")); if (isInterface) { invokeOpcode = superCall ? INVOKESTATIC : INVOKEINTERFACE; } @@ -557,13 +559,20 @@ public class JetTypeMapper extends BindingTraceAware { @NotNull private static FunctionDescriptor findAnyDeclaration(@NotNull FunctionDescriptor function) { - //if (function.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { + if (function.getKind() == CallableMemberDescriptor.Kind.DECLARATION) { + return function; + } + return findBaseDeclaration(function); + } + + @NotNull + private static FunctionDescriptor findBaseDeclaration(@NotNull FunctionDescriptor function) { if (function.getOverriddenDescriptors().isEmpty()) { return function; } else { // TODO: prefer class to interface - return findAnyDeclaration(function.getOverriddenDescriptors().iterator().next()); + return findBaseDeclaration(function.getOverriddenDescriptors().iterator().next()); } } diff --git a/compiler/testData/codegen/box/super/kt3538.kt b/compiler/testData/codegen/box/super/kt3538.kt new file mode 100644 index 00000000000..47656e7b4df --- /dev/null +++ b/compiler/testData/codegen/box/super/kt3538.kt @@ -0,0 +1,21 @@ +open class Base { + open fun sayHello(): String { + return "O" + } +} + +trait Trait: Base { + override fun sayHello(): String { + return "K" + } +} + +class Derived(): Base(), Trait { + override fun sayHello(): String { + return super.sayHello() + super.sayHello() + } +} + +fun box(): String { + return Derived().sayHello() +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java index 16187b82f7d..6c6efcd6d59 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -3616,6 +3616,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest("compiler/testData/codegen/box/super/kt3492TraitProperty.kt"); } + @TestMetadata("kt3538.kt") + public void testKt3538() throws Exception { + doTest("compiler/testData/codegen/box/super/kt3538.kt"); + } + @TestMetadata("multipleSuperTraits.kt") public void testMultipleSuperTraits() throws Exception { doTest("compiler/testData/codegen/box/super/multipleSuperTraits.kt");