From ebf6e69ef3a010add5840e7a53118d5e2f270cbe Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Thu, 15 Dec 2022 14:12:52 +0100 Subject: [PATCH] Add new IR node `IrInlinedFunctionBlock` This node will represent inlined in IR function. --- .../ir/expressions/IrInlinedFunctionBlock.kt | 21 +++++++++++++++ .../kotlin/ir/expressions/impl/IrBlockImpl.kt | 26 ++++++++++++++++--- .../ir/util/DeepCopyIrTreeWithSymbols.kt | 12 ++++++--- .../jetbrains/kotlin/ir/util/DumpIrTree.kt | 8 ++++++ .../kotlin/ir/util/RenderIrElement.kt | 10 +++++-- .../kotlin/ir/util/dumpKotlinLike.kt | 6 ++++- .../jetbrains/kotlin/ir/generator/IrTree.kt | 6 +++++ 7 files changed, 80 insertions(+), 9 deletions(-) create mode 100644 compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrInlinedFunctionBlock.kt diff --git a/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrInlinedFunctionBlock.kt b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrInlinedFunctionBlock.kt new file mode 100644 index 00000000000..92d7d605b50 --- /dev/null +++ b/compiler/ir/ir.tree/gen/org/jetbrains/kotlin/ir/expressions/IrInlinedFunctionBlock.kt @@ -0,0 +1,21 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +// This file was generated automatically. See compiler/ir/ir.tree/tree-generator/ReadMe.md. +// DO NOT MODIFY IT MANUALLY. + +package org.jetbrains.kotlin.ir.expressions + +import org.jetbrains.kotlin.ir.IrElement + +/** + * A leaf IR tree element. + * @sample org.jetbrains.kotlin.ir.generator.IrTree.inlinedFunctionBlock + */ +abstract class IrInlinedFunctionBlock : IrBlock() { + abstract var inlineCall: IrFunctionAccessExpression + + abstract var inlinedElement: IrElement +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt index 605e4cff5f0..46e064bf6c9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrBlockImpl.kt @@ -17,11 +17,10 @@ package org.jetbrains.kotlin.ir.expressions.impl import org.jetbrains.kotlin.descriptors.FunctionDescriptor +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI -import org.jetbrains.kotlin.ir.expressions.IrBlock -import org.jetbrains.kotlin.ir.expressions.IrReturnableBlock -import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol import org.jetbrains.kotlin.ir.types.IrType @@ -83,3 +82,24 @@ class IrReturnableBlockImpl( symbol.bind(this) } } + +class IrInlinedFunctionBlockImpl( + override val startOffset: Int, + override val endOffset: Int, + override var type: IrType, + override var inlineCall: IrFunctionAccessExpression, + override var inlinedElement: IrElement, + override var origin: IrStatementOrigin? = null, +) : IrInlinedFunctionBlock() { + constructor( + startOffset: Int, + endOffset: Int, + type: IrType, + inlineCall: IrFunctionAccessExpression, + inlinedElement: IrElement, + origin: IrStatementOrigin?, + statements: List, + ) : this(startOffset, endOffset, type, inlineCall, inlinedElement, origin) { + this.statements.addAll(statements) + } +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index f49f0ffd702..3f9e7bb9cf1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -5,9 +5,7 @@ package org.jetbrains.kotlin.ir.util -import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.IrStatement -import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI +import org.jetbrains.kotlin.ir.* import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.* import org.jetbrains.kotlin.ir.expressions.* @@ -462,6 +460,14 @@ open class DeepCopyIrTreeWithSymbols( expression.statements.map { it.transform() }, expression.inlineFunctionSymbol ).copyAttributes(expression) + else if (expression is IrInlinedFunctionBlock) + IrInlinedFunctionBlockImpl( + expression.startOffset, expression.endOffset, + expression.type.remapType(), + expression.inlineCall, expression.inlinedElement, + mapStatementOrigin(expression.origin), + statements = expression.statements.map { it.transform() }, + ).copyAttributes(expression) else IrBlockImpl( expression.startOffset, expression.endOffset, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt index 5d078df11b8..60f035137bc 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DumpIrTree.kt @@ -293,6 +293,14 @@ class DumpIrTreeVisitor( private fun IrMemberAccessExpression<*>.renderTypeArgument(index: Int): String = getTypeArgument(index)?.render() ?: "" + override fun visitBlock(expression: IrBlock, data: String) { + if (expression !is IrInlinedFunctionBlock) return super.visitBlock(expression, data) + expression.dumpLabeledElementWith(data) { + expression.inlinedElement.dumpInternal("inlinedElement") + super.visitBlock(expression, data) + } + } + override fun visitGetField(expression: IrGetField, data: String) { expression.dumpLabeledElementWith(data) { expression.receiver?.accept(this, "receiver") diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt index 821b6d2d02f..fdbf043edb9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt @@ -357,8 +357,14 @@ class RenderIrElementVisitor(normalizeNames: Boolean = false, private val verbos override fun visitSpreadElement(spread: IrSpreadElement, data: Nothing?): String = "SPREAD_ELEMENT" - override fun visitBlock(expression: IrBlock, data: Nothing?): String = - "${if (expression is IrReturnableBlock) "RETURNABLE_" else ""}BLOCK type=${expression.type.render()} origin=${expression.origin}" + override fun visitBlock(expression: IrBlock, data: Nothing?): String { + val prefix = when (expression) { + is IrReturnableBlock -> "RETURNABLE_" + is IrInlinedFunctionBlock -> "INLINED_" + else -> "" + } + return "${prefix}BLOCK type=${expression.type.render()} origin=${expression.origin}" + } override fun visitComposite(expression: IrComposite, data: Nothing?): String = "COMPOSITE type=${expression.type.render()} origin=${expression.origin}" diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/dumpKotlinLike.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/dumpKotlinLike.kt index 69781eedfa5..6f8c11ab6e2 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/dumpKotlinLike.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/dumpKotlinLike.kt @@ -920,7 +920,11 @@ private class KotlinLikeDumper(val p: Printer, val options: KotlinLikeDumpOption // TODO special blocks using `origin` // TODO inlineFunctionSymbol for IrReturnableBlock // TODO no tests for IrReturnableBlock? - val kind = if (expression is IrReturnableBlock) "RETURNABLE BLOCK" else "BLOCK" + val kind = when (expression) { + is IrReturnableBlock -> "RETURNABLE BLOCK" + is IrInlinedFunctionBlock -> "INLINED FUNCTION BLOCK" + else -> "BLOCK" + } // it's not valid kotlin expression.printStatementContainer("{ // $kind", "}", data) } diff --git a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt index 3b2c87115cb..24d3dc0ee6a 100644 --- a/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt +++ b/compiler/ir/ir.tree/tree-generator/src/org/jetbrains/kotlin/ir/generator/IrTree.kt @@ -643,6 +643,12 @@ object IrTree : AbstractTreeBuilder() { +symbol(returnableBlockSymbolType) +field("inlineFunctionSymbol", functionSymbolType, nullable = true) } + val inlinedFunctionBlock: ElementConfig by element(Expression) { + parent(block) + + +field("inlineCall", functionAccessExpression) + +field("inlinedElement", rootElement) + } val syntheticBody: ElementConfig by element(Expression) { visitorParent = body visitorParam = "body"