diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.kt index 349a71d603f..580b664db92 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/WhenChecker.kt @@ -47,7 +47,7 @@ import java.util.* val List.hasUnknown: Boolean - get() = any { it == WhenMissingCase.Unknown || it is WhenMissingCase.ConditionTypeIsExpect } + get() = firstOrNull() == WhenMissingCase.Unknown private interface WhenExhaustivenessChecker { fun getMissingCases( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt index 8b9b75c6b63..b9ceabc6b7b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/Renderers.kt @@ -23,13 +23,11 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.analyzer.moduleInfo import org.jetbrains.kotlin.analyzer.unwrapPlatform import org.jetbrains.kotlin.builtins.KotlinBuiltIns -import org.jetbrains.kotlin.cfg.hasUnknown import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.newTable import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.newText -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameUnsafe import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.platform.isCommon @@ -697,9 +695,12 @@ object Renderers { private val WHEN_MISSING_LIMIT = 7 + private val List.assumesElseBranchOnly: Boolean + get() = any { it == WhenMissingCase.Unknown || it is WhenMissingCase.ConditionTypeIsExpect } + @JvmField val RENDER_WHEN_MISSING_CASES = Renderer> { - if (!it.hasUnknown) { + if (!it.assumesElseBranchOnly) { val list = it.joinToString(", ", limit = WHEN_MISSING_LIMIT) { "'$it'" } val branches = if (it.size > 1) "branches" else "branch" "$list $branches or 'else' branch instead" diff --git a/idea/testData/multiModuleQuickFix/createActual/expectSealedInCommonWhen/header/header.kt b/idea/testData/multiModuleQuickFix/createActual/expectSealedInCommonWhen/header/header.kt new file mode 100644 index 00000000000..087834711c1 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActual/expectSealedInCommonWhen/header/header.kt @@ -0,0 +1,14 @@ +// "Add remaining branches" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: Expected class 'CommonSealedClass' has no actual declaration in module testModule_Common +// ERROR: Unresolved reference: TODO +// ERROR: Unresolved reference: TODO +// ERROR: Unresolved reference: TODO + +expect sealed class CommonSealedClass() +class SInheritor1 : CommonSealedClass() +class SInheritor2 : CommonSealedClass() + +fun hello(c: CommonSealedClass): Int = when(c) { + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActual/expectSealedInCommonWhen/header/header.kt.after b/idea/testData/multiModuleQuickFix/createActual/expectSealedInCommonWhen/header/header.kt.after new file mode 100644 index 00000000000..ce1108a00f5 --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActual/expectSealedInCommonWhen/header/header.kt.after @@ -0,0 +1,16 @@ +// "Add remaining branches" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: Expected class 'CommonSealedClass' has no actual declaration in module testModule_Common +// ERROR: Unresolved reference: TODO +// ERROR: Unresolved reference: TODO +// ERROR: Unresolved reference: TODO + +expect sealed class CommonSealedClass() +class SInheritor1 : CommonSealedClass() +class SInheritor2 : CommonSealedClass() + +fun hello(c: CommonSealedClass): Int = when(c) { + is SInheritor1 -> TODO() + is SInheritor2 -> TODO() + else -> TODO() +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActual/sealedInCommonWhen/header/header.kt b/idea/testData/multiModuleQuickFix/createActual/sealedInCommonWhen/header/header.kt new file mode 100644 index 00000000000..d3177f929fc --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActual/sealedInCommonWhen/header/header.kt @@ -0,0 +1,12 @@ +// "Add remaining branches" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: Unresolved reference: TODO +// ERROR: Unresolved reference: TODO + +sealed class CommonSealedClass() +class SInheritor1 : CommonSealedClass() +class SInheritor2 : CommonSealedClass() + +fun hello(c: CommonSealedClass): Int = when(c) { + +} \ No newline at end of file diff --git a/idea/testData/multiModuleQuickFix/createActual/sealedInCommonWhen/header/header.kt.after b/idea/testData/multiModuleQuickFix/createActual/sealedInCommonWhen/header/header.kt.after new file mode 100644 index 00000000000..26b91bab47e --- /dev/null +++ b/idea/testData/multiModuleQuickFix/createActual/sealedInCommonWhen/header/header.kt.after @@ -0,0 +1,13 @@ +// "Add remaining branches" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: Unresolved reference: TODO +// ERROR: Unresolved reference: TODO + +sealed class CommonSealedClass() +class SInheritor1 : CommonSealedClass() +class SInheritor2 : CommonSealedClass() + +fun hello(c: CommonSealedClass): Int = when(c) { + is SInheritor1 -> TODO() + is SInheritor2 -> TODO() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index b940ab06d9b..b16cb0c9806 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -416,6 +416,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/createActual/enum/"); } + @TestMetadata("expectSealedInCommonWhen") + public void testExpectSealedInCommonWhen() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createActual/expectSealedInCommonWhen/"); + } + @TestMetadata("function") public void testFunction() throws Exception { runTest("idea/testData/multiModuleQuickFix/createActual/function/"); @@ -476,6 +481,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul runTest("idea/testData/multiModuleQuickFix/createActual/sealed/"); } + @TestMetadata("sealedInCommonWhen") + public void testSealedInCommonWhen() throws Exception { + runTest("idea/testData/multiModuleQuickFix/createActual/sealedInCommonWhen/"); + } + @TestMetadata("sealedSubclass") public void testSealedSubclass() throws Exception { runTest("idea/testData/multiModuleQuickFix/createActual/sealedSubclass/");