diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt index 0e67655d82e..0c029dd6542 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/ic/IdSignatureHashCalculator.kt @@ -53,9 +53,9 @@ internal class IdSignatureHashCalculator { } private inner class InlineFunctionCallGraphBuilder : IrElementVisitor> { - var inlineFunctionCallDepth: Int = 0 - - override fun visitElement(element: IrElement, data: MutableSet) = element.acceptChildren(this, data) + override fun visitElement(element: IrElement, data: MutableSet) { + element.acceptChildren(this, data) + } override fun visitSimpleFunction(declaration: IrSimpleFunction, data: MutableSet) { if (declaration in inlineFunctionCallGraph) { @@ -70,20 +70,13 @@ internal class IdSignatureHashCalculator { val callee = expression.symbol.owner if (callee.isInline) { data += callee - inlineFunctionCallDepth += 1 } expression.acceptChildren(this, data) - if (callee.isInline) { - inlineFunctionCallDepth -= 1 - if (inlineFunctionCallDepth < 0) { - icError("inline function calls depth inconsistent") - } - } } override fun visitFunctionReference(expression: IrFunctionReference, data: MutableSet) { val reference = expression.symbol.owner - if (inlineFunctionCallDepth > 0 && reference.isInline) { + if (reference.isInline) { // this if is fine, because fake overrides are not inlined as function reference calls even as inline function args if (!reference.isFakeOverride) { data += reference 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 7a3cae95d9c..2c00195a5eb 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 @@ -190,6 +190,11 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest { runTest("js/js.translator/testData/incremental/invalidation/inlineBecomeNonInline/"); } + @TestMetadata("inlineFunctionAsFunctionReference") + public void testInlineFunctionAsFunctionReference() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/"); + } + @TestMetadata("inlineFunctionAsParam") public void testInlineFunctionAsParam() throws Exception { runTest("js/js.translator/testData/incremental/invalidation/inlineFunctionAsParam/"); @@ -255,6 +260,11 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest { runTest("js/js.translator/testData/incremental/invalidation/nonInlineBecomeInline/"); } + @TestMetadata("privateDeclarationLeakThroughDefaultParam") + public void testPrivateDeclarationLeakThroughDefaultParam() throws Exception { + runTest("js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/"); + } + @TestMetadata("privateInlineFunction1") public void testPrivateInlineFunction1() throws Exception { runTest("js/js.translator/testData/incremental/invalidation/privateInlineFunction1/"); diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.0.kt b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.0.kt new file mode 100644 index 00000000000..6c0a5c1ee22 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.0.kt @@ -0,0 +1,2 @@ +inline fun bar() = "0" + diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.1.kt b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.1.kt new file mode 100644 index 00000000000..ce9d458c7ab --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.1.kt @@ -0,0 +1 @@ +inline fun bar() = "1" diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.3.kt b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.3.kt new file mode 100644 index 00000000000..57f093f4be3 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l1.3.kt @@ -0,0 +1 @@ +inline fun bar() = "2" diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l2.0.kt b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l2.0.kt new file mode 100644 index 00000000000..c001565ecc2 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l2.0.kt @@ -0,0 +1,3 @@ +inline fun foo(callableReference: () -> String = ::bar): String { + return callableReference() +} diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l2.2.kt b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l2.2.kt new file mode 100644 index 00000000000..f55c77d3779 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/l2.2.kt @@ -0,0 +1,4 @@ +inline fun foo(): String { + val callableReference: () -> String = ::bar + return (callableReference().toInt() + 1).toString() +} diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/module.info b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/module.info new file mode 100644 index 00000000000..9c60e497b0f --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/lib1/module.info @@ -0,0 +1,19 @@ +STEP 0: + modifications: + U : l1.0.kt -> l1.kt + U : l2.0.kt -> l2.kt + added file: l1.kt, l2.kt +STEP 1: + modifications: + U : l1.1.kt -> l1.kt + modified ir: l1.kt + updated imports: l2.kt +STEP 2: + modifications: + U : l2.2.kt -> l2.kt + modified ir: l2.kt +STEP 3: + modifications: + U : l1.3.kt -> l1.kt + modified ir: l1.kt + updated imports: l2.kt diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/main/m.kt b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/main/m.kt new file mode 100644 index 00000000000..0d5a619cb73 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/main/m.kt @@ -0,0 +1,7 @@ +fun box(stepId: Int): String { + val x = foo().toInt() + if (x != stepId) { + return "Fail $x != $stepId" + } + return "OK" +} diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/main/module.info b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/main/module.info new file mode 100644 index 00000000000..b2d2c0ddf9d --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/main/module.info @@ -0,0 +1,12 @@ +STEP 0: + dependencies: lib1 + added file: m.kt +STEP 1: + dependencies: lib1 + updated imports: m.kt +STEP 2: + dependencies: lib1 + modified ir: m.kt +STEP 3: + dependencies: lib1 + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/project.info b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/project.info new file mode 100644 index 00000000000..c8d9369c64b --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/inlineFunctionAsFunctionReference/project.info @@ -0,0 +1,5 @@ +MODULES: lib1, main + +STEP 0..3: + libs: lib1, main + dirty js: lib1, main diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.0.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.0.kt new file mode 100644 index 00000000000..7578f160042 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.0.kt @@ -0,0 +1,5 @@ +private val prop = "0" + +internal inline fun foo(lambda: () -> String = ::prop): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.1.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.1.kt new file mode 100644 index 00000000000..10e15dc3186 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.1.kt @@ -0,0 +1,5 @@ +private val prop = "1" + +internal inline fun foo(lambda: () -> String = ::prop): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.10.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.10.kt new file mode 100644 index 00000000000..b3f7c0936df --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.10.kt @@ -0,0 +1,9 @@ +private object Obj { + val x = "10" +} + +private inline fun bar() = Obj.x + +internal inline fun foo(lambda: () -> String = ::bar): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.11.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.11.kt new file mode 100644 index 00000000000..c36bd6e7d12 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.11.kt @@ -0,0 +1,9 @@ +private object Obj { + val x = "11" +} + +private inline fun bar() = Obj.x + +internal inline fun foo(lambda: () -> String = ::bar): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.12.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.12.kt new file mode 100644 index 00000000000..06f1bc71266 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.12.kt @@ -0,0 +1,9 @@ +private object Obj { + inline val x get() = "12" +} + +private inline fun bar() = Obj.x + +internal inline fun foo(lambda: () -> String = ::bar): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.13.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.13.kt new file mode 100644 index 00000000000..e159ea16518 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.13.kt @@ -0,0 +1,9 @@ +private object Obj { + inline val x get() = "13" +} + +private inline fun bar() = Obj.x + +internal inline fun foo(lambda: () -> String = ::bar): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.2.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.2.kt new file mode 100644 index 00000000000..5e07d33d07e --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.2.kt @@ -0,0 +1,5 @@ +private val prop get() = "2" + +internal inline fun foo(lambda: () -> String = ::prop): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.3.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.3.kt new file mode 100644 index 00000000000..0e1b6433349 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.3.kt @@ -0,0 +1,5 @@ +private fun prop() = "3" + +internal inline fun foo(lambda: () -> String = ::prop): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.4.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.4.kt new file mode 100644 index 00000000000..5c7d1b8274e --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.4.kt @@ -0,0 +1,5 @@ +private fun prop() = "3" + +internal inline fun foo(lambda: () -> String = { "4" }): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.5.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.5.kt new file mode 100644 index 00000000000..c0a7d8f5058 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.5.kt @@ -0,0 +1,3 @@ +internal inline fun foo(lambda: () -> String = { "5" }): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.6.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.6.kt new file mode 100644 index 00000000000..0b6cb19b9ba --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.6.kt @@ -0,0 +1,5 @@ +private inline fun prop() = "6" + +internal inline fun foo(lambda: () -> String = ::prop): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.7.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.7.kt new file mode 100644 index 00000000000..7f99e92fe50 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.7.kt @@ -0,0 +1,5 @@ +private inline fun prop() = "7" + +internal inline fun foo(lambda: () -> String = ::prop): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.8.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.8.kt new file mode 100644 index 00000000000..febce4e59cc --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.8.kt @@ -0,0 +1,9 @@ +private object Obj { + val x = "8" + + override fun toString() = x +} + +internal inline fun foo(lambda: () -> String = { "$Obj" } ): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.9.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.9.kt new file mode 100644 index 00000000000..ba0503d5664 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/f.9.kt @@ -0,0 +1,9 @@ +private object Obj { + val x = "9" + + override fun toString() = x +} + +internal inline fun foo(lambda: () -> String = { "$Obj" } ): String { + return lambda() +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/m.kt b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/m.kt new file mode 100644 index 00000000000..0d5a619cb73 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/m.kt @@ -0,0 +1,7 @@ +fun box(stepId: Int): String { + val x = foo().toInt() + if (x != stepId) { + return "Fail $x != $stepId" + } + return "OK" +} diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/module.info b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/module.info new file mode 100644 index 00000000000..d97d4b815b6 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/main/module.info @@ -0,0 +1,65 @@ +STEP 0: + modifications: + U : f.0.kt -> f.kt + added file: m.kt, f.kt +STEP 1: + modifications: + U : f.1.kt -> f.kt + modified ir: f.kt +STEP 2: + modifications: + U : f.2.kt -> f.kt + modified ir: f.kt +STEP 3: + modifications: + U : f.3.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 4: + modifications: + U : f.4.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 5: + modifications: + U : f.5.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 6: + modifications: + U : f.6.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 7: + modifications: + U : f.7.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 8: + modifications: + U : f.8.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 9: + modifications: + U : f.9.kt -> f.kt + modified ir: f.kt +STEP 10: + modifications: + U : f.10.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 11: + modifications: + U : f.11.kt -> f.kt + modified ir: f.kt +STEP 12: + modifications: + U : f.12.kt -> f.kt + modified ir: f.kt + updated imports: m.kt +STEP 13: + modifications: + U : f.13.kt -> f.kt + modified ir: f.kt + updated imports: m.kt diff --git a/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/project.info b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/project.info new file mode 100644 index 00000000000..93c47432020 --- /dev/null +++ b/js/js.translator/testData/incremental/invalidation/privateDeclarationLeakThroughDefaultParam/project.info @@ -0,0 +1,5 @@ +MODULES: main + +STEP 0..13: + libs: main + dirty js: main