From 252c82abe361777379359136cc7cd5eb8aaa14d9 Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Tue, 6 Oct 2015 11:23:12 +0300 Subject: [PATCH] Generate bridges for FAKE_OVERRIDE properties The same way it's done for function, just call generateBridges for accessors #KT-9442 Fixed --- .../kotlin/codegen/ClassBodyCodegen.java | 18 +++++++++++++++--- .../codegen/box/bridges/genericProperty.kt | 19 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 6 ++++++ .../test/semantics/BridgeTestGenerated.java | 6 ++++++ 4 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/codegen/box/bridges/genericProperty.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java index e7d0a1ebe97..3e2d31814fb 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ClassBodyCodegen.java @@ -68,10 +68,22 @@ public abstract class ClassBodyCodegen extends MemberCodegen { if (!DescriptorUtils.isInterface(descriptor)) { for (DeclarationDescriptor memberDescriptor : descriptor.getDefaultType().getMemberScope().getAllDescriptors()) { - if (memberDescriptor instanceof FunctionDescriptor) { - FunctionDescriptor member = (FunctionDescriptor) memberDescriptor; + if (memberDescriptor instanceof CallableMemberDescriptor) { + CallableMemberDescriptor member = (CallableMemberDescriptor) memberDescriptor; if (!member.getKind().isReal() && BridgesPackage.findTraitImplementation(member) == null) { - functionCodegen.generateBridges(member); + if (member instanceof FunctionDescriptor) { + functionCodegen.generateBridges((FunctionDescriptor) member); + } + else if (member instanceof PropertyDescriptor) { + PropertyGetterDescriptor getter = ((PropertyDescriptor) member).getGetter(); + if (getter != null) { + functionCodegen.generateBridges(getter); + } + PropertySetterDescriptor setter = ((PropertyDescriptor) member).getSetter(); + if (setter != null) { + functionCodegen.generateBridges(setter); + } + } } } } diff --git a/compiler/testData/codegen/box/bridges/genericProperty.kt b/compiler/testData/codegen/box/bridges/genericProperty.kt new file mode 100644 index 00000000000..be4000a62e3 --- /dev/null +++ b/compiler/testData/codegen/box/bridges/genericProperty.kt @@ -0,0 +1,19 @@ +open class A { + var size: T = 56 as T +} + +interface C { + var size: Int +} + +class B : C, A() + +fun box(): String { + val b = B() + if (b.size != 56) return "fail 1: ${b.size}" + + b.size = 55 + if (b.size != 55) return "fail 2: ${b.size}" + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 4d01644f344..7a998d04544 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -508,6 +508,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("genericProperty.kt") + public void testGenericProperty() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/bridges/genericProperty.kt"); + doTest(fileName); + } + @TestMetadata("kt1939.kt") public void testKt1939() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/bridges/kt1939.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BridgeTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BridgeTestGenerated.java index 9a917d98902..28874e46337 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BridgeTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BridgeTestGenerated.java @@ -131,6 +131,12 @@ public class BridgeTestGenerated extends AbstractBridgeTest { doTest(fileName); } + @TestMetadata("genericProperty.kt") + public void testGenericProperty() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/bridges/genericProperty.kt"); + doTest(fileName); + } + @TestMetadata("kt1939.kt") public void testKt1939() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/bridges/kt1939.kt");