IR: make allOverridden return Set instead of Sequence, move to IrUtils
This doesn't hurt performance, but improves stack traces, in particular in JVM's BridgeLowering.
This commit is contained in:
@@ -620,3 +620,23 @@ private fun IrSimpleFunction.copyAndRenameConflictingTypeParametersFrom(
|
||||
|
||||
val IrSymbol.isSuspend: Boolean
|
||||
get() = this is IrSimpleFunctionSymbol && owner.isSuspend
|
||||
|
||||
fun IrSimpleFunction.allOverridden(includeSelf: Boolean = false): Set<IrSimpleFunction> {
|
||||
val result = mutableSetOf<IrSimpleFunction>()
|
||||
if (includeSelf) {
|
||||
computeAllOverridden(this, result)
|
||||
} else {
|
||||
for (override in overriddenSymbols) {
|
||||
computeAllOverridden(override.owner, result)
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
private fun computeAllOverridden(function: IrSimpleFunction, result: MutableSet<IrSimpleFunction>) {
|
||||
if (result.add(function)) {
|
||||
for (override in function.overriddenSymbols) {
|
||||
computeAllOverridden(override.owner, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-16
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.backend.common.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.CommonBackendContext
|
||||
import org.jetbrains.kotlin.backend.common.ir.allOverridden
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
|
||||
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
|
||||
@@ -107,7 +108,7 @@ class SpecialBridgeMethods(val context: CommonBackendContext) {
|
||||
val specialPropertyNames = specialProperties.map { (description) -> description.name }.toHashSet()
|
||||
|
||||
fun findSpecialWithOverride(irFunction: IrSimpleFunction): Pair<IrSimpleFunction, SpecialMethodWithDefaultInfo>? {
|
||||
irFunction.allOverridden().forEach { overridden ->
|
||||
for (overridden in irFunction.allOverridden()) {
|
||||
val description = overridden.toDescription()
|
||||
specialMethodsWithDefaults[description]?.let {
|
||||
return Pair(overridden, it)
|
||||
@@ -132,18 +133,3 @@ class SpecialBridgeMethods(val context: CommonBackendContext) {
|
||||
return specialMethods[irFunction.toDescription()]
|
||||
}
|
||||
}
|
||||
|
||||
fun IrSimpleFunction.allOverridden(includeSelf: Boolean = false): Sequence<IrSimpleFunction> {
|
||||
val visited = mutableSetOf<IrSimpleFunction>()
|
||||
|
||||
fun IrSimpleFunction.search(): Sequence<IrSimpleFunction> {
|
||||
if (this in visited) return emptySequence()
|
||||
return sequence {
|
||||
yield(this@search)
|
||||
visited.add(this@search)
|
||||
overriddenSymbols.forEach { yieldAll(it.owner.search()) }
|
||||
}
|
||||
}
|
||||
|
||||
return if (includeSelf) search() else search().drop(1)
|
||||
}
|
||||
|
||||
+3
-6
@@ -6,8 +6,8 @@
|
||||
package org.jetbrains.kotlin.backend.jvm.codegen
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.CodegenUtil
|
||||
import org.jetbrains.kotlin.backend.common.ir.allOverridden
|
||||
import org.jetbrains.kotlin.backend.common.lower.LocalDeclarationsLowering
|
||||
import org.jetbrains.kotlin.backend.common.lower.allOverridden
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||
import org.jetbrains.kotlin.backend.jvm.ir.isStaticInlineClassReplacement
|
||||
@@ -71,11 +71,8 @@ internal fun MethodNode.acceptWithStateMachine(
|
||||
accept(visitor)
|
||||
}
|
||||
|
||||
private fun IrFunction.anyOfOverriddenFunctionsReturnsNonUnit(): Boolean {
|
||||
return (this as? IrSimpleFunction)?.allOverridden()?.toList()?.let { functions ->
|
||||
functions.isNotEmpty() && functions.any { !it.returnType.isUnit() }
|
||||
} == true
|
||||
}
|
||||
private fun IrFunction.anyOfOverriddenFunctionsReturnsNonUnit(): Boolean =
|
||||
this is IrSimpleFunction && allOverridden().any { !it.returnType.isUnit() }
|
||||
|
||||
internal fun IrFunction.suspendForInlineToOriginal(): IrSimpleFunction? {
|
||||
if (origin != JvmLoweredDeclarationOrigin.FOR_INLINE_STATE_MACHINE_TEMPLATE &&
|
||||
|
||||
+1
-1
@@ -5,9 +5,9 @@
|
||||
|
||||
package org.jetbrains.kotlin.backend.jvm.codegen
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.ir.allOverridden
|
||||
import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny
|
||||
import org.jetbrains.kotlin.backend.common.ir.isTopLevel
|
||||
import org.jetbrains.kotlin.backend.common.lower.allOverridden
|
||||
import org.jetbrains.kotlin.backend.common.lower.parentsWithSelf
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||
|
||||
+1
-1
@@ -6,8 +6,8 @@
|
||||
package org.jetbrains.kotlin.backend.jvm.codegen
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.backend.common.ir.allOverridden
|
||||
import org.jetbrains.kotlin.backend.common.ir.ir2string
|
||||
import org.jetbrains.kotlin.backend.common.lower.allOverridden
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmBackendContext
|
||||
import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin
|
||||
import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry
|
||||
|
||||
+7
-4
@@ -6,6 +6,7 @@
|
||||
package org.jetbrains.kotlin.backend.jvm.lower
|
||||
|
||||
import org.jetbrains.kotlin.backend.common.FileLoweringPass
|
||||
import org.jetbrains.kotlin.backend.common.ir.allOverridden
|
||||
import org.jetbrains.kotlin.backend.common.ir.copyTo
|
||||
import org.jetbrains.kotlin.backend.common.ir.isMethodOfAny
|
||||
import org.jetbrains.kotlin.backend.common.ir.isStatic
|
||||
@@ -294,7 +295,9 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
||||
// Generate common bridges
|
||||
val generated = mutableMapOf<Method, Bridge>()
|
||||
|
||||
irFunction.allOverridden().filter { !it.isFakeOverride }.forEach { override ->
|
||||
for (override in irFunction.allOverridden()) {
|
||||
if (override.isFakeOverride) continue
|
||||
|
||||
val signature = override.jvmMethod
|
||||
if (targetMethod != signature && signature !in blacklist) {
|
||||
generated.getOrPut(signature) {
|
||||
@@ -338,8 +341,8 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
||||
it.specialBridgeOrNull?.signature?.takeIf { bridgeSignature -> bridgeSignature != it.jvmMethod }
|
||||
}
|
||||
|
||||
// Sequence of special bridge methods which were not implemented in Kotlin superclasses.
|
||||
private fun IrSimpleFunction.overriddenSpecialBridges(): Sequence<SpecialBridge> = allOverridden().mapNotNull {
|
||||
// List of special bridge methods which were not implemented in Kotlin superclasses.
|
||||
private fun IrSimpleFunction.overriddenSpecialBridges(): List<SpecialBridge> = allOverridden().mapNotNull {
|
||||
if (it.parentAsClass.isInterface || it.comesFromJava())
|
||||
it.specialBridgeOrNull?.takeIf { bridge -> bridge.signature != jvmMethod }
|
||||
?.copy(isFinal = false, isSynthetic = true, methodInfo = null)
|
||||
@@ -386,7 +389,7 @@ internal class BridgeLowering(val context: JvmBackendContext) : FileLoweringPass
|
||||
function.owner.safeAs<IrSimpleFunction>()?.overriddenSymbols ?: emptyList()
|
||||
}
|
||||
val redundantOverrides = inheritedOverrides.flatMapTo(mutableSetOf()) {
|
||||
it.owner.allOverridden().map { override -> override.symbol }.asIterable()
|
||||
it.owner.allOverridden().map { override -> override.symbol }
|
||||
}
|
||||
overriddenSymbols = inheritedOverrides.filter { it !in redundantOverrides }
|
||||
}
|
||||
|
||||
+1
-1
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.android.parcel.PARCELER_FQNAME
|
||||
import org.jetbrains.kotlin.android.parcel.PARCELIZE_CLASS_FQNAME
|
||||
import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase
|
||||
import org.jetbrains.kotlin.android.parcel.serializers.ParcelableExtensionBase.Companion.CREATOR_NAME
|
||||
import org.jetbrains.kotlin.backend.common.lower.allOverridden
|
||||
import org.jetbrains.kotlin.backend.common.ir.allOverridden
|
||||
import org.jetbrains.kotlin.backend.jvm.ir.erasedUpperBound
|
||||
import org.jetbrains.kotlin.ir.builders.*
|
||||
import org.jetbrains.kotlin.ir.declarations.IrClass
|
||||
|
||||
Reference in New Issue
Block a user