[IR SERIALIZATION] Fix clashes

This commit is contained in:
Roman Artemev
2019-08-13 13:06:50 +03:00
committed by romanart
parent 55f06ecff5
commit 125982841a
@@ -6,23 +6,36 @@
package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir package org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir
import org.jetbrains.kotlin.backend.common.serialization.* import org.jetbrains.kotlin.backend.common.serialization.*
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns import org.jetbrains.kotlin.ir.descriptors.IrBuiltIns
import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.ir.util.render
class JsUniqIdClashTracker: UniqIdClashTracker { class JsUniqIdClashTracker : UniqIdClashTracker {
private val commitedUniqIds = mutableMapOf<UniqId, IrDeclaration>() private val committedUniqIds = mutableMapOf<UniqId, IrDeclaration>()
override fun commit(declaration: IrDeclaration, uniqId: UniqId) { override fun commit(declaration: IrDeclaration, uniqId: UniqId) {
if (uniqId.isLocal) return // don't track local ids if (uniqId.isLocal) return // don't track local ids
if (uniqId in commitedUniqIds) { if (uniqId in committedUniqIds) {
val clashedDeclaration = commitedUniqIds[uniqId]!! val clashedDeclaration = committedUniqIds[uniqId]!!
// TODO: handle clashes properly if (declaration !is IrTypeParameter && declaration.descriptor.containingDeclaration !is PropertyDescriptor) {
error("UniqId clash: $uniqId; Existed declaration ${clashedDeclaration.render()} clashed with new ${declaration.render()}") // TODO: handle clashes properly
error("UniqId clash: $uniqId; Existed declaration ${clashedDeclaration.render()} clashed with new ${declaration.render()}")
} else {
// Check whether they are type parameters of the same extension property but different accessors
val parent = declaration.parent
val clashedParent = clashedDeclaration.parent
require(parent is IrSimpleFunction)
require(clashedParent is IrSimpleFunction)
require(clashedDeclaration !== parent)
require(clashedParent.correspondingPropertySymbol === parent.correspondingPropertySymbol)
}
} }
commitedUniqIds[uniqId] = declaration committedUniqIds[uniqId] = declaration
} }
} }