Added phase to IrValidator: ensure that all IR nodes are different
This commit is contained in:
+8
-1
@@ -25,9 +25,16 @@ import org.jetbrains.kotlin.types.typeUtil.makeNullable
|
|||||||
|
|
||||||
typealias ReportError = (element: IrElement, message: String) -> Unit
|
typealias ReportError = (element: IrElement, message: String) -> Unit
|
||||||
|
|
||||||
class CheckIrElementVisitor(val builtIns: KotlinBuiltIns, val reportError: ReportError) : IrElementVisitorVoid {
|
class CheckIrElementVisitor(val builtIns: KotlinBuiltIns, val reportError: ReportError, val ensureAllNodesAreDifferent: Boolean) : IrElementVisitorVoid {
|
||||||
|
|
||||||
|
val set = mutableSetOf<IrElement>()
|
||||||
|
|
||||||
override fun visitElement(element: IrElement) {
|
override fun visitElement(element: IrElement) {
|
||||||
|
if (ensureAllNodesAreDifferent) {
|
||||||
|
if (set.contains(element))
|
||||||
|
reportError(element, "Duplicate IR node")
|
||||||
|
set.add(element)
|
||||||
|
}
|
||||||
// Nothing to do.
|
// Nothing to do.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -28,17 +28,17 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
|||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||||
|
|
||||||
fun validateIrFunction(context: BackendContext, irFunction: IrFunction) {
|
fun validateIrFunction(context: BackendContext, irFunction: IrFunction) {
|
||||||
val visitor = IrValidator(context)
|
val visitor = IrValidator(context, false)
|
||||||
irFunction.acceptVoid(visitor)
|
irFunction.acceptVoid(visitor)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun validateIrFile(context: BackendContext, irFile: IrFile) {
|
fun validateIrFile(context: BackendContext, irFile: IrFile) {
|
||||||
val visitor = IrValidator(context)
|
val visitor = IrValidator(context, false)
|
||||||
irFile.acceptVoid(visitor)
|
irFile.acceptVoid(visitor)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun validateIrModule(context: BackendContext, irModule: IrModuleFragment) {
|
fun validateIrModule(context: BackendContext, irModule: IrModuleFragment) {
|
||||||
val visitor = IrValidator(context)
|
val visitor = IrValidator(context, true) // TODO: consider taking the boolean from settings.
|
||||||
irModule.acceptVoid(visitor)
|
irModule.acceptVoid(visitor)
|
||||||
|
|
||||||
// TODO: investigate and re-enable
|
// TODO: investigate and re-enable
|
||||||
@@ -180,7 +180,7 @@ private class Declarations {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class IrValidator(val context: BackendContext) : IrElementVisitorVoid {
|
private class IrValidator(val context: BackendContext, performHeavyValidations: Boolean) : IrElementVisitorVoid {
|
||||||
|
|
||||||
val foundDeclarations = Declarations()
|
val foundDeclarations = Declarations()
|
||||||
|
|
||||||
@@ -200,7 +200,7 @@ private class IrValidator(val context: BackendContext) : IrElementVisitorVoid {
|
|||||||
currentFile, element)
|
currentFile, element)
|
||||||
}
|
}
|
||||||
|
|
||||||
private val elementChecker = CheckIrElementVisitor(builtIns, this::error)
|
private val elementChecker = CheckIrElementVisitor(builtIns, this::error, performHeavyValidations)
|
||||||
|
|
||||||
override fun visitElement(element: IrElement) {
|
override fun visitElement(element: IrElement) {
|
||||||
element.acceptVoid(elementChecker)
|
element.acceptVoid(elementChecker)
|
||||||
|
|||||||
Reference in New Issue
Block a user