IR: introduce abstract class IrDeclarationBase

The main purpose of this class is to improve performance of IR visitors
and transformers. `IrElementVisitor.visitDeclaration` now takes
IrDeclarationBase as a parameter, and therefore the call to `accept`
there is now a virtual class call, instead of an interface call.
This commit is contained in:
Alexander Udalov
2020-07-22 15:28:27 +02:00
parent 771e7574f4
commit 8db1c3611b
45 changed files with 85 additions and 74 deletions
@@ -312,7 +312,7 @@ class CheckIrElementVisitor(
expression.symbol.ensureBound(expression)
}
override fun visitDeclaration(declaration: IrDeclaration) {
override fun visitDeclaration(declaration: IrDeclarationBase) {
super.visitDeclaration(declaration)
if (declaration is IrOverridableDeclaration<*>) {
@@ -98,7 +98,7 @@ object CheckDeclarationParentsVisitor : IrElementVisitor<Unit, IrDeclarationPare
element.acceptChildren(this, element as? IrDeclarationParent ?: data)
}
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent?) {
override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclarationParent?) {
checkParent(declaration, data)
super.visitDeclaration(declaration, data)
}
@@ -127,7 +127,7 @@ fun BodyLoweringPass.runOnFilePostfix(irFile: IrFile, withLocalDeclarations: Boo
element.acceptChildren(this, data)
}
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclaration?) {
override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclaration?) {
declaration.acceptChildren(this, declaration)
}
@@ -78,7 +78,7 @@ private fun IrBody.move(
return super.visitBlock(expression)
}
override fun visitDeclaration(declaration: IrDeclaration): IrStatement {
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
if (declaration.parent == source)
declaration.parent = target
return super.visitDeclaration(declaration)
@@ -364,7 +364,7 @@ object SetDeclarationsParentVisitor : IrElementVisitor<Unit, IrDeclarationParent
}
}
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent) {
override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclarationParent) {
declaration.parent = data
super.visitDeclaration(declaration, data)
}
@@ -105,7 +105,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
return expression
}
override fun visitDeclaration(declaration: IrDeclaration): IrStatement {
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
declaration.transformChildrenVoid(this)
if (declaration.parent == irConstructor)
declaration.parent = staticMethod
@@ -142,7 +142,7 @@ class InlineClassLowering(val context: CommonBackendContext) {
statements.addAll((functionBody as IrBlockBody).statements)
transformChildrenVoid(object : IrElementTransformerVoid() {
override fun visitDeclaration(declaration: IrDeclaration): IrStatement {
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
declaration.transformChildrenVoid(this)
if (declaration.parent == function)
declaration.parent = staticMethod
@@ -442,7 +442,7 @@ class LocalDeclarationsLowering(
return super.visitDeclarationReference(expression)
}
override fun visitDeclaration(declaration: IrDeclaration): IrStatement {
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
if (declaration is IrSymbolOwner && declaration in transformedDeclarations) {
TODO()
}
@@ -91,7 +91,7 @@ class SharedVariablesLowering(val context: BackendContext) : BodyLoweringPass {
}
}
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent?) {
override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclarationParent?) {
super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data)
}
@@ -24,10 +24,7 @@ import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
import org.jetbrains.kotlin.ir.builders.createTmpVariable
import org.jetbrains.kotlin.ir.builders.irCall
import org.jetbrains.kotlin.ir.builders.irGet
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.declarations.IrSymbolDeclaration
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrStringConcatenation
import org.jetbrains.kotlin.ir.types.IrType
@@ -106,7 +103,7 @@ private class StringConcatenationTransformer(val lower: StringConcatenationLower
}
}
override fun visitDeclaration(declaration: IrDeclaration): IrStatement {
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
if (declaration !is IrSymbolDeclaration<*>) {
return super.visitDeclaration(declaration)
}
@@ -120,4 +117,4 @@ private class StringConcatenationTransformer(val lower: StringConcatenationLower
return this@with
}
}
}
}
@@ -70,7 +70,7 @@ fun dumpIrElement(actionState: ActionState, data: IrElement, context: Any?): Str
element.acceptChildrenVoid(this)
}
override fun visitDeclaration(declaration: IrDeclaration) {
override fun visitDeclaration(declaration: IrDeclarationBase) {
if (declaration is IrDeclarationWithName && FqName(dumpOnlyFqName) == declaration.fqNameWhenAvailable) {
dumpText += declaration.dump()
} else {