@@ -1868,12 +1868,13 @@ open class KotlinFileExtractor(
18681868 extractStaticTypeAccessQualifierUnchecked(overriddenCallTarget.parent, id, locId, enclosingCallable, enclosingStmt)
18691869 }
18701870
1871- extractDefaultsCallArguments(id, overriddenCallTarget, enclosingCallable, enclosingStmt, valueArguments, dispatchReceiver, extensionReceiver)
1871+ extractDefaultsCallArguments(id, overriddenCallTarget, locId, enclosingCallable, enclosingStmt, valueArguments, dispatchReceiver, extensionReceiver)
18721872 }
18731873
18741874 private fun extractDefaultsCallArguments (
18751875 id : Label <out DbExprparent >,
18761876 callTarget : IrFunction ,
1877+ locId : Label <DbLocation >,
18771878 enclosingCallable : Label <out DbCallable >,
18781879 enclosingStmt : Label <out DbStmt >,
18791880 valueArguments : List <IrExpression ?>,
@@ -1900,7 +1901,7 @@ open class KotlinFileExtractor(
19001901 IrConstImpl .defaultValueForType(0 , 0 , getDefaultsMethodLastArgType(callTarget))
19011902 )
19021903
1903- extractCallValueArguments(id, valueArgsWithDummies + extraArgs, enclosingStmt, enclosingCallable, nextIdx, extractVarargAsArray = true )
1904+ extractCallValueArguments(id, valueArgsWithDummies + extraArgs, callTarget, locId, enclosingStmt, enclosingCallable, nextIdx, extractVarargAsArray = true )
19041905 }
19051906
19061907 private fun getFunctionInvokeMethod (typeArgs : List <IrTypeArgument >): IrFunction ? {
@@ -2022,7 +2023,7 @@ open class KotlinFileExtractor(
20222023 childIdx,
20232024 enclosingStmt,
20242025 valueArguments.size,
2025- { argParent, idxOffset -> extractCallValueArguments(argParent, valueArguments, enclosingStmt, enclosingCallable, idxOffset) },
2026+ { argParent, idxOffset -> extractCallValueArguments(argParent, valueArguments, syntacticCallTarget, locId, enclosingStmt, enclosingCallable, idxOffset) },
20262027 dispatchReceiver?.type,
20272028 dispatchReceiver?.let { { callId -> extractExpressionExpr(dispatchReceiver, enclosingCallable, callId, - 1 , enclosingStmt) } },
20282029 extensionReceiver?.let { { argParent -> extractExpressionExpr(extensionReceiver, enclosingCallable, argParent, 0 , enclosingStmt) } },
@@ -2116,19 +2117,38 @@ open class KotlinFileExtractor(
21162117 this is IrEnumEntry
21172118
21182119
2119- private fun extractCallValueArguments (callId : Label <out DbExprparent >, call : IrFunctionAccessExpression , enclosingStmt : Label <out DbStmt >, enclosingCallable : Label <out DbCallable >, idxOffset : Int ) =
2120- extractCallValueArguments(callId, (0 until call.valueArgumentsCount).map { call.getValueArgument(it) }, enclosingStmt, enclosingCallable, idxOffset)
2120+ private fun extractCallValueArguments (callId : Label <out DbExprparent >, call : IrFunctionAccessExpression , callTarget : IrFunction , fallbackLocation : Label < DbLocation >, enclosingStmt : Label <out DbStmt >, enclosingCallable : Label <out DbCallable >, idxOffset : Int ) =
2121+ extractCallValueArguments(callId, (0 until call.valueArgumentsCount).map { call.getValueArgument(it) }, callTarget, fallbackLocation, enclosingStmt, enclosingCallable, idxOffset)
21212122
2122- private fun extractCallValueArguments (callId : Label <out DbExprparent >, valueArguments : List <IrExpression ?>, enclosingStmt : Label <out DbStmt >, enclosingCallable : Label <out DbCallable >, idxOffset : Int , extractVarargAsArray : Boolean = false) {
2123+ private fun extractCallValueArguments (callId : Label <out DbExprparent >, valueArguments : List <IrExpression ?>, callTarget : IrFunction , fallbackLocation : Label < DbLocation >, enclosingStmt : Label <out DbStmt >, enclosingCallable : Label <out DbCallable >, idxOffset : Int , extractVarargAsArray : Boolean = false) {
21232124 var i = 0
21242125 valueArguments.forEach { arg ->
2125- if (arg != null ) {
2126+ if (arg != null ) {
21262127 if (arg is IrVararg && ! extractVarargAsArray) {
21272128 arg.elements.forEachIndexed { varargNo, vararg -> extractVarargElement(vararg, enclosingCallable, callId, i + idxOffset + varargNo, enclosingStmt) }
21282129 i + = arg.elements.size
21292130 } else {
21302131 extractExpressionExpr(arg, enclosingCallable, callId, (i++ ) + idxOffset, enclosingStmt)
21312132 }
2133+ } else {
2134+ val realCallTarget = callTarget.target.realOverrideTarget
2135+
2136+ // Generated constructor calls to kotlin.Enum have no arguments in IR, but the constructor takes two parameters.
2137+ if (realCallTarget is IrConstructor &&
2138+ realCallTarget.parentClassOrNull?.symbol == pluginContext.irBuiltIns.enumClass &&
2139+ realCallTarget.valueParameters.size == 2 &&
2140+ i < realCallTarget.valueParameters.size) {
2141+
2142+ if (i == 0 && realCallTarget.valueParameters[i].type == pluginContext.irBuiltIns.stringType) {
2143+
2144+ val id = extractNull(pluginContext.irBuiltIns.stringType, fallbackLocation, callId, (i++ ) + idxOffset, enclosingCallable, enclosingStmt)
2145+ tw.writeCompiler_generated(id, CompilerGeneratedKinds .ENUM_CONSTRUCTOR_ARGUMENT .kind)
2146+ } else if (i == 1 && realCallTarget.valueParameters[i].type == pluginContext.irBuiltIns.intType) {
2147+
2148+ val id = extractConstantInteger(0 , fallbackLocation, callId, (i++ ) + idxOffset, enclosingCallable, enclosingStmt)
2149+ tw.writeCompiler_generated(id, CompilerGeneratedKinds .ENUM_CONSTRUCTOR_ARGUMENT .kind)
2150+ }
2151+ }
21322152 }
21332153 }
21342154 }
@@ -3067,11 +3087,11 @@ open class KotlinFileExtractor(
30673087 // which have null arguments even though the parameters don't give default values.
30683088 val id = if (e !is IrEnumConstructorCall && callUsesDefaultArguments(e.symbol.owner, valueArgs)) {
30693089 extractNewExpr(getDefaultsMethodLabel(e.symbol.owner).cast(), type, locId, parent, idx, callable, enclosingStmt).also {
3070- extractDefaultsCallArguments(it, e.symbol.owner, callable, enclosingStmt, valueArgs, null , null )
3090+ extractDefaultsCallArguments(it, e.symbol.owner, locId, callable, enclosingStmt, valueArgs, null , null )
30713091 }
30723092 } else {
30733093 extractNewExpr(e.symbol.owner, eType.arguments, type, locId, parent, idx, callable, enclosingStmt).also {
3074- extractCallValueArguments(it, e, enclosingStmt, callable, 0 )
3094+ extractCallValueArguments(it, e, e.symbol.owner, locId, enclosingStmt, callable, 0 )
30753095 }
30763096 }
30773097
@@ -3396,6 +3416,14 @@ open class KotlinFileExtractor(
33963416 extractExprContext(it, locId, callable, enclosingStmt)
33973417 }
33983418
3419+ private fun extractNull (t : IrType , locId : Label <DbLocation >, parent : Label <out DbExprparent >, idx : Int , callable : Label <out DbCallable >, enclosingStmt : Label <out DbStmt >) =
3420+ tw.getFreshIdLabel<DbNullliteral >().also {
3421+ val type = useType(t)
3422+ tw.writeExprs_nullliteral(it, type.javaResult.id, parent, idx)
3423+ tw.writeExprsKotlinType(it, type.kotlinResult.id)
3424+ extractExprContext(it, locId, callable, enclosingStmt)
3425+ }
3426+
33993427 private fun extractAssignExpr (type : IrType , locId : Label <DbLocation >, parent : Label <out DbExprparent >, idx : Int , callable : Label <out DbCallable >, enclosingStmt : Label <out DbStmt >) =
34003428 tw.getFreshIdLabel<DbAssignexpr >().also {
34013429 val typeResults = useType(type)
@@ -3436,7 +3464,7 @@ open class KotlinFileExtractor(
34363464
34373465 tw.writeHasLocation(id, locId)
34383466 tw.writeCallableBinding(id.cast<DbCaller >(), methodId)
3439- extractCallValueArguments(id, e, id, callable, 0 )
3467+ extractCallValueArguments(id, e, e.symbol.owner, locId, id, callable, 0 )
34403468 val dr = e.dispatchReceiver
34413469 if (dr != null ) {
34423470 extractExpressionExpr(dr, callable, id, - 1 , id)
@@ -3614,12 +3642,7 @@ open class KotlinFileExtractor(
36143642 tw.writeNamestrings(v.toString(), v.toString(), id)
36153643 }
36163644 v == null -> {
3617- val id = tw.getFreshIdLabel<DbNullliteral >()
3618- val type = useType(e.type) // class;kotlin.Nothing
3619- val locId = tw.getLocation(e)
3620- tw.writeExprs_nullliteral(id, type.javaResult.id, exprParent.parent, exprParent.idx)
3621- tw.writeExprsKotlinType(id, type.kotlinResult.id)
3622- extractExprContext(id, locId, callable, exprParent.enclosingStmt)
3645+ extractNull(e.type, tw.getLocation(e), exprParent.parent, exprParent.idx, callable, exprParent.enclosingStmt)
36233646 }
36243647 else -> {
36253648 logger.errorElement(" Unrecognised IrConst: " + v.javaClass, e)
@@ -5516,5 +5539,6 @@ open class KotlinFileExtractor(
55165539 JVMOVERLOADS_METHOD (9 ),
55175540 DEFAULT_ARGUMENTS_METHOD (10 ),
55185541 INTERFACE_FORWARDER (11 ),
5542+ ENUM_CONSTRUCTOR_ARGUMENT (12 ),
55195543 }
55205544}
0 commit comments