From 41b56e5f16443dc162880b1759d3e61b231eb8e9 Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Thu, 15 Dec 2022 17:58:05 +0100 Subject: [PATCH] Add some new utils to work with `IrInlinedFunctionBlock` --- .../kotlin/backend/common/ir/IrInlineUtils.kt | 55 +++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt index 7ca57ec62c2..69e1e1226c8 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrInlineUtils.kt @@ -6,16 +6,17 @@ package org.jetbrains.kotlin.backend.common.ir import org.jetbrains.kotlin.backend.common.lower.VariableRemapper +import org.jetbrains.kotlin.backend.common.lower.inline.INLINED_FUNCTION_ARGUMENTS +import org.jetbrains.kotlin.backend.common.lower.inline.INLINED_FUNCTION_DEFAULT_ARGUMENTS import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET +import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.IrStatementsBuilder +import org.jetbrains.kotlin.ir.builders.irComposite import org.jetbrains.kotlin.ir.builders.irTemporary import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrReturnImpl -import org.jetbrains.kotlin.ir.expressions.impl.IrReturnableBlockImpl +import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrFileSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnTargetSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl @@ -151,6 +152,52 @@ fun IrInlinedFunctionBlock.isLambdaInlining(): Boolean { return !isFunctionInlining() } +fun IrInlinedFunctionBlock.getAdditionalStatementsFromInlinedBlock(): List { + return this.statements + .filterIsInstance() + .filter { it.origin == INLINED_FUNCTION_ARGUMENTS || it.origin == INLINED_FUNCTION_DEFAULT_ARGUMENTS } + .flatMap { it.statements } +} + +fun IrInlinedFunctionBlock.getNonDefaultAdditionalStatementsFromInlinedBlock(): List { + return this.statements + .filterIsInstance() + .singleOrNull { it.origin == INLINED_FUNCTION_ARGUMENTS }?.statements ?: emptyList() +} + +fun IrInlinedFunctionBlock.getDefaultAdditionalStatementsFromInlinedBlock(): List { + return this.statements + .filterIsInstance() + .singleOrNull { it.origin == INLINED_FUNCTION_DEFAULT_ARGUMENTS }?.statements ?: emptyList() +} + +fun IrInlinedFunctionBlock.getOriginalStatementsFromInlinedBlock(): List { + return this.statements + .filter { it !is IrComposite || !(it.origin == INLINED_FUNCTION_ARGUMENTS || it.origin == INLINED_FUNCTION_DEFAULT_ARGUMENTS) } +} + +fun IrInlinedFunctionBlock.putStatementBeforeActualInline(builder: IrBuilderWithScope, statement: IrStatement) { + val evaluateStatements = this.statements + .filterIsInstance() + .singleOrNull { it.origin == INLINED_FUNCTION_ARGUMENTS }?.statements + + if (evaluateStatements != null) { + evaluateStatements.add(0, statement) + return + } + + val newInlinedArgumentsBlock = builder + .irComposite(UNDEFINED_OFFSET, UNDEFINED_OFFSET, INLINED_FUNCTION_ARGUMENTS, builder.context.irBuiltIns.unitType) { +statement } + this.statements.add(0, newInlinedArgumentsBlock) +} + +fun IrInlinedFunctionBlock.putStatementsInFrontOfInlinedFunction(statements: List) { + val insertAfter = this.statements + .indexOfLast { it is IrComposite && (it.origin == INLINED_FUNCTION_ARGUMENTS || it.origin == INLINED_FUNCTION_DEFAULT_ARGUMENTS) } + + this.statements.addAll(if (insertAfter == -1) 0 else insertAfter + 1, statements) +} + val IrContainerExpression.innerInlinedBlockOrThis: IrContainerExpression get() = (this as? IrReturnableBlock)?.statements?.singleOrNull() as? IrInlinedFunctionBlock ?: this