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
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.symbols.IrAnonymousInitializerSymbol
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrAnonymousInitializer : IrSymbolDeclaration<IrAnonymousInitializerSymbol> {
abstract class IrAnonymousInitializer : IrDeclarationBase(), IrSymbolDeclaration<IrAnonymousInitializerSymbol> {
@ObsoleteDescriptorBasedAPI
abstract override val descriptor: ClassDescriptor // TODO special descriptor for anonymous initializer blocks
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrClass :
IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithName, IrDeclarationWithVisibility,
IrDeclarationBase(), IrSymbolDeclaration<IrClassSymbol>, IrDeclarationWithName, IrDeclarationWithVisibility,
IrDeclarationContainer, IrTypeParametersContainer, IrAttributeContainer, IrMetadataSourceOwner {
@ObsoleteDescriptorBasedAPI
@@ -43,7 +43,9 @@ interface IrDeclaration : IrStatement, IrMutableAnnotationContainer {
var parent: IrDeclarationParent
val factory: IrFactory
}
abstract class IrDeclarationBase : IrDeclaration {
override fun <D> transform(transformer: IrElementTransformer<D>, data: D): IrStatement =
accept(transformer, data) as IrStatement
}
@@ -23,7 +23,7 @@ import org.jetbrains.kotlin.ir.symbols.IrEnumEntrySymbol
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrEnumEntry : IrSymbolDeclaration<IrEnumEntrySymbol>, IrDeclarationWithName {
abstract class IrEnumEntry : IrDeclarationBase(), IrSymbolDeclaration<IrEnumEntrySymbol>, IrDeclarationWithName {
@ObsoleteDescriptorBasedAPI
abstract override val descriptor: ClassDescriptor
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.ir.declarations
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrErrorDeclaration : IrDeclaration {
abstract class IrErrorDeclaration : IrDeclarationBase() {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitErrorDeclaration(this, data)
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrField :
IrDeclarationBase(),
IrSymbolDeclaration<IrFieldSymbol>,
IrDeclarationWithName, IrDeclarationWithVisibility, IrDeclarationParent, IrMetadataSourceOwner {
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrFunction :
IrDeclarationBase(),
IrDeclarationWithName, IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget,
IrMetadataSourceOwner {
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrLocalDelegatedProperty :
IrDeclarationBase(),
IrDeclarationWithName,
IrSymbolOwner,
IrMetadataSourceOwner {
@@ -22,7 +22,7 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrProperty : IrOverridableMember, IrMetadataSourceOwner {
abstract class IrProperty : IrDeclarationBase(), IrOverridableMember, IrMetadataSourceOwner {
@ObsoleteDescriptorBasedAPI
abstract override val descriptor: PropertyDescriptor
abstract override val symbol: IrPropertySymbol
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.ir.symbols.IrScriptSymbol
//TODO: make IrScript as IrPackageFragment, because script is used as a file, not as a class
//NOTE: declarations and statements stored separately
abstract class IrScript : IrSymbolDeclaration<IrScriptSymbol>, IrDeclarationContainer, IrDeclarationWithName, IrDeclarationParent {
abstract class IrScript :
IrDeclarationBase(), IrSymbolDeclaration<IrScriptSymbol>, IrDeclarationContainer, IrDeclarationWithName, IrDeclarationParent {
abstract val statements: MutableList<IrStatement>
// NOTE: is the result of the FE conversion, because there script interpreted as a class and has receiver
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrTypeAlias :
IrDeclarationBase(),
IrSymbolDeclaration<IrTypeAliasSymbol>,
IrDeclarationWithName,
IrDeclarationWithVisibility,
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.types.Variance
abstract class IrTypeParameter : IrSymbolDeclaration<IrTypeParameterSymbol>, IrDeclarationWithName {
abstract class IrTypeParameter : IrDeclarationBase(), IrSymbolDeclaration<IrTypeParameterSymbol>, IrDeclarationWithName {
@ObsoleteDescriptorBasedAPI
abstract override val descriptor: TypeParameterDescriptor
@@ -10,7 +10,7 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.symbols.IrValueSymbol
import org.jetbrains.kotlin.ir.types.IrType
abstract class IrValueDeclaration : IrDeclarationWithName, IrSymbolOwner {
abstract class IrValueDeclaration : IrDeclarationBase(), IrDeclarationWithName, IrSymbolOwner {
@ObsoleteDescriptorBasedAPI
abstract override val descriptor: ValueDescriptor
@@ -109,7 +109,7 @@ open class DeepCopyIrTreeWithSymbols(
declaration.transformDeclarationsTo(this)
}
override fun visitDeclaration(declaration: IrDeclaration): IrStatement =
override fun visitDeclaration(declaration: IrDeclarationBase): IrStatement =
throw IllegalArgumentException("Unsupported declaration type: $declaration")
override fun visitScript(declaration: IrScript): IrStatement {
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.IrDeclaration
import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.ir.declarations.IrDeclarationBase
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
import org.jetbrains.kotlin.ir.visitors.acceptVoid
@@ -39,7 +39,7 @@ class PatchDeclarationParentsVisitor() : IrElementVisitorVoid {
declarationParentsStack.pop()
}
override fun visitDeclaration(declaration: IrDeclaration) {
override fun visitDeclaration(declaration: IrDeclarationBase) {
patchParent(declaration)
if (declaration is IrDeclarationParent) {
@@ -56,4 +56,4 @@ class PatchDeclarationParentsVisitor() : IrElementVisitorVoid {
private fun patchParent(declaration: IrDeclaration) {
declaration.parent = declarationParentsStack.peekFirst()
}
}
}
@@ -19,8 +19,8 @@ package org.jetbrains.kotlin.ir.util
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
@@ -340,7 +340,7 @@ class RenderIrElementVisitor(private val normalizeNames: Boolean = false) : IrEl
override fun visitElement(element: IrElement, data: Nothing?): String =
"?ELEMENT? ${element::class.java.simpleName} $element"
override fun visitDeclaration(declaration: IrDeclaration, data: Nothing?): String =
override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?): String =
"?DECLARATION? ${declaration::class.java.simpleName} $declaration"
override fun visitModuleFragment(declaration: IrModuleFragment, data: Nothing?): String =
@@ -34,7 +34,7 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: D): IrExternalPackageFragment =
declaration.also { it.transformChildren(this, data) }
override fun visitDeclaration(declaration: IrDeclaration, data: D): IrStatement =
override fun visitDeclaration(declaration: IrDeclarationBase, data: D): IrStatement =
declaration.also { it.transformChildren(this, data) }
override fun visitScript(declaration: IrScript, data: D) = visitDeclaration(declaration, data)
@@ -43,8 +43,8 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
final override fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: Nothing?): IrExternalPackageFragment =
visitExternalPackageFragment(declaration)
open fun visitDeclaration(declaration: IrDeclaration): IrStatement = declaration.transformChildren()
final override fun visitDeclaration(declaration: IrDeclaration, data: Nothing?): IrStatement = visitDeclaration(declaration)
open fun visitDeclaration(declaration: IrDeclarationBase): IrStatement = declaration.transformChildren()
final override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?): IrStatement = visitDeclaration(declaration)
open fun visitScript(declaration: IrScript) = visitDeclaration(declaration)
final override fun visitScript(declaration: IrScript, data: Nothing?) = visitScript(declaration)
@@ -28,7 +28,7 @@ interface IrElementVisitor<out R, in D> {
fun visitExternalPackageFragment(declaration: IrExternalPackageFragment, data: D) = visitPackageFragment(declaration, data)
fun visitScript(declaration: IrScript, data: D) = visitDeclaration(declaration, data)
fun visitDeclaration(declaration: IrDeclaration, data: D) = visitElement(declaration, data)
fun visitDeclaration(declaration: IrDeclarationBase, data: D) = visitElement(declaration, data)
fun visitClass(declaration: IrClass, data: D) = visitDeclaration(declaration, data)
fun visitFunction(declaration: IrFunction, data: D) = visitDeclaration(declaration, data)
fun visitSimpleFunction(declaration: IrSimpleFunction, data: D) = visitFunction(declaration, data)
@@ -37,8 +37,8 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
fun visitFile(declaration: IrFile) = visitPackageFragment(declaration)
override fun visitFile(declaration: IrFile, data: Nothing?) = visitFile(declaration)
fun visitDeclaration(declaration: IrDeclaration) = visitElement(declaration)
override fun visitDeclaration(declaration: IrDeclaration, data: Nothing?) = visitDeclaration(declaration)
fun visitDeclaration(declaration: IrDeclarationBase) = visitElement(declaration)
override fun visitDeclaration(declaration: IrDeclarationBase, data: Nothing?) = visitDeclaration(declaration)
fun visitClass(declaration: IrClass) = visitDeclaration(declaration)
override fun visitClass(declaration: IrClass, data: Nothing?) = visitClass(declaration)