[IR] Enhance error reporting for IR linking issues

^KT-44626

Typical use case:
- There are two KLIB libraries: A and B.
- Library A has two versions: A.v1 (older) and A.v2 (newer).
- A.v2 is ABI-incompatible with A.v1.
- B depends on A and was compiled against A.v1.
- An attempt to build the application with A.v2 and B fails with weird error message. It's unclear for end user what's wrong and what needs to be done to fix the issue.

The fix improves error reporting for the following particular cases:
- A symbol that is gone (KT-41378)
- A class that became a typealias (KT-47285, KT-46697)
- A typealias that became a class (KT-46340)
This commit is contained in:
Dmitriy Dolovov
2021-06-10 11:40:16 +03:00
parent 672b972b38
commit c1fb40a436
15 changed files with 1046 additions and 81 deletions
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.ir.backend.js.ic
import org.jetbrains.kotlin.backend.common.overrides.DefaultFakeOverrideClassFilter
import org.jetbrains.kotlin.backend.common.serialization.*
import org.jetbrains.kotlin.backend.common.serialization.encodings.BinarySymbolData
import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.ir.backend.js.JsMappingState
import org.jetbrains.kotlin.ir.backend.js.JsStatementOrigins
import org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsIrLinker
@@ -36,7 +35,6 @@ class IcFileDeserializer(
allowErrorNodes: Boolean,
deserializeInlineFunctions: Boolean,
val moduleDeserializer: IrModuleDeserializer,
val handleNoModuleDeserializerFound: (IdSignature, ModuleDescriptor, Collection<IrModuleDeserializer>) -> IrModuleDeserializer,
val originalEnqueue: IdSignature.(IcFileDeserializer) -> Unit,
val icFileData: SerializedIcDataForFile,
val mappingState: JsMappingState,
@@ -82,9 +80,8 @@ class IcFileDeserializer(
// TODO: reference lowered declarations cross-module
if (kind == BinarySymbolData.SymbolKind.FILE_SYMBOL) return file.symbol
val actualModuleDeserializer =
moduleDeserializer.findModuleDeserializerForTopLevelId(idSig)
?: handleNoModuleDeserializerFound(idSig, moduleDeserializer.moduleDescriptor, moduleDeserializer.moduleDependencies)
val actualModuleDeserializer = moduleDeserializer.findModuleDeserializerForTopLevelId(idSig)
?: linker.handleSignatureIdNotFoundInModuleWithDependencies(idSig, moduleDeserializer)
return actualModuleDeserializer.deserializeIrSymbol(idSig, kind)
}
@@ -141,7 +141,6 @@ class IcModuleDeserializer(
allowErrorNodes,
strategy.inlineBodies,
moduleDeserializer,
linker::handleNoModuleDeserializerFound,
{ fileDeserializer -> originalEnqueue(fileDeserializer) },
icFileData,
mapping.state,