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
@@ -12,7 +12,10 @@ import org.jetbrains.kotlin.ir.backend.js.utils.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.classOrNull
import org.jetbrains.kotlin.ir.types.classifierOrFail
import org.jetbrains.kotlin.ir.types.classifierOrNull
import org.jetbrains.kotlin.ir.types.getClass
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
@@ -184,7 +187,7 @@ fun usefulDeclarations(roots: Iterable<IrDeclaration>, context: JsIrBackendConte
// Skip
}
override fun visitDeclaration(declaration: IrDeclaration) {
override fun visitDeclaration(declaration: IrDeclarationBase) {
if (declaration !== it) declaration.enqueue(it, "roots' nested declaration")
super.visitDeclaration(declaration)
@@ -437,4 +440,4 @@ private fun Collection<IrClass>.filterDescendantsOf(bases: Collection<IrClass>):
}
return this.filter { overridesAnyBase(it) }
}
}
@@ -88,7 +88,7 @@ class ES6AddInternalParametersToConstructorPhase(val context: JsIrBackendContext
context.mapping.constructorToInitFunction[constructor] = initFunction
initFunction.transformChildren(object : IrElementTransformerVoid() {
override fun visitDeclaration(declaration: IrDeclaration): IrStatement {
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement {
declaration.parent = initFunction
return declaration
}
@@ -8,19 +8,19 @@ package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.backend.common.ir.addChild
import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.utils.getJsModule
import org.jetbrains.kotlin.ir.backend.js.utils.getJsQualifier
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl
import org.jetbrains.kotlin.ir.symbols.IrFileSymbol
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.fqNameWhenAvailable
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.FqName
private val BODILESS_BUILTIN_CLASSES = listOf(
@@ -129,10 +129,10 @@ class MoveBodilessDeclarationsToSeparatePlaceLowering(private val context: JsIrB
element.acceptChildrenVoid(this)
}
override fun visitDeclaration(declaration: IrDeclaration) {
override fun visitDeclaration(declaration: IrDeclarationBase) {
context.externalDeclarations.add(declaration)
super.visitDeclaration(declaration)
}
}, null)
}
}
}
@@ -11,13 +11,15 @@ import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext
import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrBranchImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrCatchImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrElseBranchImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrTryImpl
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.types.IrDynamicType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
/**
@@ -51,7 +53,7 @@ class MultipleCatchesLowering(private val context: JsIrBackendContext) : BodyLow
override fun lower(irBody: IrBody, container: IrDeclaration) {
irBody.transform(object : IrElementTransformer<IrDeclarationParent> {
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent): IrStatement {
override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclarationParent): IrStatement {
val parent = (declaration as? IrDeclarationParent) ?: data
return super.visitDeclaration(declaration, parent)
}
@@ -118,4 +120,4 @@ class MultipleCatchesLowering(private val context: JsIrBackendContext) : BodyLow
}, container as? IrDeclarationParent ?: container.parent)
}
}
}
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.lower
import org.jetbrains.kotlin.backend.common.BodyLoweringPass
import org.jetbrains.kotlin.backend.common.DeclarationTransformer
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.backend.js.JsCommonBackendContext
import org.jetbrains.kotlin.ir.builders.declarations.addConstructor
import org.jetbrains.kotlin.ir.declarations.*
@@ -67,7 +68,7 @@ class DelegateToSyntheticPrimaryConstructor(context: JsCommonBackendContext) : B
if (container is IrConstructor && !container.isPrimary) {
container.parentAsClass.syntheticPrimaryConstructor?.let { primary ->
val initializeTransformer = object : IrElementTransformerVoid() {
override fun visitDeclaration(declaration: IrDeclaration) = declaration // optimize visiting
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement = declaration // optimize visiting
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall) = expression.run {
IrDelegatingConstructorCallImpl(
@@ -83,4 +84,4 @@ class DelegateToSyntheticPrimaryConstructor(context: JsCommonBackendContext) : B
}
}
}
}
}
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.backend.js.utils.isPure
import org.jetbrains.kotlin.ir.declarations.IrClass
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.expressions.impl.IrCompositeImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
@@ -64,7 +65,7 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : BodyLoweringPass {
override fun lower(irBody: IrBody, container: IrDeclaration) {
irBody.transformChildren(object : IrElementTransformer<IrDeclarationParent> {
override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent) =
override fun visitDeclaration(declaration: IrDeclarationBase, data: IrDeclarationParent) =
super.visitDeclaration(declaration, declaration as? IrDeclarationParent ?: data)
override fun visitTypeOperator(expression: IrTypeOperatorCall, data: IrDeclarationParent): IrExpression {
@@ -374,4 +375,4 @@ class TypeOperatorLowering(val context: JsIrBackendContext) : BodyLoweringPass {
}
}, container as? IrDeclarationParent ?: container.parent)
}
}
}
@@ -372,7 +372,7 @@ class NameTables(
element.acceptChildrenVoid(this)
}
override fun visitDeclaration(declaration: IrDeclaration) {
override fun visitDeclaration(declaration: IrDeclarationBase) {
if (declaration is IrDeclarationWithName && declaration is IrSymbolOwner) {
table.declareFreshName(declaration, declaration.name.asString())
}
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.ir.backend.js.utils
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.util.isEffectivelyExternal
import org.jetbrains.kotlin.ir.util.isPropertyAccessor
@@ -30,7 +30,7 @@ class StableNamesCollector : IrElementVisitorVoid {
element.acceptChildrenVoid(this)
}
override fun visitDeclaration(declaration: IrDeclaration) {
override fun visitDeclaration(declaration: IrDeclarationBase) {
super.visitDeclaration(declaration)
if (declaration !is IrDeclarationWithName)