Skip to content

Commit 910372b

Browse files
committed
Kotlin: Refactor CallableReferenceHelper
This removes some non-null-expressions, and also makes the code more robust and easier to understand.
1 parent d3a8060 commit 910372b

File tree

1 file changed

+39
-25
lines changed

1 file changed

+39
-25
lines changed

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

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -594,7 +594,7 @@ open class KotlinFileExtractor(
594594
}
595595
}
596596

597-
data class FieldResult(val id: Label<DbField>, val name: String)
597+
private data class FieldResult(val id: Label<DbField>, val name: String)
598598

599599
private fun useCompanionObjectClassInstance(c: IrClass): FieldResult? {
600600
val parent = c.parent
@@ -3273,29 +3273,43 @@ open class KotlinFileExtractor(
32733273
}
32743274
}
32753275

3276+
data class ReceiverInfo(val receiver: IrExpression, val type: IrType, val field: Label<DbField>, val indexOffset: Int)
3277+
3278+
private fun makeReceiverInfo(callableReferenceExpr: IrCallableReference<out IrSymbol>, receiver: IrExpression?, indexOffset: Int): ReceiverInfo? {
3279+
if (receiver == null) {
3280+
return null
3281+
}
3282+
val type = receiver.type
3283+
if (type == null) {
3284+
logger.warnElement("Receiver has no type", callableReferenceExpr)
3285+
return null
3286+
}
3287+
val field: Label<DbField> = tw.getFreshIdLabel()
3288+
return ReceiverInfo(receiver, type, field, indexOffset)
3289+
}
3290+
3291+
/**
3292+
* This is used when extracting callable references,
3293+
* i.e. `::someCallable` or `::someReceiver::someCallable`.
3294+
*/
32763295
private open inner class CallableReferenceHelper(protected val callableReferenceExpr: IrCallableReference<out IrSymbol>, locId: Label<DbLocation>, ids: GeneratedClassLabels)
32773296
: GeneratedClassHelper(locId, ids) {
32783297

3279-
private val dispatchReceiver = callableReferenceExpr.dispatchReceiver
3280-
private val extensionReceiver = callableReferenceExpr.extensionReceiver
3281-
private val receiverType = callableReferenceExpr.dispatchReceiver?.type ?: callableReferenceExpr.extensionReceiver?.type
3282-
3283-
private val dispatchFieldId: Label<DbField>? = if (dispatchReceiver != null) tw.getFreshIdLabel() else null
3284-
private val extensionFieldId: Label<DbField>? = if (extensionReceiver != null) tw.getFreshIdLabel() else null
3285-
private val extensionParameterIndex: Int = if (dispatchReceiver != null) 1 else 0
3298+
// Only one of the receivers can be non-null, but we defensively handle the case when both are null anyway
3299+
private val dispatchReceiverInfo = makeReceiverInfo(callableReferenceExpr, callableReferenceExpr.dispatchReceiver, 0)
3300+
private val extensionReceiverInfo = makeReceiverInfo(callableReferenceExpr, callableReferenceExpr.extensionReceiver, if (dispatchReceiverInfo == null) 0 else 1)
32863301

32873302
fun extractReceiverField() {
32883303
val firstAssignmentStmtIdx = 1
32893304

3290-
// only one of the following can be non-null:
3291-
if (dispatchReceiver != null) {
3292-
extractField(dispatchFieldId!!, "<dispatchReceiver>", receiverType!!, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3293-
extractParameterToFieldAssignmentInConstructor("<dispatchReceiver>", dispatchReceiver.type, dispatchFieldId, 0, firstAssignmentStmtIdx)
3305+
if (dispatchReceiverInfo != null) {
3306+
extractField(dispatchReceiverInfo.field, "<dispatchReceiver>", dispatchReceiverInfo.type, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3307+
extractParameterToFieldAssignmentInConstructor("<dispatchReceiver>", dispatchReceiverInfo.type, dispatchReceiverInfo.field, 0 + dispatchReceiverInfo.indexOffset, firstAssignmentStmtIdx + dispatchReceiverInfo.indexOffset)
32943308
}
32953309

3296-
if (extensionReceiver != null) {
3297-
extractField(extensionFieldId!!, "<extensionReceiver>", receiverType!!, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3298-
extractParameterToFieldAssignmentInConstructor( "<extensionReceiver>", extensionReceiver.type, extensionFieldId, 0 + extensionParameterIndex, firstAssignmentStmtIdx + extensionParameterIndex)
3310+
if (extensionReceiverInfo != null) {
3311+
extractField(extensionReceiverInfo.field, "<extensionReceiver>", extensionReceiverInfo.type, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3312+
extractParameterToFieldAssignmentInConstructor( "<extensionReceiver>", extensionReceiverInfo.type, extensionReceiverInfo.field, 0 + extensionReceiverInfo.indexOffset, firstAssignmentStmtIdx + extensionReceiverInfo.indexOffset)
32993313
}
33003314
}
33013315

@@ -3376,8 +3390,8 @@ open class KotlinFileExtractor(
33763390
val fieldId = useField(target.owner)
33773391
tw.writeVariableBinding(accessId, fieldId)
33783392

3379-
if (dispatchReceiver != null) {
3380-
writeFieldAccessInFunctionBody(receiverType!!, -1, dispatchFieldId!!, accessId, labels.methodId, stmt)
3393+
if (dispatchReceiverInfo != null) {
3394+
writeFieldAccessInFunctionBody(dispatchReceiverInfo.type, -1, dispatchReceiverInfo.field, accessId, labels.methodId, stmt)
33813395
}
33823396
}
33833397

@@ -3436,8 +3450,8 @@ open class KotlinFileExtractor(
34363450
tw.writeCallableBinding(callId.cast<DbCaller>(), callableId)
34373451

34383452
val useFirstArgAsDispatch: Boolean
3439-
if (dispatchReceiver != null) {
3440-
writeFieldAccessInFunctionBody(receiverType!!, dispatchReceiverIdx, dispatchFieldId!!, callId, labels.methodId, retId)
3453+
if (dispatchReceiverInfo != null) {
3454+
writeFieldAccessInFunctionBody(dispatchReceiverInfo.type, dispatchReceiverIdx, dispatchReceiverInfo.field, callId, labels.methodId, retId)
34413455

34423456
useFirstArgAsDispatch = false
34433457
} else {
@@ -3456,8 +3470,8 @@ open class KotlinFileExtractor(
34563470
}
34573471

34583472
val extensionIdxOffset: Int
3459-
if (extensionReceiver != null) {
3460-
writeFieldAccessInFunctionBody(receiverType!!, 0, extensionFieldId!!, callId, labels.methodId, retId)
3473+
if (extensionReceiverInfo != null) {
3474+
writeFieldAccessInFunctionBody(extensionReceiverInfo.type, 0, extensionReceiverInfo.field, callId, labels.methodId, retId)
34613475
extensionIdxOffset = 1
34623476
} else {
34633477
extensionIdxOffset = 0
@@ -3487,12 +3501,12 @@ open class KotlinFileExtractor(
34873501
idCtorRef: Label<out DbClassinstancexpr>,
34883502
enclosingStmt: Label<out DbStmt>
34893503
) {
3490-
if (dispatchReceiver != null) {
3491-
extractExpressionExpr(dispatchReceiver, callable, idCtorRef, 0, enclosingStmt)
3504+
if (dispatchReceiverInfo != null) {
3505+
extractExpressionExpr(dispatchReceiverInfo.receiver, callable, idCtorRef, 0 + dispatchReceiverInfo.indexOffset, enclosingStmt)
34923506
}
34933507

3494-
if (extensionReceiver != null) {
3495-
extractExpressionExpr(extensionReceiver, callable, idCtorRef, 0 + extensionParameterIndex, enclosingStmt)
3508+
if (extensionReceiverInfo != null) {
3509+
extractExpressionExpr(extensionReceiverInfo.receiver, callable, idCtorRef, 0 + extensionReceiverInfo.indexOffset, enclosingStmt)
34963510
}
34973511
}
34983512
}

0 commit comments

Comments
 (0)