Skip to content

Commit 623d87a

Browse files
authored
Merge pull request #10142 from igfoo/igfoo/not-null-expr
Kotlin: Remove some more non-null-expressions
2 parents 8b4cf29 + 910372b commit 623d87a

File tree

1 file changed

+49
-32
lines changed

1 file changed

+49
-32
lines changed

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

Lines changed: 49 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -598,7 +598,7 @@ open class KotlinFileExtractor(
598598
}
599599
}
600600

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

603603
private fun useCompanionObjectClassInstance(c: IrClass): FieldResult? {
604604
val parent = c.parent
@@ -3277,29 +3277,43 @@ open class KotlinFileExtractor(
32773277
}
32783278
}
32793279

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

3283-
private val dispatchReceiver = callableReferenceExpr.dispatchReceiver
3284-
private val extensionReceiver = callableReferenceExpr.extensionReceiver
3285-
private val receiverType = callableReferenceExpr.dispatchReceiver?.type ?: callableReferenceExpr.extensionReceiver?.type
3286-
3287-
private val dispatchFieldId: Label<DbField>? = if (dispatchReceiver != null) tw.getFreshIdLabel() else null
3288-
private val extensionFieldId: Label<DbField>? = if (extensionReceiver != null) tw.getFreshIdLabel() else null
3289-
private val extensionParameterIndex: Int = if (dispatchReceiver != null) 1 else 0
3302+
// Only one of the receivers can be non-null, but we defensively handle the case when both are null anyway
3303+
private val dispatchReceiverInfo = makeReceiverInfo(callableReferenceExpr, callableReferenceExpr.dispatchReceiver, 0)
3304+
private val extensionReceiverInfo = makeReceiverInfo(callableReferenceExpr, callableReferenceExpr.extensionReceiver, if (dispatchReceiverInfo == null) 0 else 1)
32903305

32913306
fun extractReceiverField() {
32923307
val firstAssignmentStmtIdx = 1
32933308

3294-
// only one of the following can be non-null:
3295-
if (dispatchReceiver != null) {
3296-
extractField(dispatchFieldId!!, "<dispatchReceiver>", receiverType!!, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3297-
extractParameterToFieldAssignmentInConstructor("<dispatchReceiver>", dispatchReceiver.type, dispatchFieldId, 0, firstAssignmentStmtIdx)
3309+
if (dispatchReceiverInfo != null) {
3310+
extractField(dispatchReceiverInfo.field, "<dispatchReceiver>", dispatchReceiverInfo.type, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3311+
extractParameterToFieldAssignmentInConstructor("<dispatchReceiver>", dispatchReceiverInfo.type, dispatchReceiverInfo.field, 0 + dispatchReceiverInfo.indexOffset, firstAssignmentStmtIdx + dispatchReceiverInfo.indexOffset)
32983312
}
32993313

3300-
if (extensionReceiver != null) {
3301-
extractField(extensionFieldId!!, "<extensionReceiver>", receiverType!!, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3302-
extractParameterToFieldAssignmentInConstructor( "<extensionReceiver>", extensionReceiver.type, extensionFieldId, 0 + extensionParameterIndex, firstAssignmentStmtIdx + extensionParameterIndex)
3314+
if (extensionReceiverInfo != null) {
3315+
extractField(extensionReceiverInfo.field, "<extensionReceiver>", extensionReceiverInfo.type, classId, locId, DescriptorVisibilities.PRIVATE, callableReferenceExpr, isExternalDeclaration = false, isFinal = true)
3316+
extractParameterToFieldAssignmentInConstructor( "<extensionReceiver>", extensionReceiverInfo.type, extensionReceiverInfo.field, 0 + extensionReceiverInfo.indexOffset, firstAssignmentStmtIdx + extensionReceiverInfo.indexOffset)
33033317
}
33043318
}
33053319

@@ -3380,8 +3394,8 @@ open class KotlinFileExtractor(
33803394
val fieldId = useField(target.owner)
33813395
tw.writeVariableBinding(accessId, fieldId)
33823396

3383-
if (dispatchReceiver != null) {
3384-
writeFieldAccessInFunctionBody(receiverType!!, -1, dispatchFieldId!!, accessId, labels.methodId, stmt)
3397+
if (dispatchReceiverInfo != null) {
3398+
writeFieldAccessInFunctionBody(dispatchReceiverInfo.type, -1, dispatchReceiverInfo.field, accessId, labels.methodId, stmt)
33853399
}
33863400
}
33873401

@@ -3409,8 +3423,7 @@ open class KotlinFileExtractor(
34093423
expressionTypeArgs: List<IrType>, // type arguments of the extracted expression
34103424
classTypeArgsIncludingOuterClasses: List<IrTypeArgument>?, // type arguments of the class containing the callable reference
34113425
dispatchReceiverIdx: Int = -1, // dispatch receiver index: -1 in case of functions, -2 for constructors
3412-
isBigArity: Boolean = false, // whether a big arity `invoke` is being extracted
3413-
bigArityParameterTypes: List<IrType>? = null // parameter types used for the cast expressions in the big arity `invoke` invocation
3426+
bigArityParameterTypes: List<IrType>? = null // parameter types used for the cast expressions in a big arity `invoke` invocation. null if not a big arity invocation.
34143427
) {
34153428
// Return statement of generated function:
34163429
val retId = tw.getFreshIdLabel<DbReturnstmt>()
@@ -3441,8 +3454,8 @@ open class KotlinFileExtractor(
34413454
tw.writeCallableBinding(callId.cast<DbCaller>(), callableId)
34423455

34433456
val useFirstArgAsDispatch: Boolean
3444-
if (dispatchReceiver != null) {
3445-
writeFieldAccessInFunctionBody(receiverType!!, dispatchReceiverIdx, dispatchFieldId!!, callId, labels.methodId, retId)
3457+
if (dispatchReceiverInfo != null) {
3458+
writeFieldAccessInFunctionBody(dispatchReceiverInfo.type, dispatchReceiverIdx, dispatchReceiverInfo.field, callId, labels.methodId, retId)
34463459

34473460
useFirstArgAsDispatch = false
34483461
} else {
@@ -3461,17 +3474,17 @@ open class KotlinFileExtractor(
34613474
}
34623475

34633476
val extensionIdxOffset: Int
3464-
if (extensionReceiver != null) {
3465-
writeFieldAccessInFunctionBody(receiverType!!, 0, extensionFieldId!!, callId, labels.methodId, retId)
3477+
if (extensionReceiverInfo != null) {
3478+
writeFieldAccessInFunctionBody(extensionReceiverInfo.type, 0, extensionReceiverInfo.field, callId, labels.methodId, retId)
34663479
extensionIdxOffset = 1
34673480
} else {
34683481
extensionIdxOffset = 0
34693482
}
34703483

3471-
if (isBigArity) {
3484+
if (bigArityParameterTypes != null) {
34723485
// In case we're extracting a big arity function reference:
34733486
addArgumentsToInvocationInInvokeNBody(
3474-
bigArityParameterTypes!!, labels, retId, callId, locId,
3487+
bigArityParameterTypes, labels, retId, callId, locId,
34753488
{ exp -> writeExpressionMetadataToTrapFile(exp, labels.methodId, retId) },
34763489
extensionIdxOffset, useFirstArgAsDispatch, dispatchReceiverIdx)
34773490
} else {
@@ -3492,12 +3505,12 @@ open class KotlinFileExtractor(
34923505
idCtorRef: Label<out DbClassinstancexpr>,
34933506
enclosingStmt: Label<out DbStmt>
34943507
) {
3495-
if (dispatchReceiver != null) {
3496-
extractExpressionExpr(dispatchReceiver, callable, idCtorRef, 0, enclosingStmt)
3508+
if (dispatchReceiverInfo != null) {
3509+
extractExpressionExpr(dispatchReceiverInfo.receiver, callable, idCtorRef, 0 + dispatchReceiverInfo.indexOffset, enclosingStmt)
34973510
}
34983511

3499-
if (extensionReceiver != null) {
3500-
extractExpressionExpr(extensionReceiver, callable, idCtorRef, 0 + extensionParameterIndex, enclosingStmt)
3512+
if (extensionReceiverInfo != null) {
3513+
extractExpressionExpr(extensionReceiverInfo.receiver, callable, idCtorRef, 0 + extensionReceiverInfo.indexOffset, enclosingStmt)
35013514
}
35023515
}
35033516
}
@@ -3574,6 +3587,11 @@ open class KotlinFileExtractor(
35743587
logger.errorElement("Unexpected: property reference with non simple type. ${kPropertyType.classFqName?.asString()}", propertyReferenceExpr)
35753588
return
35763589
}
3590+
val kPropertyClass = kPropertyType.classOrNull
3591+
if (kPropertyClass == null) {
3592+
logger.errorElement("Cannot find class for kPropertyType. ${kPropertyType.classFqName?.asString()}", propertyReferenceExpr)
3593+
return
3594+
}
35773595

35783596
val locId = tw.getLocation(propertyReferenceExpr)
35793597

@@ -3587,7 +3605,7 @@ open class KotlinFileExtractor(
35873605
)
35883606

35893607
val currentDeclaration = declarationStack.peek()
3590-
val prefix = if (kPropertyType.classOrNull!!.owner.name.asString().startsWith("KMutableProperty")) "Mutable" else ""
3608+
val prefix = if (kPropertyClass.owner.name.asString().startsWith("KMutableProperty")) "Mutable" else ""
35913609
val baseClass = pluginContext.referenceClass(FqName("kotlin.jvm.internal.${prefix}PropertyReference${kPropertyType.arguments.size - 1}"))?.owner?.typeWith()
35923610
?: pluginContext.irBuiltIns.anyType
35933611

@@ -3813,8 +3831,7 @@ open class KotlinFileExtractor(
38133831
expressionTypeArguments,
38143832
classTypeArguments,
38153833
dispatchReceiverIdx,
3816-
isBigArity,
3817-
parameterTypes.dropLast(1))
3834+
if (isBigArity) parameterTypes.dropLast(1) else null)
38183835

38193836
val typeAccessArguments = if (isBigArity) listOf(parameterTypes.last()) else parameterTypes
38203837
if (target is IrConstructorSymbol) {

0 commit comments

Comments
 (0)