diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/IntersectionWithJavaString.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/IntersectionWithJavaString.kt index a395b8e8f6d..af8b5b26b4c 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/IntersectionWithJavaString.kt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/intellij/IntersectionWithJavaString.kt @@ -1,5 +1,7 @@ // FULL_JDK +// ISSUE: KT-48113 + fun collapse(path: String) { val result = (path as java.lang.String).replace("123", "456") - if (result !== path) {} -} \ No newline at end of file + if (result !== path) {} +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt index 90cb46511da..a2561805d31 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ConeTypeCompatibilityChecker.kt @@ -64,21 +64,17 @@ internal object ConeTypeCompatibilityChecker { } fun ConeInferenceContext.isCompatible(a: ConeKotlinType, b: ConeKotlinType): Compatibility { - val aUnwrap = unwrap(a) - val bUnwrap = unwrap(b) - if (aUnwrap.containsAll(bUnwrap) || bUnwrap.containsAll(aUnwrap)) { - return Compatibility.COMPATIBLE + if (a is ConeIntersectionType) { + return a.intersectedTypes.minOf { isCompatible(it, b) } + } + if (b is ConeIntersectionType) { + return b.intersectedTypes.minOf { isCompatible(a, it) } } val intersectionType = intersectTypesOrNull(listOf(a, b)) as? ConeIntersectionType ?: return Compatibility.COMPATIBLE return intersectionType.intersectedTypes.areCompatible(this) } - private fun unwrap(type: ConeKotlinType): Collection = when (type) { - is ConeIntersectionType -> type.intersectedTypes - else -> listOf(type) - } - private fun Collection.areCompatible(ctx: ConeInferenceContext): Compatibility { // If all types are nullable, then `null` makes the given types compatible. if (all { with(ctx) { it.isNullableType() } }) return Compatibility.COMPATIBLE