@@ -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