IR refactor patch / validate declaration parent

This commit is contained in:
Dmitry Petrov
2022-01-28 12:51:37 +03:00
committed by Space
parent 08a946fd3f
commit 5bc8c1a600
4 changed files with 65 additions and 116 deletions
@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
import java.util.*
import kotlin.collections.ArrayList
fun <T : IrElement> T.patchDeclarationParents(initialParent: IrDeclarationParent? = null) =
apply {
@@ -19,13 +18,8 @@ fun <T : IrElement> T.patchDeclarationParents(initialParent: IrDeclarationParent
acceptVoid(visitor)
}
class PatchDeclarationParentsVisitor() : IrElementVisitorVoid {
constructor(containingDeclaration: IrDeclarationParent) : this() {
declarationParentsStack.push(containingDeclaration)
}
private val declarationParentsStack = ArrayDeque<IrDeclarationParent>()
abstract class DeclarationParentsVisitor : IrElementVisitorVoid {
protected val declarationParentsStack = ArrayDeque<IrDeclarationParent>()
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
@@ -38,7 +32,7 @@ class PatchDeclarationParentsVisitor() : IrElementVisitorVoid {
}
override fun visitDeclaration(declaration: IrDeclarationBase) {
patchParent(declaration)
handleParent(declaration, declarationParentsStack.peekFirst())
if (declaration is IrDeclarationParent) {
declarationParentsStack.push(declaration)
@@ -51,58 +45,16 @@ class PatchDeclarationParentsVisitor() : IrElementVisitorVoid {
}
}
private fun patchParent(declaration: IrDeclaration) {
declaration.parent = declarationParentsStack.peekFirst()
}
protected abstract fun handleParent(declaration: IrDeclaration, parent: IrDeclarationParent)
}
class CheckDeclarationParentsVisitor() : IrElementVisitorVoid {
class PatchDeclarationParentsVisitor() : DeclarationParentsVisitor() {
constructor(containingDeclaration: IrDeclarationParent) : this() {
declarationParentsStack.push(containingDeclaration)
}
private val declarationParentsStack = ArrayDeque<IrDeclarationParent>()
class Data(val declaration: IrDeclaration, val expectedParent: IrDeclarationParent, val actualParent: IrDeclarationParent?)
val errors = ArrayList<Data>()
override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this)
}
override fun visitPackageFragment(declaration: IrPackageFragment) {
declarationParentsStack.push(declaration)
super.visitPackageFragment(declaration)
declarationParentsStack.pop()
}
override fun visitDeclaration(declaration: IrDeclarationBase) {
checkParent(declaration)
if (declaration is IrDeclarationParent) {
declarationParentsStack.push(declaration)
}
super.visitDeclaration(declaration)
if (declaration is IrDeclarationParent) {
declarationParentsStack.pop()
}
}
private fun checkParent(declaration: IrDeclaration) {
val expectedParent = declarationParentsStack.peekFirst()
try {
val actualParent = declaration.parent
if (actualParent != expectedParent) {
errors.add(Data(declaration, expectedParent, actualParent))
}
} catch (e: Exception) {
errors.add(Data(declaration, expectedParent, null))
}
override fun handleParent(declaration: IrDeclaration, parent: IrDeclarationParent) {
declaration.parent = parent
}
}