@@ -594,7 +594,7 @@ open class KotlinFileExtractor(
594
594
}
595
595
}
596
596
597
- data class FieldResult (val id : Label <DbField >, val name : String )
597
+ private data class FieldResult (val id : Label <DbField >, val name : String )
598
598
599
599
private fun useCompanionObjectClassInstance (c : IrClass ): FieldResult ? {
600
600
val parent = c.parent
@@ -3273,29 +3273,43 @@ open class KotlinFileExtractor(
3273
3273
}
3274
3274
}
3275
3275
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
+ */
3276
3295
private open inner class CallableReferenceHelper (protected val callableReferenceExpr : IrCallableReference <out IrSymbol >, locId : Label <DbLocation >, ids : GeneratedClassLabels )
3277
3296
: GeneratedClassHelper (locId, ids) {
3278
3297
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 )
3286
3301
3287
3302
fun extractReceiverField () {
3288
3303
val firstAssignmentStmtIdx = 1
3289
3304
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)
3294
3308
}
3295
3309
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 )
3299
3313
}
3300
3314
}
3301
3315
@@ -3376,8 +3390,8 @@ open class KotlinFileExtractor(
3376
3390
val fieldId = useField(target.owner)
3377
3391
tw.writeVariableBinding(accessId, fieldId)
3378
3392
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)
3381
3395
}
3382
3396
}
3383
3397
@@ -3436,8 +3450,8 @@ open class KotlinFileExtractor(
3436
3450
tw.writeCallableBinding(callId.cast<DbCaller >(), callableId)
3437
3451
3438
3452
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)
3441
3455
3442
3456
useFirstArgAsDispatch = false
3443
3457
} else {
@@ -3456,8 +3470,8 @@ open class KotlinFileExtractor(
3456
3470
}
3457
3471
3458
3472
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)
3461
3475
extensionIdxOffset = 1
3462
3476
} else {
3463
3477
extensionIdxOffset = 0
@@ -3487,12 +3501,12 @@ open class KotlinFileExtractor(
3487
3501
idCtorRef : Label <out DbClassinstancexpr >,
3488
3502
enclosingStmt : Label <out DbStmt >
3489
3503
) {
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)
3492
3506
}
3493
3507
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)
3496
3510
}
3497
3511
}
3498
3512
}
0 commit comments