diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index 8c50a987e20..94c7a41c0c3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -68,40 +68,46 @@ fun AbstractKtSourceElement?.startOffsetSkippingComments(): Int? { } } -internal fun FirElement.convertWithOffsets( - f: (startOffset: Int, endOffset: Int) -> T -): T { +internal inline fun FirElement.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T { return source.convertWithOffsets(f) } -internal fun KtSourceElement?.convertWithOffsets( - f: (startOffset: Int, endOffset: Int) -> T -): T { - if (psi is PsiCompiledElement) return f(UNDEFINED_OFFSET, UNDEFINED_OFFSET) - val startOffset = this?.startOffsetSkippingComments() ?: this?.startOffset ?: UNDEFINED_OFFSET - val endOffset = this?.endOffset ?: UNDEFINED_OFFSET +internal inline fun KtSourceElement?.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T { + val startOffset: Int + val endOffset: Int + + if (psi is PsiCompiledElement) { + startOffset = UNDEFINED_OFFSET + endOffset = UNDEFINED_OFFSET + } else { + startOffset = this?.startOffsetSkippingComments() ?: this?.startOffset ?: UNDEFINED_OFFSET + endOffset = this?.endOffset ?: UNDEFINED_OFFSET + } + return f(startOffset, endOffset) } -internal fun FirQualifiedAccessExpression.convertWithOffsets( - f: (startOffset: Int, endOffset: Int) -> T -): T { +internal inline fun FirQualifiedAccessExpression.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T { return convertWithOffsets(this.calleeReference, f) } -internal fun FirThisReceiverExpression.convertWithOffsets( - f: (startOffset: Int, endOffset: Int) -> T -): T { +internal inline fun FirThisReceiverExpression.convertWithOffsets(f: (startOffset: Int, endOffset: Int) -> T): T { return source.convertWithOffsets(f) } -internal fun FirStatement.convertWithOffsets( +internal inline fun FirStatement.convertWithOffsets( calleeReference: FirReference, f: (startOffset: Int, endOffset: Int) -> T ): T { - if (psi is PsiCompiledElement) return f(UNDEFINED_OFFSET, UNDEFINED_OFFSET) - val startOffset = calleeReference.source?.startOffsetSkippingComments() ?: calleeReference.source?.startOffset ?: UNDEFINED_OFFSET - val endOffset = source?.endOffset ?: UNDEFINED_OFFSET + val startOffset: Int + val endOffset: Int + if (psi is PsiCompiledElement) { + startOffset = UNDEFINED_OFFSET + endOffset = UNDEFINED_OFFSET + } else { + startOffset = calleeReference.source?.startOffsetSkippingComments() ?: calleeReference.source?.startOffset ?: UNDEFINED_OFFSET + endOffset = source?.endOffset ?: UNDEFINED_OFFSET + } return f(startOffset, endOffset) } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt index 22ceb508882..a8355f0f714 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt @@ -13,14 +13,23 @@ import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.isSetter import org.jetbrains.kotlin.ir.util.parentClassOrNull +import org.jetbrains.kotlin.util.PrivateForInline +@OptIn(PrivateForInline::class) class Fir2IrConversionScope { - private val parentStack = mutableListOf() + @PublishedApi + @PrivateForInline + internal val parentStack = mutableListOf() - private val containingFirClassStack = mutableListOf() - private val currentlyGeneratedDelegatedConstructors = mutableMapOf() + @PublishedApi + @PrivateForInline + internal val containingFirClassStack = mutableListOf() - fun withParent(parent: T, f: T.() -> R): R { + @PublishedApi + @PrivateForInline + internal val currentlyGeneratedDelegatedConstructors = mutableMapOf() + + inline fun withParent(parent: T, f: T.() -> R): R { parentStack += parent try { return parent.f() @@ -29,11 +38,13 @@ class Fir2IrConversionScope { } } - fun forDelegatingConstructorCall(constructor: IrConstructor, irClass: IrClass, f: () -> T): T { + internal fun forDelegatingConstructorCall(constructor: IrConstructor, irClass: IrClass, f: () -> T): T { currentlyGeneratedDelegatedConstructors[irClass] = constructor - val result = f() - currentlyGeneratedDelegatedConstructors.remove(irClass) - return result + try { + return f() + } finally { + currentlyGeneratedDelegatedConstructors.remove(irClass) + } } fun getConstructorForCurrentlyGeneratedDelegatedConstructor(itClass: IrClass): IrConstructor? = @@ -41,10 +52,13 @@ class Fir2IrConversionScope { fun containingFileIfAny(): IrFile? = parentStack.getOrNull(0) as? IrFile - fun withContainingFirClass(containingFirClass: FirClass, f: () -> Unit) { + inline fun withContainingFirClass(containingFirClass: FirClass, f: () -> Unit) { containingFirClassStack += containingFirClass - f() - containingFirClassStack.removeAt(containingFirClassStack.size - 1) + try { + f() + } finally { + containingFirClassStack.removeAt(containingFirClassStack.size - 1) + } } fun parentFromStack(): IrDeclarationParent = parentStack.last() @@ -66,9 +80,11 @@ class Fir2IrConversionScope { fun containerFirClass(): FirClass? = containingFirClassStack.lastOrNull() - private val functionStack = mutableListOf() + @PublishedApi + @PrivateForInline + internal val functionStack = mutableListOf() - fun withFunction(function: T, f: T.() -> R): R { + inline fun withFunction(function: T, f: T.() -> R): R { functionStack += function try { return function.f() @@ -77,9 +93,11 @@ class Fir2IrConversionScope { } } - private val propertyStack = mutableListOf>() + @PublishedApi + @PrivateForInline + internal val propertyStack = mutableListOf>() - fun withProperty(property: IrProperty, firProperty: FirProperty? = null, f: IrProperty.() -> R): R { + inline fun withProperty(property: IrProperty, firProperty: FirProperty? = null, f: IrProperty.() -> R): R { propertyStack += (property to firProperty) try { return property.f() @@ -88,9 +106,11 @@ class Fir2IrConversionScope { } } - private val classStack = mutableListOf() + @PublishedApi + @PrivateForInline + internal val classStack = mutableListOf() - fun withClass(klass: IrClass, f: IrClass.() -> R): R { + inline fun withClass(klass: IrClass, f: IrClass.() -> R): R { classStack += klass return try { klass.f() @@ -99,21 +119,30 @@ class Fir2IrConversionScope { } } - private val whenSubjectVariableStack = mutableListOf() - private val safeCallSubjectVariableStack = mutableListOf() + @PublishedApi + @PrivateForInline + internal val whenSubjectVariableStack = mutableListOf() - fun withWhenSubject(subject: IrVariable?, f: () -> T): T { + @PublishedApi + @PrivateForInline + internal val safeCallSubjectVariableStack = mutableListOf() + + inline fun withWhenSubject(subject: IrVariable?, f: () -> T): T { if (subject != null) whenSubjectVariableStack += subject - val result = f() - if (subject != null) whenSubjectVariableStack.removeAt(whenSubjectVariableStack.size - 1) - return result + try { + return f() + } finally { + if (subject != null) whenSubjectVariableStack.removeAt(whenSubjectVariableStack.size - 1) + } } - fun withSafeCallSubject(subject: IrVariable?, f: () -> T): T { + inline fun withSafeCallSubject(subject: IrVariable?, f: () -> T): T { if (subject != null) safeCallSubjectVariableStack += subject - val result = f() - if (subject != null) safeCallSubjectVariableStack.removeAt(safeCallSubjectVariableStack.size - 1) - return result + try { + return f() + } finally { + if (subject != null) safeCallSubjectVariableStack.removeAt(safeCallSubjectVariableStack.size - 1) + } } fun returnTarget(expression: FirReturnExpression, declarationStorage: Fir2IrDeclarationStorage): IrFunction { diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index d80a172098a..d1c2427109f 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -35,11 +35,11 @@ class FakeOverrideGenerator( private val basePropertySymbols: MutableMap> = mutableMapOf() private val baseStaticFieldSymbols: MutableMap> = mutableMapOf() - private fun IrSimpleFunction.withFunction(f: IrSimpleFunction.() -> Unit) { + private inline fun IrSimpleFunction.withFunction(f: IrSimpleFunction.() -> Unit) { conversionScope.withFunction(this, f) } - private fun IrProperty.withProperty(f: IrProperty.() -> Unit) { + private inline fun IrProperty.withProperty(f: IrProperty.() -> Unit) { conversionScope.withProperty(this, firProperty = null, f) }