[IR] Enhance error reporting for IR linking issues

^KT-44626

Support correct error reporting both with native static caches and without native static caches.
This commit is contained in:
Dmitriy Dolovov
2021-08-12 11:09:32 +03:00
committed by Space
parent 3cd43dced4
commit af12d61388
9 changed files with 381 additions and 149 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.util
import org.jetbrains.kotlin.utils.ResolvedDependencies
import org.jetbrains.kotlin.utils.ResolvedDependenciesSupport
import org.junit.Assert.assertEquals
import org.junit.Assert.fail
@@ -14,6 +15,7 @@ class ResolvedDependenciesSupportTest {
@Test
fun success1() {
val originalText = """
|0 \
|1 io.ktor:ktor-io,io.ktor:ktor-io-macosx64[1.5.4] #0[1.5.4]
|${'\t'}/some/path/ktor-io.klib
|${'\t'}/some/path/ktor-io-cinterop-bits.klib
@@ -28,10 +30,10 @@ class ResolvedDependenciesSupportTest {
|
""".trimMargin()
val deserializedModules = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line ->
val (deserializedModules, sourceCodeModuleId) = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line ->
fail("Unexpected failure at line $lineNo: $line")
}
val restoredText = ResolvedDependenciesSupport.serialize(deserializedModules)
val restoredText = ResolvedDependenciesSupport.serialize(ResolvedDependencies(deserializedModules, sourceCodeModuleId))
assertEquals(originalText, restoredText)
}
@@ -39,6 +41,7 @@ class ResolvedDependenciesSupportTest {
@Test
fun success2() {
val originalText = """
|0 \
|1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0]
|${'\t'}/some/path/liba.klib
|2 org.sample:libb,org.sample:libb-native[1.0] #0[1.0]
@@ -46,10 +49,10 @@ class ResolvedDependenciesSupportTest {
|
""".trimMargin()
val deserializedModules = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line ->
val (deserializedModules, sourceCodeModuleId) = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line ->
fail("Unexpected failure at line $lineNo: $line")
}
val restoredText = ResolvedDependenciesSupport.serialize(deserializedModules)
val restoredText = ResolvedDependenciesSupport.serialize(ResolvedDependencies(deserializedModules, sourceCodeModuleId))
assertEquals(originalText, restoredText)
}
@@ -57,6 +60,7 @@ class ResolvedDependenciesSupportTest {
@Test
fun success3() {
val originalText = """
|0 \
|1 org.jetbrains.kotlin:kotlin-stdlib-common[1.5.0] #2[1.4.32] #3[1.5.0] #4[1.5.0] #5[1.4.32] #6[1.4.32] #7[1.4.32] #8[1.4.32]
|${'\t'}/some/path/kotlin-stdlib-common-1.5.0.jar
|2 io.ktor:ktor-client-core,io.ktor:ktor-client-core-macosx64[1.5.4] #0[1.5.4]
@@ -80,10 +84,29 @@ class ResolvedDependenciesSupportTest {
|
""".trimMargin()
val deserializedModules = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line ->
val (deserializedModules, sourceCodeModuleId) = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line ->
fail("Unexpected failure at line $lineNo: $line")
}
val restoredText = ResolvedDependenciesSupport.serialize(deserializedModules)
val restoredText = ResolvedDependenciesSupport.serialize(ResolvedDependencies(deserializedModules, sourceCodeModuleId))
assertEquals(originalText, restoredText)
}
@Test
fun success4() {
val originalText = """
|0 baz-native,foo,org.sample.bar
|1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0]
|${'\t'}/some/path/liba.klib
|2 org.sample:libb,org.sample:libb-native[1.0] #0[1.0]
|${'\t'}/some/path/libb.klib
|
""".trimMargin()
val (deserializedModules, sourceCodeModuleId) = ResolvedDependenciesSupport.deserialize(originalText) { lineNo, line ->
fail("Unexpected failure at line $lineNo: $line")
}
val restoredText = ResolvedDependenciesSupport.serialize(ResolvedDependencies(deserializedModules, sourceCodeModuleId))
assertEquals(originalText, restoredText)
}
@@ -92,6 +115,7 @@ class ResolvedDependenciesSupportTest {
fun failure1() {
// There is no record with number 42!
val originalText = """
|0 \
|1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0] #42[42.42]
|${'\t'}/some/path/liba.klib
|2 org.sample:libb,org.sample:libb-native[1.0] #0[1.0]
@@ -99,13 +123,19 @@ class ResolvedDependenciesSupportTest {
|
""".trimMargin()
ResolvedDependenciesSupport.deserialize(originalText) { _, _ -> throw MyException() }
ResolvedDependenciesSupport.deserialize(originalText) { lineNo, _ ->
assertEquals(1, lineNo)
throw MyException()
}
fail()
}
@Test(expected = MyException::class)
fun failure2() {
// Name not specified.
val originalText = """
|0 \
|1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0]
|${'\t'}/some/path/liba.klib
|2 [1.0] #0[1.0]
@@ -113,13 +143,58 @@ class ResolvedDependenciesSupportTest {
|
""".trimMargin()
ResolvedDependenciesSupport.deserialize(originalText) { _, _ -> throw MyException() }
ResolvedDependenciesSupport.deserialize(originalText) { lineNo, _ ->
assertEquals(3, lineNo)
throw MyException()
}
fail()
}
@Test(expected = MyException::class)
fun failure3() {
// Version not specified.
val originalText = """
|0 \
|1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0]
|${'\t'}/some/path/liba.klib
|2 org.sample:libb,org.sample:libb-native #0[1.0]
|${'\t'}/some/path/libb.klib
|
""".trimMargin()
ResolvedDependenciesSupport.deserialize(originalText) { lineNo, _ ->
assertEquals(3, lineNo)
throw MyException()
}
fail()
}
@Test(expected = MyException::class)
fun failure4() {
// Source code module ID not specified.
val originalText = """
|0
|1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0]
|${'\t'}/some/path/liba.klib
|2 org.sample:libb,org.sample:libb-native #0[1.0]
|${'\t'}/some/path/libb.klib
|
""".trimMargin()
ResolvedDependenciesSupport.deserialize(originalText) { lineNo, _ ->
assertEquals(0, lineNo)
throw MyException()
}
fail()
}
@Test(expected = MyException::class)
fun failure5() {
// Source code module ID not specified.
val originalText = """
|1 org.sample:liba,org.sample:liba-native[2.0] #0[2.0] #2[1.0]
|${'\t'}/some/path/liba.klib
|2 org.sample:libb,org.sample:libb-native #0[1.0]
@@ -127,7 +202,12 @@ class ResolvedDependenciesSupportTest {
|
""".trimMargin()
ResolvedDependenciesSupport.deserialize(originalText) { _, _ -> throw MyException() }
ResolvedDependenciesSupport.deserialize(originalText) { lineNo, _ ->
assertEquals(0, lineNo)
throw MyException()
}
fail()
}
private class MyException : Exception()
@@ -47,7 +47,7 @@ class ResolvedDependencyIdTest {
@Test
fun toStringImplementation() {
assertEquals("/", ResolvedDependencyId.SOURCE_CODE_MODULE_ID.toString())
assertEquals("/", ResolvedDependencyId.DEFAULT_SOURCE_CODE_MODULE_ID.toString())
assertEquals("foo", ResolvedDependencyId("foo").toString())
assertEquals("bar (foo)", ResolvedDependencyId("foo", "bar").toString())
assertEquals("bar (baz, foo)", ResolvedDependencyId("foo", "bar", "baz").toString())