From ccc2aae84189c6d04db1a805348458354f660c33 Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Wed, 27 Apr 2022 10:21:38 +0000 Subject: [PATCH] fix(KT-50270): inline properties accessor for child classes too. --- .../PropertyAccessorInlineLowering.kt | 4 ++-- .../InvalidationTestGenerated.java | 5 +++++ .../when/exhaustiveCheckException.kt | 2 -- .../gettersAndSettersInlining/lib1/l1.kt | 3 +++ .../lib1/l1.kt.1.txt | 3 +++ .../lib1/l1.kt.2.txt | 13 ++++++++++++ .../lib1/l1.kt.3.txt | 3 +++ .../lib1/module.info | 21 +++++++++++++++++++ .../gettersAndSettersInlining/lib2/l2.kt | 1 + .../lib2/l2.kt.4.txt | 13 ++++++++++++ .../lib2/module.info | 10 +++++++++ .../gettersAndSettersInlining/main/m.kt | 20 ++++++++++++++++++ .../main/module.info | 5 +++++ .../gettersAndSettersInlining/project.info | 11 ++++++++++ 14 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.1.txt create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.2.txt create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.3.txt create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt.4.txt create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/m.kt create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info create mode 100644 js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt index 49674b1a687..9e7b547bc19 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/optimizations/PropertyAccessorInlineLowering.kt @@ -95,11 +95,11 @@ open class PropertyAccessorInlineLowering( - if (property.getter === callee) { + if (property.getter === analyzedCallee) { return tryInlineSimpleGetter(expression, analyzedCallee, backingField) ?: expression } - if (property.setter === callee) { + if (property.setter === analyzedCallee) { return tryInlineSimpleSetter(expression, analyzedCallee, backingField) ?: expression } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java index ffd1387588e..5e33f45f26d 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/incremental/InvalidationTestGenerated.java @@ -85,6 +85,11 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest { runTest("js/js.translator/testData/incremental/invalidation/genericInlineFunctions/"); } + @TestMetadata("gettersAndSettersInlining") + public void testGettersAndSettersInlining() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/"); + } + @TestMetadata("inlineBecomeNonInline") public void testInlineBecomeNonInline() throws Exception { runTest("js/js.translator/testData/incremental/invalidation/inlineBecomeNonInline/"); diff --git a/js/js.translator/testData/box/expression/when/exhaustiveCheckException.kt b/js/js.translator/testData/box/expression/when/exhaustiveCheckException.kt index 263c623d475..c526957a1a6 100644 --- a/js/js.translator/testData/box/expression/when/exhaustiveCheckException.kt +++ b/js/js.translator/testData/box/expression/when/exhaustiveCheckException.kt @@ -1,5 +1,3 @@ -// IGNORE_BACKEND: JS_IR -// IGNORE_BACKEND: JS_IR_ES6 // EXPECTED_REACHABLE_NODES: 1323 fun checkThrown(x: T, block: (T) -> Any?): Unit? { return try { diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt new file mode 100644 index 00000000000..979e04a0a11 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt @@ -0,0 +1,3 @@ +open class Parent(var name: String) { + val isValid = true +} \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.1.txt b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.1.txt new file mode 100644 index 00000000000..d29fafc929c --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.1.txt @@ -0,0 +1,3 @@ +open class Parent(open var name: String) { + val isValid = true +} diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.2.txt b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.2.txt new file mode 100644 index 00000000000..4325f82e4b6 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.2.txt @@ -0,0 +1,13 @@ +open class Parent(name: String) { + var name: String + get() = _name + set(name) { + isValid = true + _name = name + } + + var isValid = false + private set + + private var _name: String = name; +} diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.3.txt b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.3.txt new file mode 100644 index 00000000000..0f261df53d0 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/l1.kt.3.txt @@ -0,0 +1,3 @@ +open class Parent(open var name: String) { + open val isValid = true +} diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/module.info b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/module.info new file mode 100644 index 00000000000..255a6787d26 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib1/module.info @@ -0,0 +1,21 @@ +STEP 0: + dependencies: stdlib + dirty: l1.kt +STEP 1: + dependencies: stdlib + modifications: + U : l1.kt.1.txt -> l1.kt + dirty: l1.kt +STEP 2: + dependencies: stdlib + modifications: + U : l1.kt.2.txt -> l1.kt + dirty: l1.kt +STEP 3: + dependencies: stdlib + modifications: + U : l1.kt.3.txt -> l1.kt + dirty: l1.kt +STEP 4: + dependencies: stdlib + flags: FP diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt new file mode 100644 index 00000000000..a4a85f78982 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt @@ -0,0 +1 @@ +class Child(name: String) : Parent(name) \ No newline at end of file diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt.4.txt b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt.4.txt new file mode 100644 index 00000000000..11f315076e3 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/l2.kt.4.txt @@ -0,0 +1,13 @@ +class Child(name: String) : Parent(name) { + override var name: String + get() = _name + set(name) { + _name = name + isValid = true + } + + private var _name: String = name + + override var isValid = false + private set +} diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/module.info b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/module.info new file mode 100644 index 00000000000..5b4fea5ac4a --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/lib2/module.info @@ -0,0 +1,10 @@ +STEP 0: + dependencies: stdlib, lib1 + dirty: l2.kt +STEP 1..3: + dependencies: stdlib, lib1 +STEP 4: + dependencies: stdlib, lib1 + modifications: + U : l2.kt.4.txt -> l2.kt + dirty: l2.kt diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/m.kt b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/m.kt new file mode 100644 index 00000000000..16f39da7041 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/m.kt @@ -0,0 +1,20 @@ +fun box(stepId: Int): String { + val parent = Parent("parent") + val child = Child("child") + + if (parent.name != "parent") return "fail: initial parent name at step $stepId" + if (child.name != "child") return "fail: initial child name at step $stepId" + + parent.name = "updated parent" + + if (parent.name != "updated parent") return "fail: updated parent name at step $stepId" + + child.name = "updated child" + + if (child.name != "updated child") return "fail: updated child name at step $stepId" + + if (!parent.isValid) return "fail: parent is invalid at step $stepId" + if (!child.isValid) return "fail: child is invalid at step $stepId" + + return "OK" +} diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info new file mode 100644 index 00000000000..699d71982d0 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/main/module.info @@ -0,0 +1,5 @@ +STEP 0: + dependencies: stdlib, lib1, lib2 + dirty: m.kt +STEP 1..4: + dependencies: stdlib, lib1, lib2 diff --git a/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info new file mode 100644 index 00000000000..1a8af8d6f10 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/gettersAndSettersInlining/project.info @@ -0,0 +1,11 @@ +MODULES: lib1, lib2, main + +STEP 0: + libs: lib1, lib2, main + dirty js: stdlib, lib1, lib2, main +STEP 1..3: + libs: lib1, lib2, main + dirty js: lib1 +STEP 4: + libs: lib1, lib2, main + dirty js: lib2