[JS IR] Fix a IC dependency building for class methods.

The patch fixes lost IC dependencies for inherited class or interface methods.
 Especially between a fake override function and its implementation.
 Since IrSymbolDeserializer doesn't provide all class methods,
 they are collected from the class definitions.

^KT-53063 Fixed
This commit is contained in:
Alexander Korepanov
2022-07-05 12:34:54 +02:00
committed by Space
parent edbccd0add
commit 6525f7a7ac
42 changed files with 504 additions and 30 deletions
@@ -0,0 +1,3 @@
interface Module2Interface {
public suspend fun testFunction2() = 2
}
@@ -0,0 +1,4 @@
interface Module2Interface {
public suspend fun testFunction2() = 2
public fun testFunction22() = 22
}
@@ -0,0 +1,4 @@
interface Module2Interface {
public fun testFunction2() = 2
public fun testFunction22() = 22
}
@@ -0,0 +1,7 @@
interface Module2Interface {
public fun testFunction2() = 2
public fun testFunction22() = 22
public val testField222: Int
get() = 222
}
@@ -0,0 +1,7 @@
interface Module2Interface {
public fun testFunction2() = 20
public fun testFunction22() = 220
public val testField222: Int
get() = 2220
}
@@ -0,0 +1,2 @@
interface Module2Interface {
}
@@ -0,0 +1,34 @@
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
updated exports: l1.kt
STEP 2:
modifications:
U : l1.2.kt -> l1.kt
modified ir: l1.kt
STEP 3:
modifications:
U : l1.3.kt -> l1.kt
modified ir: l1.kt
STEP 4:
updated exports: l1.kt
STEP 5:
modifications:
U : l1.5.kt -> l1.kt
modified ir: l1.kt
STEP 6:
modifications:
U : l1.6.kt -> l1.kt
modified ir: l1.kt
updated exports: l1.kt
STEP 7:
modifications:
U : l1.0.kt -> l1.kt
modified ir: l1.kt
STEP 8:
updated exports: l1.kt
@@ -0,0 +1,3 @@
class Module1Class: Module2Interface {
fun testFunction1() = 1
}
@@ -0,0 +1,25 @@
STEP 0:
dependencies: lib1
added file: l2.kt
STEP 1:
dependencies: lib1
updated exports: l2.kt
STEP 2:
dependencies: lib1
updated imports: l2.kt
STEP 3:
dependencies: lib1
STEP 4:
dependencies: lib1
updated exports: l2.kt
STEP 5:
dependencies: lib1
STEP 6:
dependencies: lib1
updated imports: l2.kt
updated exports: l2.kt
STEP 7:
dependencies: lib1
STEP 8:
dependencies: lib1
updated exports: l2.kt
@@ -0,0 +1,10 @@
fun box(stepId: Int): String {
val obj = Module1Class()
when (stepId) {
0, 1, 2, 3, 4, 5, 6, 7, 8 -> {
if (obj.testFunction1() != 1) return "Fail 1"
}
else -> return "Unknown"
}
return "OK"
}
@@ -0,0 +1,11 @@
fun box(stepId: Int): String {
val obj = Module1Class()
when (stepId) {
0, 1, 2, 3, 4, 5, 6, 7, 8 -> {
if (obj.testFunction1() != 1) return "Fail 1"
if (obj.testFunction22() != 22) return "Fail 22"
}
else -> return "Unknown"
}
return "OK"
}
@@ -0,0 +1,17 @@
fun box(stepId: Int): String {
val obj = Module1Class()
when (stepId) {
0, 1, 2, 3, 4, 6, 7, 8 -> {
if (obj.testFunction1() != 1) return "Fail 1"
if (obj.testFunction22() != 22) return "Fail 22"
if (obj.testField222 != 222) return "Fail 222"
}
5 -> {
if (obj.testFunction1() != 1) return "Fail 1"
if (obj.testFunction22() != 220) return "Fail 220"
if (obj.testField222 != 2220) return "Fail 2220"
}
else -> return "Unknown"
}
return "OK"
}
@@ -0,0 +1,15 @@
suspend fun testCrossReference(): Int {
val obj = Module1Class()
return obj.testFunction2()
}
fun box(stepId: Int): String {
val obj = Module1Class()
when (stepId) {
0, 1, 2, 3, 4, 5, 6, 7, 8 -> {
if (obj.testFunction1() != 1) return "Fail 1"
}
else -> return "Unknown"
}
return "OK"
}
@@ -0,0 +1,31 @@
STEP 0:
dependencies: lib1, lib2
modifications:
U : m.0.kt -> m.kt
added file: m.kt
STEP 1:
dependencies: lib1, lib2
modifications:
U : m.1.kt -> m.kt
modified ir: m.kt
STEP 2..3:
dependencies: lib1, lib2
STEP 4:
dependencies: lib1, lib2
modifications:
U : m.4.kt -> m.kt
modified ir: m.kt
STEP 5:
dependencies: lib1, lib2
STEP 6:
dependencies: lib1, lib2
modifications:
U : m.0.kt -> m.kt
modified ir: m.kt
STEP 7:
dependencies: lib1, lib2
STEP 8:
dependencies: lib1, lib2
modifications:
U : m.8.kt -> m.kt
modified ir: m.kt
@@ -0,0 +1,26 @@
MODULES: lib1, lib2, main
STEP 0..1:
libs: lib1, lib2, main
dirty js: lib1, lib2, main
STEP 2:
libs: lib1, lib2, main
dirty js: lib1, lib2
STEP 3:
libs: lib1, lib2, main
dirty js: lib1
STEP 4:
libs: lib1, lib2, main
dirty js: lib1, lib2, main
STEP 5:
libs: lib1, lib2, main
dirty js: lib1
STEP 6:
libs: lib1, lib2, main
dirty js: lib1, lib2, main
STEP 7:
libs: lib1, lib2, main
dirty js: lib1
STEP 8:
libs: lib1, lib2, main
dirty js: lib1, lib2, main