From 4b1ce6c1a748a38ab2176199d609770ed101531f Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Fri, 22 Oct 2021 19:59:09 +0300 Subject: [PATCH] FIR: Fix safe call receiver nullability after null check --- ...iagnosisCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ .../FirOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...FrontendDiagnosticsWithLightTreeTestGenerated.java | 6 ++++++ .../kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt | 2 +- .../tests/j+k/safeCallDefinitelyNotNull.fir.kt | 11 +++++++++++ .../tests/j+k/safeCallDefinitelyNotNull.kt | 11 +++++++++++ .../kotlin/test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.fir.kt create mode 100644 compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 96c753b4faf..2510a1c36d5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -17269,6 +17269,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("safeCallDefinitelyNotNull.kt") + public void testSafeCallDefinitelyNotNull() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt"); + } + @Test @TestMetadata("samInConstructorWithGenerics.kt") public void testSamInConstructorWithGenerics() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index d783fc562aa..f249c94ed81 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -17269,6 +17269,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("safeCallDefinitelyNotNull.kt") + public void testSafeCallDefinitelyNotNull() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt"); + } + @Test @TestMetadata("samInConstructorWithGenerics.kt") public void testSamInConstructorWithGenerics() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index 07a6b6be157..ec32cdd27a5 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -17269,6 +17269,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("safeCallDefinitelyNotNull.kt") + public void testSafeCallDefinitelyNotNull() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt"); + } + @Test @TestMetadata("samInConstructorWithGenerics.kt") public void testSamInConstructorWithGenerics() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 61d7e429ac5..bfd7c4815dc 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -890,7 +890,7 @@ abstract class FirDataFlowAnalyzer( safeCall.receiver.let { receiver -> val type = receiver.coneType.takeIf { it.isMarkedNullable } - ?.withNullability(ConeNullability.NOT_NULL, components.session.typeContext) + ?.makeConeTypeDefinitelyNotNullOrNotNull(components.session.typeContext) ?: return@let val variable = variableStorage.getOrCreateVariable(flow, receiver) diff --git a/compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.fir.kt b/compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.fir.kt new file mode 100644 index 00000000000..a10001d2d60 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.fir.kt @@ -0,0 +1,11 @@ +// SKIP_TXT +// FILE: Api.java +import org.jetbrains.annotations.NotNull; +public abstract class Api { + public abstract void typeOf(@NotNull T node); +} + +// FILE: main.kt +fun foo(a: Api, e: E?) { + e?.let { a.typeOf(e) } +} diff --git a/compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt b/compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt new file mode 100644 index 00000000000..a708a41a0bb --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt @@ -0,0 +1,11 @@ +// SKIP_TXT +// FILE: Api.java +import org.jetbrains.annotations.NotNull; +public abstract class Api { + public abstract void typeOf(@NotNull T node); +} + +// FILE: main.kt +fun foo(a: Api, e: E?) { + e?.let { a.typeOf(e) } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index bc3f16ec7f8..d3e7797effc 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -17275,6 +17275,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/recursiveRawUpperBound3.kt"); } + @Test + @TestMetadata("safeCallDefinitelyNotNull.kt") + public void testSafeCallDefinitelyNotNull() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/safeCallDefinitelyNotNull.kt"); + } + @Test @TestMetadata("samInConstructorWithGenerics.kt") public void testSamInConstructorWithGenerics() throws Exception {