IrFunctionExpression: add 'origin'

This is actually either a LAMBDA or an ANONYMOUS_FUNCTION.
Not quite sure if it's really required, but some tools such as IR-based
decompiler might require this information.
This commit is contained in:
Dmitry Petrov
2019-07-15 13:09:48 +03:00
parent 41b59f9b9a
commit ffd9b45ef3
61 changed files with 121 additions and 96 deletions
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.psi2ir.generators
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrFunctionExpressionImpl
import org.jetbrains.kotlin.psi.KtLambdaExpression
import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -30,7 +31,12 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
val lambdaExpressionType = getInferredTypeWithImplicitCastsOrFail(ktLambda).toIrType()
val irLambdaFunction = FunctionGenerator(context).generateLambdaFunctionDeclaration(ktFun)
return IrFunctionExpressionImpl(ktLambda.startOffset, ktLambda.endOffset, lambdaExpressionType, irLambdaFunction)
return IrFunctionExpressionImpl(
ktLambda.startOffset, ktLambda.endOffset,
lambdaExpressionType,
irLambdaFunction,
IrStatementOrigin.LAMBDA
)
}
fun generateFunction(ktFun: KtNamedFunction): IrStatement {
@@ -38,7 +44,12 @@ class LocalFunctionGenerator(statementGenerator: StatementGenerator) : Statement
if (ktFun.name != null) return irFun
val funExpressionType = getInferredTypeWithImplicitCastsOrFail(ktFun).toIrType()
return IrFunctionExpressionImpl(ktFun.startOffset, ktFun.endOffset, funExpressionType, irFun)
return IrFunctionExpressionImpl(
ktFun.startOffset, ktFun.endOffset,
funExpressionType,
irFun,
IrStatementOrigin.ANONYMOUS_FUNCTION
)
}
private fun generateFunctionDeclaration(ktFun: KtNamedFunction) =
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
interface IrFunctionExpression : IrExpression {
val origin: IrStatementOrigin
var function: IrSimpleFunction
}
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrFunctionExpression
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -15,7 +16,8 @@ class IrFunctionExpressionImpl(
startOffset: Int,
endOffset: Int,
type: IrType,
override var function: IrSimpleFunction
override var function: IrSimpleFunction,
override val origin: IrStatementOrigin
) :
IrExpressionBase(startOffset, endOffset, type),
IrFunctionExpression {
@@ -593,7 +593,8 @@ open class DeepCopyIrTreeWithSymbols(
IrFunctionExpressionImpl(
expression.startOffset, expression.endOffset,
expression.type.remapType(),
expression.function.transform()
expression.function.transform(),
mapStatementOrigin(expression.origin)!!
)
override fun visitClassReference(expression: IrClassReference): IrClassReference =
@@ -603,7 +603,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitFunctionExpression(expression: IrFunctionExpression, data: Nothing?): String =
buildTrimEnd {
append("FUN_EXPR type=${expression.type.render()}")
append("FUN_EXPR type=${expression.type.render()} origin=${expression.origin}")
}
override fun visitClassReference(expression: IrClassReference, data: Nothing?): String =