[FIR] Assume SafeCallsAreAlwaysNullable is always on

This commit is contained in:
Nikolay Lunyak
2023-02-24 16:02:35 +02:00
committed by Space Team
parent be5850112a
commit 72823657c9
9 changed files with 48 additions and 17 deletions
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.builtins.functions.FunctionTypeKind
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fakeElement
@@ -493,25 +492,15 @@ fun FirCheckedSafeCallSubject.propagateTypeFromOriginalReceiver(
}
fun FirSafeCallExpression.propagateTypeFromQualifiedAccessAfterNullCheck(
nullableReceiverExpression: FirExpression,
session: FirSession,
file: FirFile,
) {
val receiverType = nullableReceiverExpression.typeRef.coneTypeSafe<ConeKotlinType>()
val selector = selector
val resultingType = when {
selector is FirExpression && !selector.isCallToStatementLikeFunction -> {
val type = selector.typeRef.coneTypeSafe<ConeKotlinType>() ?: return
val isReceiverActuallyNullable = session.languageVersionSettings.supportsFeature(LanguageFeature.SafeCallsAreAlwaysNullable)
|| receiverType != null && session.typeContext.run { receiverType.isNullableType() }
if (isReceiverActuallyNullable) {
type.withNullability(ConeNullability.NULLABLE, session.typeContext)
} else {
type
}
type.withNullability(ConeNullability.NULLABLE, session.typeContext)
}
// Branch for things that shouldn't be used as expressions.
// They are forced to return not-null `Unit`, regardless of the receiver.
@@ -343,7 +343,7 @@ class FirCallCompletionResultsWriterTransformer(
)?.toExpectedType()
)
safeCallExpression.propagateTypeFromQualifiedAccessAfterNullCheck(safeCallExpression.receiver, session, context.file)
safeCallExpression.propagateTypeFromQualifiedAccessAfterNullCheck(session, context.file)
return safeCallExpression
}
@@ -357,7 +357,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
safeCallExpression.apply {
checkedSubjectRef.value.propagateTypeFromOriginalReceiver(receiver, components.session, components.file)
transformSelector(this@FirExpressionsResolveTransformer, data)
propagateTypeFromQualifiedAccessAfterNullCheck(receiver, session, context.file)
propagateTypeFromQualifiedAccessAfterNullCheck(session, context.file)
}
dataFlowAnalyzer.exitSafeCall(safeCallExpression)