Skip to content

Commit 7d927a7

Browse files
committed
Adjust enum constructor argument extraction based on review
1 parent fb5b344 commit 7d927a7

File tree

1 file changed

+27
-31
lines changed

1 file changed

+27
-31
lines changed

java/kotlin-extractor/src/main/kotlin/KotlinFileExtractor.kt

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1868,13 +1868,12 @@ open class KotlinFileExtractor(
18681868
extractStaticTypeAccessQualifierUnchecked(overriddenCallTarget.parent, id, locId, enclosingCallable, enclosingStmt)
18691869
}
18701870

1871-
extractDefaultsCallArguments(id, overriddenCallTarget, locId, enclosingCallable, enclosingStmt, valueArguments, dispatchReceiver, extensionReceiver)
1871+
extractDefaultsCallArguments(id, overriddenCallTarget, enclosingCallable, enclosingStmt, valueArguments, dispatchReceiver, extensionReceiver)
18721872
}
18731873

18741874
private fun extractDefaultsCallArguments(
18751875
id: Label<out DbExprparent>,
18761876
callTarget: IrFunction,
1877-
locId: Label<DbLocation>,
18781877
enclosingCallable: Label<out DbCallable>,
18791878
enclosingStmt: Label<out DbStmt>,
18801879
valueArguments: List<IrExpression?>,
@@ -1901,7 +1900,7 @@ open class KotlinFileExtractor(
19011900
IrConstImpl.defaultValueForType(0, 0, getDefaultsMethodLastArgType(callTarget))
19021901
)
19031902

1904-
extractCallValueArguments(id, valueArgsWithDummies + extraArgs, callTarget, locId, enclosingStmt, enclosingCallable, nextIdx, extractVarargAsArray = true)
1903+
extractCallValueArguments(id, valueArgsWithDummies + extraArgs, enclosingStmt, enclosingCallable, nextIdx, extractVarargAsArray = true)
19051904
}
19061905

19071906
private fun getFunctionInvokeMethod(typeArgs: List<IrTypeArgument>): IrFunction? {
@@ -2023,7 +2022,7 @@ open class KotlinFileExtractor(
20232022
childIdx,
20242023
enclosingStmt,
20252024
valueArguments.size,
2026-
{ argParent, idxOffset -> extractCallValueArguments(argParent, valueArguments, syntacticCallTarget, locId, enclosingStmt, enclosingCallable, idxOffset) },
2025+
{ argParent, idxOffset -> extractCallValueArguments(argParent, valueArguments, enclosingStmt, enclosingCallable, idxOffset) },
20272026
dispatchReceiver?.type,
20282027
dispatchReceiver?.let { { callId -> extractExpressionExpr(dispatchReceiver, enclosingCallable, callId, -1, enclosingStmt) } },
20292028
extensionReceiver?.let { { argParent -> extractExpressionExpr(extensionReceiver, enclosingCallable, argParent, 0, enclosingStmt) } },
@@ -2117,10 +2116,10 @@ open class KotlinFileExtractor(
21172116
this is IrEnumEntry
21182117

21192118

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)
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)
21222121

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) {
2122+
private fun extractCallValueArguments(callId: Label<out DbExprparent>, valueArguments: List<IrExpression?>, enclosingStmt: Label<out DbStmt>, enclosingCallable: Label<out DbCallable>, idxOffset: Int, extractVarargAsArray: Boolean = false) {
21242123
var i = 0
21252124
valueArguments.forEach { arg ->
21262125
if (arg != null) {
@@ -2130,25 +2129,6 @@ open class KotlinFileExtractor(
21302129
} else {
21312130
extractExpressionExpr(arg, enclosingCallable, callId, (i++) + idxOffset, enclosingStmt)
21322131
}
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?.fqNameWhenAvailable?.asString() == "kotlin.Enum" &&
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-
}
21522132
}
21532133
}
21542134
}
@@ -3083,15 +3063,31 @@ open class KotlinFileExtractor(
30833063
val isAnonymous = eType.isAnonymous
30843064
val locId = tw.getLocation(e)
30853065
val valueArgs = (0 until e.valueArgumentsCount).map { e.getValueArgument(it) }
3086-
// For now, don't try to use default methods for enum constructor calls,
3087-
// which have null arguments even though the parameters don't give default values.
3066+
30883067
val id = if (e !is IrEnumConstructorCall && callUsesDefaultArguments(e.symbol.owner, valueArgs)) {
30893068
extractNewExpr(getDefaultsMethodLabel(e.symbol.owner).cast(), type, locId, parent, idx, callable, enclosingStmt).also {
3090-
extractDefaultsCallArguments(it, e.symbol.owner, locId, callable, enclosingStmt, valueArgs, null, null)
3069+
extractDefaultsCallArguments(it, e.symbol.owner, callable, enclosingStmt, valueArgs, null, null)
30913070
}
30923071
} else {
30933072
extractNewExpr(e.symbol.owner, eType.arguments, type, locId, parent, idx, callable, enclosingStmt).also {
3094-
extractCallValueArguments(it, e, e.symbol.owner, locId, enclosingStmt, callable, 0)
3073+
3074+
val realCallTarget = e.symbol.owner.realOverrideTarget
3075+
// Generated constructor calls to kotlin.Enum have no arguments in IR, but the constructor takes two parameters.
3076+
if (e is IrEnumConstructorCall &&
3077+
realCallTarget is IrConstructor &&
3078+
realCallTarget.parentClassOrNull?.fqNameWhenAvailable?.asString() == "kotlin.Enum" &&
3079+
realCallTarget.valueParameters.size == 2 &&
3080+
realCallTarget.valueParameters[0].type == pluginContext.irBuiltIns.stringType &&
3081+
realCallTarget.valueParameters[1].type == pluginContext.irBuiltIns.intType) {
3082+
3083+
val id0 = extractNull(pluginContext.irBuiltIns.stringType, locId, it, 0, callable, enclosingStmt)
3084+
tw.writeCompiler_generated(id0, CompilerGeneratedKinds.ENUM_CONSTRUCTOR_ARGUMENT.kind)
3085+
3086+
val id1 = extractConstantInteger(0, locId, it, 1, callable, enclosingStmt)
3087+
tw.writeCompiler_generated(id1, CompilerGeneratedKinds.ENUM_CONSTRUCTOR_ARGUMENT.kind)
3088+
} else {
3089+
extractCallValueArguments(it, e, enclosingStmt, callable, 0)
3090+
}
30953091
}
30963092
}
30973093

@@ -3464,7 +3460,7 @@ open class KotlinFileExtractor(
34643460

34653461
tw.writeHasLocation(id, locId)
34663462
tw.writeCallableBinding(id.cast<DbCaller>(), methodId)
3467-
extractCallValueArguments(id, e, e.symbol.owner, locId, id, callable, 0)
3463+
extractCallValueArguments(id, e, id, callable, 0)
34683464
val dr = e.dispatchReceiver
34693465
if (dr != null) {
34703466
extractExpressionExpr(dr, callable, id, -1, id)

0 commit comments

Comments
 (0)