Added phase to IrValidator: ensure that all IR nodes are different

This commit is contained in:
Igor Chevdar
2017-04-03 14:30:11 +03:00
parent dc7e00aa2a
commit fc55e9fba1
2 changed files with 13 additions and 6 deletions
@@ -25,9 +25,16 @@ import org.jetbrains.kotlin.types.typeUtil.makeNullable
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) {
if (ensureAllNodesAreDifferent) {
if (set.contains(element))
reportError(element, "Duplicate IR node")
set.add(element)
}
// Nothing to do.
}
@@ -28,17 +28,17 @@ import org.jetbrains.kotlin.ir.visitors.acceptVoid
import org.jetbrains.kotlin.resolve.descriptorUtil.module
fun validateIrFunction(context: BackendContext, irFunction: IrFunction) {
val visitor = IrValidator(context)
val visitor = IrValidator(context, false)
irFunction.acceptVoid(visitor)
}
fun validateIrFile(context: BackendContext, irFile: IrFile) {
val visitor = IrValidator(context)
val visitor = IrValidator(context, false)
irFile.acceptVoid(visitor)
}
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)
// 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()
@@ -200,7 +200,7 @@ private class IrValidator(val context: BackendContext) : IrElementVisitorVoid {
currentFile, element)
}
private val elementChecker = CheckIrElementVisitor(builtIns, this::error)
private val elementChecker = CheckIrElementVisitor(builtIns, this::error, performHeavyValidations)
override fun visitElement(element: IrElement) {
element.acceptVoid(elementChecker)