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 408aa2132d7..bb4660ec348 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 @@ -27811,6 +27811,22 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag } } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/safeCalls") + @TestDataPath("$PROJECT_ROOT") + public class SafeCalls { + @Test + public void testAllFilesPresentInSafeCalls() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/safeCalls"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(fir|ll)\\.kts?$"), true); + } + + @Test + @TestMetadata("safeCallOnFlexibleTypeAlias.kt") + public void testSafeCallOnFlexibleTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/safeCalls/safeCallOnFlexibleTypeAlias.kt"); + } + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/samConversions") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 361ff86a71b..607b3e59d96 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -27811,6 +27811,22 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir } } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/safeCalls") + @TestDataPath("$PROJECT_ROOT") + public class SafeCalls { + @Test + public void testAllFilesPresentInSafeCalls() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/safeCalls"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.(fir|ll)\\.kts?$"), true); + } + + @Test + @TestMetadata("safeCallOnFlexibleTypeAlias.kt") + public void testSafeCallOnFlexibleTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/safeCalls/safeCallOnFlexibleTypeAlias.kt"); + } + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/samConversions") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 874ee56185f..5adbc10716e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -27823,6 +27823,22 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia } } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/safeCalls") + @TestDataPath("$PROJECT_ROOT") + public class SafeCalls { + @Test + public void testAllFilesPresentInSafeCalls() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/safeCalls"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(fir|ll)\\.kts?$"), true); + } + + @Test + @TestMetadata("safeCallOnFlexibleTypeAlias.kt") + public void testSafeCallOnFlexibleTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/safeCalls/safeCallOnFlexibleTypeAlias.kt"); + } + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/samConversions") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 20c2baba2a6..d7bdee3032d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -482,7 +482,7 @@ fun FirCheckedSafeCallSubject.propagateTypeFromOriginalReceiver( ?: nullableReceiverExpression.typeRef) .coneTypeSafe() ?: return - val expandedReceiverType = if (receiverType is ConeClassLikeType) receiverType.fullyExpandedType(session) else receiverType + val expandedReceiverType = receiverType.fullyExpandedType(session) val resolvedTypeRef = typeRef.resolvedTypeFromPrototype(expandedReceiverType.makeConeTypeDefinitelyNotNullOrNotNull(session.typeContext)) diff --git a/compiler/testData/diagnostics/tests/safeCalls/safeCallOnFlexibleTypeAlias.kt b/compiler/testData/diagnostics/tests/safeCalls/safeCallOnFlexibleTypeAlias.kt new file mode 100644 index 00000000000..329597f680a --- /dev/null +++ b/compiler/testData/diagnostics/tests/safeCalls/safeCallOnFlexibleTypeAlias.kt @@ -0,0 +1,23 @@ +// FIR_IDENTICAL +// ISSUE: KT-57190 +// FILE: MyFunction.java +@FunctionalInterface +public interface MyFunction { + void apply(T t); +} + +// FILE: MyPromise.java +public interface MyPromise { + void then(MyFunction done); +} + +// FILE: main.kt +typealias JsExpressionResult = String? + +fun countElementsByXpathAsync(promise: MyPromise, t: JsExpressionResult) { + promise.then { + it?.foo() // K1: ok, K2: was UNSAFE_CALL + } +} + +fun String.foo() {} 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 02c40eda1a6..09bebe26781 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 @@ -27823,6 +27823,22 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { } } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/safeCalls") + @TestDataPath("$PROJECT_ROOT") + public class SafeCalls { + @Test + public void testAllFilesPresentInSafeCalls() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/safeCalls"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.(fir|ll)\\.kts?$"), true); + } + + @Test + @TestMetadata("safeCallOnFlexibleTypeAlias.kt") + public void testSafeCallOnFlexibleTypeAlias() throws Exception { + runTest("compiler/testData/diagnostics/tests/safeCalls/safeCallOnFlexibleTypeAlias.kt"); + } + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/samConversions") @TestDataPath("$PROJECT_ROOT")