From d6c5fbace02ec168eb25b368a5a5b409861e71c7 Mon Sep 17 00:00:00 2001 From: Vasily Levchenko Date: Thu, 29 Aug 2019 13:24:46 +0300 Subject: [PATCH] [IR][inliner] prevent of parameters location information loss --- .../common/lower/inline/FunctionInlining.kt | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt index 3fc1b9309f6..48f7927fc7a 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/inline/FunctionInlining.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrReturnableBlockSymbolImpl import org.jetbrains.kotlin.ir.types.IrType @@ -429,12 +430,15 @@ class FunctionInlining(val context: CommonBackendContext) : IrElementTransformer return@forEach } + val variableInitializer = it.argumentExpression.transform(substitutor, data = null) // Arguments may reference the previous ones - substitute them. val newVariable = currentScope.scope.createTemporaryVariableWithWrappedDescriptor( - irExpression = it.argumentExpression.transform( // Arguments may reference the previous ones - substitute them. - substitutor, - data = null - ), + irExpression = IrBlockImpl (variableInitializer.startOffset, + variableInitializer.endOffset, + variableInitializer.type, + InlinerExpressionLocationHint((currentScope.irElement as IrSymbolOwner).symbol)).apply { + statements.add(variableInitializer) + }, nameHint = callee.symbol.owner.name.toString(), isMutable = false ) @@ -465,3 +469,13 @@ class FunctionInlining(val context: CommonBackendContext) : IrElementTransformer IrGetValueImpl(startOffset, endOffset, type, symbol, origin) } } + +class InlinerExpressionLocationHint(val inlineAtSymbol: IrSymbol) : IrStatementOrigin { + override fun toString(): String = "(${this.javaClass.simpleName} : $functionNameOrDefaultToString @${functionFileOrNull?.fileEntry?.name})" + + private val functionFileOrNull: IrFile? + get() = (inlineAtSymbol as? IrFunction)?.file + + private val functionNameOrDefaultToString: String + get() = (inlineAtSymbol as? IrFunction)?.name?.asString() ?: toString() +} \ No newline at end of file