Add new IR node IrInlinedFunctionBlock

This node will represent inlined in IR function.
This commit is contained in:
Ivan Kylchik
2022-12-15 14:12:52 +01:00
committed by Space Team
parent 59522a6130
commit ebf6e69ef3
7 changed files with 80 additions and 9 deletions
@@ -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
}
@@ -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<IrStatement>,
) : this(startOffset, endOffset, type, inlineCall, inlinedElement, origin) {
this.statements.addAll(statements)
}
}
@@ -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,
@@ -293,6 +293,14 @@ class DumpIrTreeVisitor(
private fun IrMemberAccessExpression<*>.renderTypeArgument(index: Int): String =
getTypeArgument(index)?.render() ?: "<none>"
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")
@@ -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}"
@@ -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)
}
@@ -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"