Add some new utils to work with IrInlinedFunctionBlock
This commit is contained in:
+51
-4
@@ -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<IrStatement> {
|
||||
return this.statements
|
||||
.filterIsInstance<IrComposite>()
|
||||
.filter { it.origin == INLINED_FUNCTION_ARGUMENTS || it.origin == INLINED_FUNCTION_DEFAULT_ARGUMENTS }
|
||||
.flatMap { it.statements }
|
||||
}
|
||||
|
||||
fun IrInlinedFunctionBlock.getNonDefaultAdditionalStatementsFromInlinedBlock(): List<IrStatement> {
|
||||
return this.statements
|
||||
.filterIsInstance<IrComposite>()
|
||||
.singleOrNull { it.origin == INLINED_FUNCTION_ARGUMENTS }?.statements ?: emptyList()
|
||||
}
|
||||
|
||||
fun IrInlinedFunctionBlock.getDefaultAdditionalStatementsFromInlinedBlock(): List<IrStatement> {
|
||||
return this.statements
|
||||
.filterIsInstance<IrComposite>()
|
||||
.singleOrNull { it.origin == INLINED_FUNCTION_DEFAULT_ARGUMENTS }?.statements ?: emptyList()
|
||||
}
|
||||
|
||||
fun IrInlinedFunctionBlock.getOriginalStatementsFromInlinedBlock(): List<IrStatement> {
|
||||
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<IrComposite>()
|
||||
.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<IrStatement>) {
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user