From d5fa755e63d5fd1ad08b19c4d8d17c69048b0941 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Fri, 24 Nov 2023 13:21:47 +0200 Subject: [PATCH] [FIR] Disable not null checks on dynamics It looks like K1 doesn't do them. And it's not particularly bad because in the ideal world we'd have dynamics with variable upper bound so that in `dynamic?.let { it }` `it` would be `Nothing..Any` (smartcasting to `Any` is not correct because `dynamic` can be passed into anything, but `Any` can not). ^KT-63071 --- .../body/resolve/FirExpressionsResolveTransformer.kt | 11 +++++++++-- .../dynamicTypes/extensionVals.fir.kt | 2 +- .../dynamicTypes/extensionVars.fir.kt | 4 ++-- .../testsWithJsStdLib/dynamicTypes/extensions.fir.kt | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 95a20f203a8..3d7114e9bd1 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -943,6 +943,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT return transformOtherChildren(transformer, ResolutionMode.ContextIndependent) } + @OptIn(UnresolvedExpressionTypeAccess::class) override fun transformCheckNotNullCall( checkNotNullCall: FirCheckNotNullCall, data: ResolutionMode, @@ -955,7 +956,10 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT return checkNotNullCall } - dataFlowAnalyzer.enterCheckNotNullCall() + if (checkNotNullCall.arguments.firstOrNull()?.coneTypeOrNull !is ConeDynamicType) { + dataFlowAnalyzer.enterCheckNotNullCall() + } + checkNotNullCall .transformAnnotations(transformer, ResolutionMode.ContextIndependent) .replaceArgumentList(checkNotNullCall.argumentList.transform(transformer, ResolutionMode.ContextDependent)) @@ -964,7 +968,10 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT components.syntheticCallGenerator.generateCalleeForCheckNotNullCall(checkNotNullCall, resolutionContext), data ) - dataFlowAnalyzer.exitCheckNotNullCall(result, data.forceFullCompletion) + if (checkNotNullCall.arguments.firstOrNull()?.coneTypeOrNull !is ConeDynamicType) { + dataFlowAnalyzer.exitCheckNotNullCall(result, data.forceFullCompletion) + } + return result } diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.fir.kt index dc9b17b242f..4308b271f0b 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.fir.kt @@ -12,7 +12,7 @@ fun test(d: dynamic) { d!!.onAnyVal } run { - d!!.onAnyVal = 1 + d!!.onAnyVal = 1 } d.onNullableAnyVal = 1 diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.fir.kt index a299d9d8e53..d510989a48f 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.fir.kt @@ -13,7 +13,7 @@ fun test(d: dynamic) { } run { - d!!.onAnyVar = 1 + d!!.onAnyVar = 1 } d.onNullableAnyVar = 1 @@ -22,7 +22,7 @@ fun test(d: dynamic) { d.onDynamicVar = 1 - d?.onDynamicVar = 1 + d?.onDynamicVar = 1 (d as String).onStringVar (d as Any).onAnyVar diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.fir.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.fir.kt index 38bd17c9928..90ff3159a47 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.fir.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.fir.kt @@ -14,7 +14,7 @@ fun test(d: dynamic) { d.onString() d.onDynamic() - d?.onDynamic() + d?.onDynamic() (d as String).onString() (d as Any).onAny()