Kotlin: Remove code duplication

This commit is contained in:
Tamas Vajk
2022-11-02 11:27:29 +01:00
parent 759ffc4743
commit 145e2093f3

View File

@@ -1505,9 +1505,7 @@ open class KotlinFileExtractor(
tw.writeHasLocation(varId, locId)
tw.writeExprs_localvariabledeclexpr(exprId, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(exprId, type.kotlinResult.id)
tw.writeHasLocation(exprId, locId)
tw.writeCallableEnclosingExpr(exprId, callable)
tw.writeStatementEnclosingExpr(exprId, enclosingStmt)
extractExprContext(exprId, locId, callable, enclosingStmt)
val i = v.initializer
if (i != null && extractInitializer) {
extractExpressionExpr(i, callable, exprId, 0, enclosingStmt)
@@ -1630,9 +1628,7 @@ open class KotlinFileExtractor(
private fun unaryOp(id: Label<out DbExpr>, c: IrCall, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) {
val locId = tw.getLocation(c)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
val dr = c.dispatchReceiver
if (dr != null) {
@@ -1653,9 +1649,7 @@ open class KotlinFileExtractor(
private fun binOp(id: Label<out DbExpr>, c: IrCall, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) {
val locId = tw.getLocation(c)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
val dr = c.dispatchReceiver
if (dr != null) {
@@ -1767,9 +1761,7 @@ open class KotlinFileExtractor(
tw.writeExprs_methodaccess(id, type.javaResult.id, callsiteParent, childIdx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, enclosingCallable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, enclosingCallable, enclosingStmt)
// The caller should have warned about this before, so we don't repeat the warning here.
if (methodLabel != null)
@@ -2370,19 +2362,14 @@ open class KotlinFileExtractor(
tw.writeExprs_errorexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, tw.getLocation(c))
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, tw.getLocation(c), callable, enclosingStmt)
} else {
logger.errorElement("Unexpected enum type rep ${enumType.javaClass}", c)
}
}
fun binopReceiver(id: Label<out DbExpr>, receiver: IrExpression?, receiverDescription: String) {
val locId = tw.getLocation(c)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, tw.getLocation(c), callable, enclosingStmt)
if(receiver == null) {
logger.errorElement("$receiverDescription not found", c)
@@ -2405,10 +2392,7 @@ open class KotlinFileExtractor(
}
fun unaryopReceiver(id: Label<out DbExpr>, receiver: IrExpression?, receiverDescription: String) {
val locId = tw.getLocation(c)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, tw.getLocation(c), callable, enclosingStmt)
if(receiver == null) {
logger.errorElement("$receiverDescription not found", c)
@@ -2702,8 +2686,7 @@ open class KotlinFileExtractor(
tw.writeExprs_arraycreationexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
val locId = tw.getLocation(c)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
extractExprContext(id, locId, callable, enclosingStmt)
if (c.typeArgumentsCount == 1) {
val typeArgument = c.getTypeArgument(0)
@@ -2841,9 +2824,7 @@ open class KotlinFileExtractor(
val arrayType = useType(array.type)
tw.writeExprs_arrayaccess(arrayAccessId, arrayType.javaResult.id, assignId, 0)
tw.writeExprsKotlinType(arrayAccessId, arrayType.kotlinResult.id)
tw.writeHasLocation(arrayAccessId, locId)
tw.writeCallableEnclosingExpr(arrayAccessId, callable)
tw.writeStatementEnclosingExpr(arrayAccessId, enclosingStmt)
extractExprContext(arrayAccessId, locId, callable, enclosingStmt)
extractExpressionExpr(array, callable, arrayAccessId, 0, enclosingStmt)
extractExpressionExpr(arrayIdx, callable, arrayAccessId, 1, enclosingStmt)
@@ -2882,9 +2863,7 @@ open class KotlinFileExtractor(
val type = useType(c.type)
tw.writeExprs_unsafecoerceexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractTypeAccessRecursive(typeArg, locId, id, 0, callable, enclosingStmt)
extractExpressionExpr(valueArg, callable, id, 1, enclosingStmt)
}
@@ -2974,8 +2953,7 @@ open class KotlinFileExtractor(
tw.writeExprs_arraycreationexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
val locId = tw.getLocation(locElement)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, enclosingCallable)
extractExprContext(id, locId, enclosingCallable, enclosingStmt)
if (elementType != null) {
val typeContext = if (allowPrimitiveElementType) TypeContext.OTHER else TypeContext.GENERIC_ARGUMENT
@@ -2986,9 +2964,7 @@ open class KotlinFileExtractor(
val initId = tw.getFreshIdLabel<DbArrayinit>()
tw.writeExprs_arrayinit(initId, type.javaResult.id, id, -2)
tw.writeExprsKotlinType(initId, type.kotlinResult.id)
tw.writeHasLocation(initId, locId)
tw.writeCallableEnclosingExpr(initId, enclosingCallable)
tw.writeStatementEnclosingExpr(initId, enclosingStmt)
extractExprContext(initId, locId, enclosingCallable, enclosingStmt)
elementList.elements.forEachIndexed { i, arg -> extractVarargElement(arg, enclosingCallable, initId, i, enclosingStmt) }
extractConstantInteger(elementList.elements.size, locId, id, 0, enclosingCallable, enclosingStmt)
@@ -2999,7 +2975,7 @@ open class KotlinFileExtractor(
private fun extractNewExpr(
methodId: Label<out DbConstructor>,
constructedType: TypeResults,
locId: Label<out DbLocation>,
locId: Label<DbLocation>,
parent: Label<out DbExprparent>,
idx: Int,
callable: Label<out DbCallable>,
@@ -3008,9 +2984,7 @@ open class KotlinFileExtractor(
val id = tw.getFreshIdLabel<DbNewexpr>()
tw.writeExprs_newexpr(id, constructedType.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, constructedType.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
tw.writeCallableBinding(id, methodId)
return id
}
@@ -3019,7 +2993,7 @@ open class KotlinFileExtractor(
calledConstructor: IrFunction,
constructorTypeArgs: List<IrTypeArgument>?,
constructedType: TypeResults,
locId: Label<out DbLocation>,
locId: Label<DbLocation>,
parent: Label<out DbExprparent>,
idx: Int,
callable: Label<out DbCallable>,
@@ -3136,9 +3110,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_stmtexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
return StmtParent(id, 0)
}
override fun expr(e: IrExpression, callable: Label<out DbCallable>): ExprParent {
@@ -3321,9 +3293,7 @@ open class KotlinFileExtractor(
val type = useType(arrayVarInitializer.type)
val locId = tw.getLocation(e)
tw.writeExprsKotlinType(assignId, type.kotlinResult.id)
tw.writeHasLocation(assignId, locId)
tw.writeCallableEnclosingExpr(assignId, callable)
tw.writeStatementEnclosingExpr(assignId, exprParent.enclosingStmt)
extractExprContext(assignId, locId, callable, exprParent.enclosingStmt)
writeUpdateInPlaceExprFun(tw, assignId, type.javaResult.id, exprParent.parent, exprParent.idx)
@@ -3332,9 +3302,7 @@ open class KotlinFileExtractor(
val elementType = useType(updateRhs.type)
tw.writeExprs_arrayaccess(lhsId, elementType.javaResult.id, assignId, 0)
tw.writeExprsKotlinType(lhsId, elementType.kotlinResult.id)
tw.writeHasLocation(lhsId, locId)
tw.writeCallableEnclosingExpr(lhsId, callable)
tw.writeStatementEnclosingExpr(lhsId, exprParent.enclosingStmt)
extractExprContext(lhsId, locId, callable, exprParent.enclosingStmt)
extractExpressionExpr(arrayVarInitializer, callable, lhsId, 0, exprParent.enclosingStmt)
extractExpressionExpr(indexVarInitializer, callable, lhsId, 1, exprParent.enclosingStmt)
@@ -3389,7 +3357,7 @@ open class KotlinFileExtractor(
extractExprContext(it, locId, callable, enclosingStmt)
}
private fun extractConstantInteger(v: Int, locId: Label<DbLocation>, parent: Label<out DbExprparent>, idx: Int, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) =
private fun extractConstantInteger(v: Number, locId: Label<DbLocation>, parent: Label<out DbExprparent>, idx: Int, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) =
tw.getFreshIdLabel<DbIntegerliteral>().also {
val type = useType(pluginContext.irBuiltIns.intType)
tw.writeExprs_integerliteral(it, type.javaResult.id, parent, idx)
@@ -3523,9 +3491,7 @@ open class KotlinFileExtractor(
val methodId = tw.getLabelFor<DbMethod>(methodLabel)
tw.writeExprs_methodaccess(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeCallableBinding(id, methodId)
}
else {
@@ -3551,9 +3517,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_stringtemplateexpr(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
e.arguments.forEachIndexed { i, a ->
extractExpressionExpr(a, callable, id, i, exprParent.enclosingStmt)
}
@@ -3562,24 +3526,14 @@ open class KotlinFileExtractor(
val exprParent = parent.expr(e, callable)
when(val v = e.value) {
is Int, is Short, is Byte -> {
val id = tw.getFreshIdLabel<DbIntegerliteral>()
val type = useType(e.type)
val locId = tw.getLocation(e)
tw.writeExprs_integerliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
tw.writeNamestrings(v.toString(), v.toString(), id)
extractConstantInteger(v as Number, tw.getLocation(e), exprParent.parent, exprParent.idx, callable, exprParent.enclosingStmt)
} is Long -> {
val id = tw.getFreshIdLabel<DbLongliteral>()
val type = useType(e.type)
val locId = tw.getLocation(e)
tw.writeExprs_longliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeNamestrings(v.toString(), v.toString(), id)
} is Float -> {
val id = tw.getFreshIdLabel<DbFloatingpointliteral>()
@@ -3587,9 +3541,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_floatingpointliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeNamestrings(v.toString(), v.toString(), id)
} is Double -> {
val id = tw.getFreshIdLabel<DbDoubleliteral>()
@@ -3597,9 +3549,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_doubleliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeNamestrings(v.toString(), v.toString(), id)
} is Boolean -> {
val id = tw.getFreshIdLabel<DbBooleanliteral>()
@@ -3607,9 +3557,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_booleanliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeNamestrings(v.toString(), v.toString(), id)
} is Char -> {
val id = tw.getFreshIdLabel<DbCharacterliteral>()
@@ -3617,9 +3565,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_characterliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeNamestrings(v.toString(), v.toString(), id)
} is String -> {
val id = tw.getFreshIdLabel<DbStringliteral>()
@@ -3627,9 +3573,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_stringliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeNamestrings(v.toString(), v.toString(), id)
}
null -> {
@@ -3638,9 +3582,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_nullliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
}
else -> {
logger.errorElement("Unrecognised IrConst: " + v.javaClass, e)
@@ -3679,9 +3621,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_varaccess(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
val owner = getBoundSymbolOwner(e.symbol, e) ?: return
@@ -3704,15 +3644,11 @@ open class KotlinFileExtractor(
// set op plus its RHS, while the varAccess takes its location from `e`.
val locId = tw.getLocation(e.startOffset, rhsValue.endOffset)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
val lhsId = tw.getFreshIdLabel<DbVaraccess>()
val lhsLocId = tw.getLocation(e)
tw.writeHasLocation(lhsId, lhsLocId)
tw.writeCallableEnclosingExpr(lhsId, callable)
tw.writeStatementEnclosingExpr(lhsId, exprParent.enclosingStmt)
extractExprContext(lhsId, lhsLocId, callable, exprParent.enclosingStmt)
when (e) {
is IrSetValue -> {
@@ -3793,9 +3729,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
extractExpressionExpr(e.branches[0].condition, callable, id, 0, exprParent.enclosingStmt)
@@ -3811,9 +3745,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_whenexpr(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
if(e.origin == IrStatementOrigin.IF) {
tw.writeWhen_if(id)
}
@@ -3836,9 +3768,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_getclassexpr(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 0, exprParent.enclosingStmt)
}
is IrTypeOperatorCall -> {
@@ -3868,9 +3798,7 @@ open class KotlinFileExtractor(
val locId = tw.getLocation(e)
tw.writeExprs_varaccess(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
tw.writeVariableBinding(id, instance.id)
}
@@ -3923,9 +3851,7 @@ open class KotlinFileExtractor(
val idLambdaExpr = tw.getFreshIdLabel<DbLambdaexpr>()
tw.writeExprs_lambdaexpr(idLambdaExpr, ids.type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(idLambdaExpr, ids.type.kotlinResult.id)
tw.writeHasLocation(idLambdaExpr, locId)
tw.writeCallableEnclosingExpr(idLambdaExpr, callable)
tw.writeStatementEnclosingExpr(idLambdaExpr, exprParent.enclosingStmt)
extractExprContext(idLambdaExpr, locId, callable, exprParent.enclosingStmt)
tw.writeCallableBinding(idLambdaExpr, ids.constructor)
// todo: fix hard coded block body of lambda
@@ -3951,9 +3877,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_typeliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
extractExprContext(id, locId, callable, exprParent.enclosingStmt)
extractTypeAccessRecursive(e.classType, locId, id, 0, callable, exprParent.enclosingStmt)
}
@@ -4006,27 +3930,23 @@ open class KotlinFileExtractor(
return null
}
private fun extractSuperAccess(irType: IrType, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int, enclosingStmt: Label<out DbStmt>, locId: Label<out DbLocation>) =
private fun extractSuperAccess(irType: IrType, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int, enclosingStmt: Label<out DbStmt>, locId: Label<DbLocation>) =
tw.getFreshIdLabel<DbSuperaccess>().also {
val type = useType(irType)
tw.writeExprs_superaccess(it, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(it, type.kotlinResult.id)
tw.writeHasLocation(it, locId)
tw.writeCallableEnclosingExpr(it, callable)
tw.writeStatementEnclosingExpr(it, enclosingStmt)
extractExprContext(it, locId, callable, enclosingStmt)
extractTypeAccessRecursive(irType, locId, it, 0)
}
private fun extractThisAccess(type: TypeResults, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int, enclosingStmt: Label<out DbStmt>, locId: Label<out DbLocation>) =
private fun extractThisAccess(type: TypeResults, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int, enclosingStmt: Label<out DbStmt>, locId: Label<DbLocation>) =
tw.getFreshIdLabel<DbThisaccess>().also {
tw.writeExprs_thisaccess(it, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(it, type.kotlinResult.id)
tw.writeHasLocation(it, locId)
tw.writeCallableEnclosingExpr(it, callable)
tw.writeStatementEnclosingExpr(it, enclosingStmt)
extractExprContext(it, locId, callable, enclosingStmt)
}
private fun extractThisAccess(irType: IrType, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int, enclosingStmt: Label<out DbStmt>, locId: Label<out DbLocation>) =
private fun extractThisAccess(irType: IrType, callable: Label<out DbCallable>, parent: Label<out DbExprparent>, idx: Int, enclosingStmt: Label<out DbStmt>, locId: Label<DbLocation>) =
extractThisAccess(useType(irType), callable, parent, idx, enclosingStmt, locId)
private fun extractThisAccess(e: IrGetValue, thisParamParent: IrDeclarationParent, exprParent: ExprParent, callable: Label<out DbCallable>) {
@@ -4087,20 +4007,18 @@ open class KotlinFileExtractor(
}
}
private fun extractVariableAccess(variable: Label<out DbVariable>?, type: TypeResults, locId: Label<out DbLocation>, parent: Label<out DbExprparent>, idx: Int, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) =
private fun extractVariableAccess(variable: Label<out DbVariable>?, type: TypeResults, locId: Label<DbLocation>, parent: Label<out DbExprparent>, idx: Int, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) =
tw.getFreshIdLabel<DbVaraccess>().also {
tw.writeExprs_varaccess(it, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(it, type.kotlinResult.id)
tw.writeHasLocation(it, locId)
tw.writeCallableEnclosingExpr(it, callable)
tw.writeStatementEnclosingExpr(it, enclosingStmt)
extractExprContext(it, locId, callable, enclosingStmt)
if (variable != null) {
tw.writeVariableBinding(it, variable)
}
}
private fun extractVariableAccess(variable: Label<out DbVariable>?, irType: IrType, locId: Label<out DbLocation>, parent: Label<out DbExprparent>, idx: Int, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) =
private fun extractVariableAccess(variable: Label<out DbVariable>?, irType: IrType, locId: Label<DbLocation>, parent: Label<out DbExprparent>, idx: Int, callable: Label<out DbCallable>, enclosingStmt: Label<out DbStmt>) =
extractVariableAccess(variable, useType(irType), locId, parent, idx, callable, enclosingStmt)
private fun extractLoop(
@@ -4168,12 +4086,6 @@ open class KotlinFileExtractor(
private open inner class GeneratedClassHelper(protected val locId: Label<DbLocation>, protected val ids: GeneratedClassLabels) {
protected val classId = ids.type.javaResult.id.cast<DbClass>()
fun writeExpressionMetadataToTrapFile(id: Label<out DbExpr>, callable: Label<out DbCallable>, stmt: Label<out DbStmt>) {
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, stmt)
}
/**
* Extract a parameter to field assignment, such as `this.field = paramName` below:
* ```
@@ -4246,7 +4158,7 @@ open class KotlinFileExtractor(
tw.writeExprs_varaccess(pId, pType.javaResult.id, parent, idx)
tw.writeExprsKotlinType(pId, pType.kotlinResult.id)
tw.writeVariableBinding(pId, variable)
writeExpressionMetadataToTrapFile(pId, callable, stmt)
extractExprContext(pId, locId, callable, stmt)
return pId
}
@@ -4298,7 +4210,7 @@ open class KotlinFileExtractor(
tw.writeExprs_varaccess(accessId, fieldType.javaResult.id, parent, 0)
tw.writeExprsKotlinType(accessId, fieldType.kotlinResult.id)
writeExpressionMetadataToTrapFile(accessId, labels.methodId, stmt)
extractExprContext(accessId, locId, labels.methodId, stmt)
val fieldId = useField(target.owner)
tw.writeVariableBinding(accessId, fieldId)
@@ -4357,7 +4269,7 @@ open class KotlinFileExtractor(
callId
}
writeExpressionMetadataToTrapFile(callId, labels.methodId, retId)
extractExprContext(callId, locId, labels.methodId, retId)
val callableId = useFunction<DbCallable>(target.owner.realOverrideTarget, classTypeArgsIncludingOuterClasses)
tw.writeCallableBinding(callId.cast<DbCaller>(), callableId)
@@ -4394,7 +4306,6 @@ open class KotlinFileExtractor(
// In case we're extracting a big arity function reference:
addArgumentsToInvocationInInvokeNBody(
bigArityParameterTypes, labels, retId, callId, locId,
{ exp -> writeExpressionMetadataToTrapFile(exp, labels.methodId, retId) },
extensionIdxOffset, useFirstArgAsDispatch, dispatchReceiverIdx)
} else {
val dispatchIdxOffset = if (useFirstArgAsDispatch) 1 else 0
@@ -4448,7 +4359,7 @@ open class KotlinFileExtractor(
val callId = tw.getFreshIdLabel<DbMethodaccess>()
tw.writeExprs_methodaccess(callId, callType.javaResult.id, retId, 0)
tw.writeExprsKotlinType(callId, callType.kotlinResult.id)
this.writeExpressionMetadataToTrapFile(callId, invokeLabels.methodId, retId)
extractExprContext(callId, locId, invokeLabels.methodId, retId)
tw.writeCallableBinding(callId, getId)
@@ -4606,9 +4517,7 @@ open class KotlinFileExtractor(
val exprParent = parent.expr(propertyReferenceExpr, callable)
tw.writeExprs_propertyref(idPropertyRef, ids.type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(idPropertyRef, ids.type.kotlinResult.id)
tw.writeHasLocation(idPropertyRef, locId)
tw.writeCallableEnclosingExpr(idPropertyRef, callable)
tw.writeStatementEnclosingExpr(idPropertyRef, exprParent.enclosingStmt)
extractExprContext(idPropertyRef, locId, callable, exprParent.enclosingStmt)
tw.writeCallableBinding(idPropertyRef, ids.constructor)
extractTypeAccessRecursive(kPropertyType, locId, idPropertyRef, -3, callable, exprParent.enclosingStmt)
@@ -4719,9 +4628,7 @@ open class KotlinFileExtractor(
val idMemberRef = tw.getFreshIdLabel<DbMemberref>()
tw.writeExprs_memberref(idMemberRef, ids.type.javaResult.id, exprParent.parent, exprParent.idx)
tw.writeExprsKotlinType(idMemberRef, ids.type.kotlinResult.id)
tw.writeHasLocation(idMemberRef, locId)
tw.writeCallableEnclosingExpr(idMemberRef, callable)
tw.writeStatementEnclosingExpr(idMemberRef, exprParent.enclosingStmt)
extractExprContext(idMemberRef, locId, callable, exprParent.enclosingStmt)
tw.writeCallableBinding(idMemberRef, ids.constructor)
val targetCallableId = useFunction<DbCallable>(target.owner.realOverrideTarget, classTypeArguments)
@@ -4885,25 +4792,19 @@ open class KotlinFileExtractor(
tw.writeStmts_returnstmt(retId, funLabels.blockId, 0, funLabels.methodId)
tw.writeHasLocation(retId, locId)
fun extractCommonExpr(id: Label<out DbExpr>) {
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, funLabels.methodId)
tw.writeStatementEnclosingExpr(id, retId)
}
// Call to original `invoke`:
val callId = tw.getFreshIdLabel<DbMethodaccess>()
val callType = useType(lambda.returnType)
tw.writeExprs_methodaccess(callId, callType.javaResult.id, retId, 0)
tw.writeExprsKotlinType(callId, callType.kotlinResult.id)
extractCommonExpr(callId)
extractExprContext(callId, locId, funLabels.methodId, retId)
val calledMethodId = useFunction<DbMethod>(lambda)
tw.writeCallableBinding(callId, calledMethodId)
// this access
extractThisAccess(ids.type, funLabels.methodId, callId, -1, retId, locId)
addArgumentsToInvocationInInvokeNBody(parameters.map { it.type }, funLabels, retId, callId, locId, ::extractCommonExpr)
addArgumentsToInvocationInInvokeNBody(parameters.map { it.type }, funLabels, retId, callId, locId)
}
/**
@@ -4921,12 +4822,10 @@ open class KotlinFileExtractor(
enclosingStmtId: Label<out DbStmt>, // label for the enclosing statement (return)
exprParentId: Label<out DbExprparent>, // label for the expression parent (call)
locId: Label<DbLocation>, // label for the location of all generated items
extractCommonExpr: (Label<out DbExpr>) -> Unit, // lambda used for extracting location, enclosing stmt and expr for all new expressions
firstArgumentOffset: Int = 0, // 0 or 1, the index used for the first argument. 1 in case an extension parameter is already accessed at index 0
useFirstArgAsDispatch: Boolean = false, // true if the first argument should be used as the dispatch receiver
dispatchReceiverIdx: Int = -1 // index of the dispatch receiver. -1 in case of functions, -2 in case of constructors
) {
val intType = useType(pluginContext.irBuiltIns.intType)
val argsParamType = pluginContext.irBuiltIns.arrayClass.typeWith(pluginContext.irBuiltIns.anyNType)
val argsType = useType(argsParamType)
val anyNType = useType(pluginContext.irBuiltIns.anyNType)
@@ -4948,7 +4847,7 @@ open class KotlinFileExtractor(
val type = useType(pType)
tw.writeExprs_castexpr(castId, type.javaResult.id, exprParentId, childIdx)
tw.writeExprsKotlinType(castId, type.kotlinResult.id)
extractCommonExpr(castId)
extractExprContext(castId, locId, funLabels.methodId, enclosingStmtId)
// type access `Ti`
extractTypeAccessRecursive(pType, locId, castId, 0, funLabels.methodId, enclosingStmtId)
@@ -4957,21 +4856,17 @@ open class KotlinFileExtractor(
val arrayAccessId = tw.getFreshIdLabel<DbArrayaccess>()
tw.writeExprs_arrayaccess(arrayAccessId, anyNType.javaResult.id, castId, 1)
tw.writeExprsKotlinType(arrayAccessId, anyNType.kotlinResult.id)
extractCommonExpr(arrayAccessId)
extractExprContext(arrayAccessId, locId, funLabels.methodId, enclosingStmtId)
// parameter access: `a0`
val argsAccessId = tw.getFreshIdLabel<DbVaraccess>()
tw.writeExprs_varaccess(argsAccessId, argsType.javaResult.id, arrayAccessId, 0)
tw.writeExprsKotlinType(argsAccessId, argsType.kotlinResult.id)
extractCommonExpr(argsAccessId)
extractExprContext(argsAccessId, locId, funLabels.methodId, enclosingStmtId)
tw.writeVariableBinding(argsAccessId, funLabels.parameters.first().first)
// index access: `i`
val indexId = tw.getFreshIdLabel<DbIntegerliteral>()
tw.writeExprs_integerliteral(indexId, intType.javaResult.id, arrayAccessId, 1)
tw.writeExprsKotlinType(indexId, intType.kotlinResult.id)
extractCommonExpr(indexId)
tw.writeNamestrings(pIdx.toString(), pIdx.toString(), indexId)
extractConstantInteger(pIdx, locId, arrayAccessId, 1, funLabels.methodId, enclosingStmtId)
}
}
@@ -5143,25 +5038,19 @@ open class KotlinFileExtractor(
enclosingStmt: Label<out DbStmt>
) : Label<DbArrayinit> {
fun extractCommonExpr(id: Label<out DbExpr>) {
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, enclosingCallable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
}
val arrayCreationId = tw.getFreshIdLabel<DbArraycreationexpr>()
val arrayType = pluginContext.irBuiltIns.arrayClass.typeWith(pluginContext.irBuiltIns.anyNType)
val at = useType(arrayType)
tw.writeExprs_arraycreationexpr(arrayCreationId, at.javaResult.id, parent, 0)
tw.writeExprsKotlinType(arrayCreationId, at.kotlinResult.id)
extractCommonExpr(arrayCreationId)
extractExprContext(arrayCreationId, locId, enclosingCallable, enclosingStmt)
extractTypeAccessRecursive(pluginContext.irBuiltIns.anyNType, locId, arrayCreationId, -1, enclosingCallable, enclosingStmt)
val initId = tw.getFreshIdLabel<DbArrayinit>()
tw.writeExprs_arrayinit(initId, at.javaResult.id, arrayCreationId, -2)
tw.writeExprsKotlinType(initId, at.kotlinResult.id)
extractCommonExpr(initId)
extractExprContext(initId, locId, enclosingCallable, enclosingStmt)
extractConstantInteger(arraySize, locId, arrayCreationId, 0, enclosingCallable, enclosingStmt)
@@ -5177,9 +5066,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_castexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 0, callable, enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 1, enclosingStmt)
}
@@ -5189,9 +5076,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_implicitcastexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 0, callable, enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 1, enclosingStmt)
}
@@ -5201,9 +5086,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_implicitnotnullexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 0, callable, enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 1, enclosingStmt)
}
@@ -5213,9 +5096,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_implicitcoerciontounitexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 0, callable, enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 1, enclosingStmt)
}
@@ -5225,9 +5106,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_safecastexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 0, callable, enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 1, enclosingStmt)
}
@@ -5237,9 +5116,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_instanceofexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 0, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 1, callable, enclosingStmt)
}
@@ -5249,9 +5126,7 @@ open class KotlinFileExtractor(
val type = useType(e.type)
tw.writeExprs_notinstanceofexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractExpressionExpr(e.argument, callable, id, 0, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 1, callable, enclosingStmt)
}
@@ -5376,18 +5251,12 @@ open class KotlinFileExtractor(
//<fn>.invoke(vp0, cp1, vp2, vp3, ...) or
//<fn>.invoke(new Object[x]{vp0, vp1, vp2, ...})
fun extractCommonExpr(id: Label<out DbExpr>) {
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, ids.function)
tw.writeStatementEnclosingExpr(id, returnId)
}
// Call to original `invoke`:
val callId = tw.getFreshIdLabel<DbMethodaccess>()
val callType = useType(trySub(samMember.returnType, TypeContext.RETURN))
tw.writeExprs_methodaccess(callId, callType.javaResult.id, returnId, 0)
tw.writeExprsKotlinType(callId, callType.kotlinResult.id)
extractCommonExpr(callId)
extractExprContext(callId, locId, ids.function, returnId)
val calledMethodId = useFunction<DbMethod>(invokeMethod, functionType.arguments)
tw.writeCallableBinding(callId, calledMethodId)
@@ -5396,7 +5265,7 @@ open class KotlinFileExtractor(
val lhsType = useType(functionType)
tw.writeExprs_varaccess(lhsId, lhsType.javaResult.id, callId, -1)
tw.writeExprsKotlinType(lhsId, lhsType.kotlinResult.id)
extractCommonExpr(lhsId)
extractExprContext(lhsId, locId, ids.function, returnId)
tw.writeVariableBinding(lhsId, fieldId)
val parameters = mutableListOf<IrValueParameter>()
@@ -5411,7 +5280,7 @@ open class KotlinFileExtractor(
val paramType = useType(trySub(p.type, TypeContext.OTHER))
tw.writeExprs_varaccess(argsAccessId, paramType.javaResult.id, parent, idx)
tw.writeExprsKotlinType(argsAccessId, paramType.kotlinResult.id)
extractCommonExpr(argsAccessId)
extractExprContext(argsAccessId, locId, ids.function, returnId)
tw.writeVariableBinding(argsAccessId, useValueParameter(p, ids.function))
}
@@ -5432,9 +5301,7 @@ open class KotlinFileExtractor(
val type = useType(e.typeOperand)
tw.writeExprs_castexpr(id, type.javaResult.id, parent, idx)
tw.writeExprsKotlinType(id, type.kotlinResult.id)
tw.writeHasLocation(id, locId)
tw.writeCallableEnclosingExpr(id, callable)
tw.writeStatementEnclosingExpr(id, enclosingStmt)
extractExprContext(id, locId, callable, enclosingStmt)
extractTypeAccessRecursive(e.typeOperand, locId, id, 0, callable, enclosingStmt)
val idNewexpr = extractNewExpr(ids.constructor, ids.type, locId, id, 1, callable, enclosingStmt)