[JS IR] Take default params into account for calculating an IC hash
^KT-54895 Fixed
This commit is contained in:
committed by
Space Team
parent
f7063555ca
commit
f4b5f5ff5d
+8
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
|
|||||||
import org.jetbrains.kotlin.config.languageVersionSettings
|
import org.jetbrains.kotlin.config.languageVersionSettings
|
||||||
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CrossModuleReferences
|
import org.jetbrains.kotlin.ir.backend.js.transformers.irToJs.CrossModuleReferences
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
|
import org.jetbrains.kotlin.ir.declarations.IrFunction
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer
|
import org.jetbrains.kotlin.ir.declarations.IrTypeParametersContainer
|
||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||||
import org.jetbrains.kotlin.ir.util.DumpIrTreeVisitor
|
import org.jetbrains.kotlin.ir.util.DumpIrTreeVisitor
|
||||||
@@ -110,6 +111,13 @@ internal fun IrSymbol.irSymbolHashForIC() = HashCalculatorForIC().also {
|
|||||||
it.update(typeParameter.symbol.toString())
|
it.update(typeParameter.symbol.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
(owner as? IrFunction)?.let { irFunction ->
|
||||||
|
it.updateForEach(irFunction.valueParameters) { functionParam ->
|
||||||
|
// symbol rendering doesn't print default params information
|
||||||
|
// it is important to understand if default params were added or removed
|
||||||
|
it.update(functionParam.defaultValue?.let { 1 } ?: 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
}.finalize()
|
}.finalize()
|
||||||
|
|
||||||
internal fun String.stringHashForIC() = HashCalculatorForIC().also { it.update(this) }.finalize()
|
internal fun String.stringHashForIC() = HashCalculatorForIC().also { it.update(this) }.finalize()
|
||||||
|
|||||||
+5
@@ -200,6 +200,11 @@ public class InvalidationTestGenerated extends AbstractInvalidationTest {
|
|||||||
runTest("js/js.translator/testData/incremental/invalidation/inlineFunctionWithObject/");
|
runTest("js/js.translator/testData/incremental/invalidation/inlineFunctionWithObject/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("interfaceWithDefaultParams")
|
||||||
|
public void testInterfaceWithDefaultParams() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/incremental/invalidation/interfaceWithDefaultParams/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsCode")
|
@TestMetadata("jsCode")
|
||||||
public void testJsCode() throws Exception {
|
public void testJsCode() throws Exception {
|
||||||
runTest("js/js.translator/testData/incremental/invalidation/jsCode/");
|
runTest("js/js.translator/testData/incremental/invalidation/jsCode/");
|
||||||
|
|||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
interface InterfaceA {
|
||||||
|
fun functionA(x: Int, s: String, b: Boolean? = null): Int
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
interface InterfaceA {
|
||||||
|
fun functionA(x: Int, s: String, b: Boolean?): Int
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
interface InterfaceA {
|
||||||
|
fun functionA(x: Int, s: String, b: Boolean? = true): Int
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
interface InterfaceA {
|
||||||
|
fun functionA(x: Int, s: String, b: Boolean? = true, i: Int = 1): Int
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
interface InterfaceA {
|
||||||
|
fun functionA(x: Int, s: String = "xy", b: Boolean? = true, i: Int): Int
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
interface InterfaceA {
|
||||||
|
fun functionA(x: Int, s: String = "xyz!", b: Boolean? = false, i: Int): Int
|
||||||
|
}
|
||||||
Vendored
+27
@@ -0,0 +1,27 @@
|
|||||||
|
STEP 0:
|
||||||
|
modifications:
|
||||||
|
U : l1.0.kt -> l1.kt
|
||||||
|
added file: l1.kt
|
||||||
|
STEP 1:
|
||||||
|
modifications:
|
||||||
|
U : l1.1.kt -> l1.kt
|
||||||
|
modified ir: l1.kt
|
||||||
|
STEP 2:
|
||||||
|
modifications:
|
||||||
|
U : l1.2.kt -> l1.kt
|
||||||
|
modified ir: l1.kt
|
||||||
|
STEP 3:
|
||||||
|
STEP 4:
|
||||||
|
modifications:
|
||||||
|
U : l1.4.kt -> l1.kt
|
||||||
|
modified ir: l1.kt
|
||||||
|
STEP 5:
|
||||||
|
STEP 6:
|
||||||
|
modifications:
|
||||||
|
U : l1.6.kt -> l1.kt
|
||||||
|
modified ir: l1.kt
|
||||||
|
STEP 7:
|
||||||
|
STEP 8:
|
||||||
|
modifications:
|
||||||
|
U : l1.8.kt -> l1.kt
|
||||||
|
modified ir: l1.kt
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class ClassA : InterfaceA {
|
||||||
|
override fun functionA(x: Int, s: String, b: Boolean?): Int {
|
||||||
|
return x + s.length + if (b == true) 1 else 0
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class ClassA : InterfaceA {
|
||||||
|
override fun functionA(x: Int, s: String, b: Boolean?, i: Int): Int {
|
||||||
|
return i - 1 + x + s.length + if (b == true) 1 else 0
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
private fun test(setepId: Int, i: InterfaceA): Int {
|
||||||
|
return i.functionA(setepId, "", false)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testDefaltParam(setepId: Int): Int {
|
||||||
|
return test(setepId, ClassA())
|
||||||
|
}
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
private fun test(setepId: Int, i: InterfaceA): Int {
|
||||||
|
return i.functionA(setepId - 1, "")
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testDefaltParam(setepId: Int): Int {
|
||||||
|
return test(setepId, ClassA())
|
||||||
|
}
|
||||||
Vendored
+12
@@ -0,0 +1,12 @@
|
|||||||
|
private fun test(setepId: Int, i: InterfaceA): Int {
|
||||||
|
return i.functionA(
|
||||||
|
x = setepId - 2,
|
||||||
|
s = "s",
|
||||||
|
b = false,
|
||||||
|
i = 2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testDefaltParam(setepId: Int): Int {
|
||||||
|
return test(setepId, ClassA())
|
||||||
|
}
|
||||||
Vendored
+10
@@ -0,0 +1,10 @@
|
|||||||
|
private fun test(setepId: Int, i: InterfaceA): Int {
|
||||||
|
return i.functionA(
|
||||||
|
x = 3,
|
||||||
|
i = 2
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun testDefaltParam(setepId: Int): Int {
|
||||||
|
return test(setepId, ClassA())
|
||||||
|
}
|
||||||
Vendored
+34
@@ -0,0 +1,34 @@
|
|||||||
|
STEP 0:
|
||||||
|
dependencies: lib1
|
||||||
|
modifications:
|
||||||
|
U : l2.0.kt -> l2.kt
|
||||||
|
U : l2test.0.kt -> l2test.kt
|
||||||
|
added file: l2.kt, l2test.kt
|
||||||
|
STEP 1..2:
|
||||||
|
dependencies: lib1
|
||||||
|
updated imports: l2test.kt, l2.kt
|
||||||
|
STEP 3:
|
||||||
|
dependencies: lib1
|
||||||
|
modifications:
|
||||||
|
U : l2test.3.kt -> l2test.kt
|
||||||
|
modified ir: l2test.kt
|
||||||
|
STEP 4:
|
||||||
|
dependencies: lib1
|
||||||
|
modifications:
|
||||||
|
U : l2.4.kt -> l2.kt
|
||||||
|
modified ir: l2.kt, l2test.kt
|
||||||
|
STEP 5:
|
||||||
|
dependencies: lib1
|
||||||
|
modifications:
|
||||||
|
U : l2test.5.kt -> l2test.kt
|
||||||
|
modified ir: l2test.kt
|
||||||
|
STEP 6:
|
||||||
|
dependencies: lib1
|
||||||
|
updated imports: l2.kt, l2test.kt
|
||||||
|
STEP 7:
|
||||||
|
dependencies: lib1
|
||||||
|
modifications:
|
||||||
|
U : l2test.7.kt -> l2test.kt
|
||||||
|
modified ir: l2test.kt
|
||||||
|
STEP 8:
|
||||||
|
dependencies: lib1
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
fun box(stepId: Int): String {
|
||||||
|
val x = testDefaltParam(stepId)
|
||||||
|
if (x != stepId) {
|
||||||
|
return "Fail, got $x, expected $stepId"
|
||||||
|
}
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
STEP 0:
|
||||||
|
dependencies: lib1, lib2
|
||||||
|
added file: m.kt
|
||||||
|
STEP 1..8:
|
||||||
|
dependencies: lib1, lib2
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
MODULES: lib1, lib2, main
|
||||||
|
|
||||||
|
STEP 0:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib1, lib2, main
|
||||||
|
STEP 1..2:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib1, lib2
|
||||||
|
STEP 3:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib2
|
||||||
|
STEP 4:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib1, lib2
|
||||||
|
STEP 5:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib2
|
||||||
|
STEP 6:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib1, lib2
|
||||||
|
STEP 7:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib2
|
||||||
|
STEP 8:
|
||||||
|
libs: lib1, lib2, main
|
||||||
|
dirty js: lib1
|
||||||
Reference in New Issue
Block a user