[BIR] Remove all additional caching implemented in lowering phases
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt index 7115e73..f22af37 100644 --- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt +++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmNameLowering.kt
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.bir.expressions.BirConstructorCall import org.jetbrains.kotlin.bir.set import org.jetbrains.kotlin.bir.util.constructedClass +import org.jetbrains.kotlin.bir.util.isAnnotation import org.jetbrains.kotlin.codegen.inline.coroutines.FOR_INLINE_SUFFIX import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.types.impl.IrErrorClassImpl.origin @@ -24,10 +25,8 @@ context(JvmBirBackendContext) class BirJvmNameLowering : BirLoweringPhase() { - private val JvmNameAnnotation by lz { birBuiltIns.findClass(DescriptorUtils.JVM_NAME) } - private val jvmNameAnnotations = registerIndexKey(BirConstructorCall, false) { - it.constructedClass == JvmNameAnnotation + it.isAnnotation(DescriptorUtils.JVM_NAME) } override fun lower(module: BirModuleFragment) {
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt index 4338b1b..f5eb92f 100644 --- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt +++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmOverloadsAnnotationLowering.kt
@@ -19,10 +19,8 @@ context(JvmBirBackendContext) class BirJvmOverloadsAnnotationLowering : BirLoweringPhase() { - private val JvmOverloadsAnnotation by lz { birBuiltIns.findClass(JvmStandardClassIds.JVM_OVERLOADS_FQ_NAME) } - private val overloadsAnnotations = registerIndexKey(BirConstructorCall, false) { - it.constructedClass == JvmOverloadsAnnotation + it.isAnnotation(JvmStandardClassIds.JVM_OVERLOADS_FQ_NAME) } override fun lower(module: BirModuleFragment) {
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt index f46d071..06d3b99 100644 --- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt +++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirJvmStaticInObjectLowering.kt
@@ -28,13 +28,10 @@ context(JvmBirBackendContext) class BirJvmStaticInObjectLowering : BirLoweringPhase() { - private val JvmStaticAnnotation by lz { birBuiltIns.findClass(JVM_STATIC_ANNOTATION_FQ_NAME) } - private val staticDeclarations = registerIndexKey<BirDeclaration>(BirSimpleFunction or BirProperty, true) { declaration -> - val annotation = JvmStaticAnnotation ?: return@registerIndexKey false - declaration.hasAnnotation(annotation) || - (declaration as? BirSimpleFunction)?.correspondingPropertySymbol?.owner?.hasAnnotation(annotation) == true || - (declaration as? BirProperty)?.getter?.hasAnnotation(annotation) == true + declaration.hasAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) || + (declaration as? BirSimpleFunction)?.correspondingPropertySymbol?.owner?.hasAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) == true || + (declaration as? BirProperty)?.getter?.hasAnnotation(JVM_STATIC_ANNOTATION_FQ_NAME) == true } private val memberAccesses = registerBackReferencesKeyWithUntypedSymbolProperty(BirMemberAccessExpression, BirMemberAccessExpression<*>::symbol)
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt index 18878d4..8e35424 100644 --- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt +++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirPolymorphicSignatureLowering.kt
@@ -29,10 +29,8 @@ context(JvmBirBackendContext) class BirPolymorphicSignatureLowering : BirLoweringPhase() { - private val PolymorphicSignatureAnnotation by lz { birBuiltIns.findClass(PolymorphicSignatureCallChecker.polymorphicSignatureFqName) } - private val polymorphicFunctions = registerIndexKey(BirSimpleFunction, true) { function -> - PolymorphicSignatureAnnotation?.let { function.hasAnnotation(it) } == true + function.hasAnnotation(PolymorphicSignatureCallChecker.polymorphicSignatureFqName) } private val functionCalls = registerBackReferencesKey(BirCall, BirCall::symbol)
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt index a5cc393..97ff24e 100644 --- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt +++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirRepeatedAnnotationLowering.kt
@@ -30,9 +30,6 @@ context(JvmBirBackendContext) class BirRepeatedAnnotationLowering : BirLoweringPhase() { - private val KotlinRepeatableAnnotation by lz { birBuiltIns.findClass(StandardNames.FqNames.repeatable) } - private val JavaRepeatableAnnotation by lz { birBuiltIns.findClass(JvmAnnotationNames.REPEATABLE_ANNOTATION)!! } - private val declaredAnnotations = registerIndexKey(BirClass, false) { it.kind == ClassKind.ANNOTATION_CLASS } @@ -45,8 +42,8 @@ override fun lower(module: BirModuleFragment) { getAllElementsWithIndex(declaredAnnotations).forEach { annotationClass -> if ( - KotlinRepeatableAnnotation?.let { annotationClass.hasAnnotation(it) } == true - && !annotationClass.hasAnnotation(JavaRepeatableAnnotation) + annotationClass.hasAnnotation(StandardNames.FqNames.repeatable) + && !annotationClass.hasAnnotation(JvmAnnotationNames.REPEATABLE_ANNOTATION) ) { val repeatedAnnotationSyntheticContainer = createRepeatedAnnotationSyntheticContainer(annotationClass) annotationClass.declarations += repeatedAnnotationSyntheticContainer @@ -84,7 +81,7 @@ } private fun getOrCreateContainerClass(annotationClass: BirClass): BirClass { - val jvmRepeatable = annotationClass.getAnnotation(JavaRepeatableAnnotation) + val jvmRepeatable = annotationClass.getAnnotation(JvmAnnotationNames.REPEATABLE_ANNOTATION) return if (jvmRepeatable != null) { val containerClassReference = jvmRepeatable.valueArguments[0] require(containerClassReference is BirClassReference) {
diff --git a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt index 298b633..a481444 100644 --- a/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt +++ b/compiler/ir/bir/backend/src/org/jetbrains/kotlin/bir/backend/lower/BirVarargLowering.kt
@@ -12,7 +12,10 @@ import org.jetbrains.kotlin.bir.backend.jvm.JvmBirBackendContext import org.jetbrains.kotlin.bir.backend.jvm.birArray import org.jetbrains.kotlin.bir.backend.jvm.birArrayOf +import org.jetbrains.kotlin.bir.declarations.BirClass +import org.jetbrains.kotlin.bir.declarations.BirFunction import org.jetbrains.kotlin.bir.declarations.BirModuleFragment +import org.jetbrains.kotlin.bir.declarations.BirPackageFragment import org.jetbrains.kotlin.bir.expressions.* import org.jetbrains.kotlin.bir.types.utils.makeNotNull import org.jetbrains.kotlin.bir.types.utils.substitute @@ -20,8 +23,15 @@ import org.jetbrains.kotlin.builtins.PrimitiveType import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.UnsignedType +import org.jetbrains.kotlin.ir.declarations.IrClass +import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.IrPackageFragment +import org.jetbrains.kotlin.ir.util.getPackageFragment +import org.jetbrains.kotlin.ir.util.isVararg import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance +import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull context(JvmBirBackendContext) class BirVarargLowering : BirLoweringPhase() { @@ -67,7 +77,7 @@ is BirExpression -> +element is BirSpreadElement -> { val spread = element.expression!! - if (spread is BirFunctionAccessExpression && spread.symbol.owner in primitiveArrayOfFunctions) { + if (spread is BirFunctionAccessExpression && spread.symbol.owner.isArrayOf()) { // Skip empty arrays and don't copy immediately created arrays val argument = spread.valueArguments[0] ?: continue if (argument is BirVararg) { @@ -84,17 +94,24 @@ private fun BirElement.isInsideAnnotation(): Boolean = ancestors().takeWhile { it is BirExpression }.any { it is BirConstructorCall && it.isAnnotation } - - private val primitiveArrayOfFunctions by lz { - (PrimitiveType.entries.map { type -> type.name } + UnsignedType.entries.map { type -> type.typeName.asString() }) - .map { name -> name.toLowerCaseAsciiOnly() + "ArrayOf" } - .plus("arrayOf") - .flatMap { name -> birBuiltIns.findFunctions(Name.identifier(name), StandardNames.BUILT_INS_PACKAGE_FQ_NAME.asString()) } - .filter { - it.extensionReceiverParameter == null && - it.dispatchReceiverParameter == null && - it.valueParameters.size == 1 && - it.valueParameters[0].isVararg - }.toSet() - } } + +internal val PRIMITIVE_ARRAY_OF_NAMES: Set<String> = + (PrimitiveType.values().map { type -> type.name } + UnsignedType.values().map { type -> type.typeName.asString() }) + .map { name -> name.toLowerCaseAsciiOnly() + "ArrayOf" }.toSet() + +internal const val ARRAY_OF_NAME = "arrayOf" + +internal fun BirFunction.isArrayOf(): Boolean { + val parent = ancestors().firstIsInstanceOrNull<BirPackageFragment>() ?: return false + return parent.packageFqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME && + name.asString().let { it in PRIMITIVE_ARRAY_OF_NAMES || it == ARRAY_OF_NAME } && + extensionReceiverParameter == null && + dispatchReceiverParameter == null && + valueParameters.size == 1 && + valueParameters[0].isVararg +} + +internal fun BirFunction.isEmptyArray(): Boolean = + name.asString() == "emptyArray" && + (parent as? BirPackageFragment)?.packageFqName == StandardNames.BUILT_INS_PACKAGE_FQ_NAME