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 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.
} }
@@ -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)