From eaa5126132ff4aee084fa2decc1f8c8baabf4f5a Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Fri, 26 Nov 2021 20:41:57 +0700 Subject: [PATCH] [kotlin] mpp: do not suggest "Make not-nullable" fix for expect/actual declarations ^KTIJ-18743 Fixed GitOrigin-RevId: fb8ba1f8eb11e96177cc433602c3b730752bf81c --- .../RedundantNullableReturnTypeInspection.kt | 6 ++- .../QuickFixMultiModuleTestGenerated.java | 38 +++++++++++++++++++ .../actualMethod/common/common.kt | 3 ++ .../actualMethod/jvm/jvm.kt | 8 ++++ .../actualTopLevelFunction/common/common.kt | 1 + .../actualTopLevelFunction/jvm/jvm.kt | 6 +++ .../actualTopLevelProperty/common/common.kt | 1 + .../actualTopLevelProperty/jvm/jvm.kt | 7 ++++ .../expectMemberProperty/common/common.kt | 6 +++ .../expectMemberProperty/jvm/jvm.kt | 3 ++ .../expectTopLevelFunction/common/common.kt | 4 ++ .../expectTopLevelFunction/jvm/jvm.kt | 1 + .../expectTopLevelProperty/common/common.kt | 4 ++ .../expectTopLevelProperty/jvm/jvm.kt | 1 + 14 files changed, 88 insertions(+), 1 deletion(-) create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/jvm/jvm.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/jvm/jvm.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/jvm/jvm.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/jvm/jvm.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/jvm/jvm.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/common/common.kt create mode 100644 plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/jvm/jvm.kt diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantNullableReturnTypeInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantNullableReturnTypeInspection.kt index 1f81ec9e296e..99c5984b697d 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantNullableReturnTypeInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RedundantNullableReturnTypeInspection.kt @@ -19,6 +19,8 @@ import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.isOverridable import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.resolve.frontendService +import org.jetbrains.kotlin.idea.util.isEffectivelyActual +import org.jetbrains.kotlin.idea.util.isExpectDeclaration import org.jetbrains.kotlin.idea.util.textRangeIn import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType @@ -46,13 +48,14 @@ class RedundantNullableReturnTypeInspection : AbstractKotlinInspection() { if (typeElement.innerType == null) return val questionMark = typeElement.questionMarkNode as? LeafPsiElement ?: return - if (declaration.isOverridable()) return + if (declaration.isOverridable() || declaration.isExpectDeclaration() || declaration.isEffectivelyActual()) return val (body, targetDeclaration) = when (declaration) { is KtNamedFunction -> { val body = declaration.bodyExpression if (body != null) body to declaration else null } + is KtProperty -> { val initializer = declaration.initializer val getter = declaration.accessors.singleOrNull { it.isGetter } @@ -63,6 +66,7 @@ class RedundantNullableReturnTypeInspection : AbstractKotlinInspection() { else -> null } } + else -> null } ?: return val context = body.analyze() diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java index f135296ac88b..dbdc2225b668 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/quickfix/QuickFixMultiModuleTestGenerated.java @@ -1191,4 +1191,42 @@ public abstract class QuickFixMultiModuleTestGenerated extends AbstractQuickFixM runTest("testData/multiModuleQuickFix/other/safeDeleteUsedInAnotherPlatform/"); } } + + @RunWith(JUnit3RunnerWithInners.class) + @TestMetadata("testData/multiModuleQuickFix/redundantNullableReturnType") + public static class RedundantNullableReturnType extends AbstractQuickFixMultiModuleTest { + private void runTest(String testDataFilePath) throws Exception { + KotlinTestUtils.runTest(this::doTest, this, testDataFilePath); + } + + @TestMetadata("actualMethod") + public void testActualMethod() throws Exception { + runTest("testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/"); + } + + @TestMetadata("actualTopLevelFunction") + public void testActualTopLevelFunction() throws Exception { + runTest("testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/"); + } + + @TestMetadata("actualTopLevelProperty") + public void testActualTopLevelProperty() throws Exception { + runTest("testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/"); + } + + @TestMetadata("expectMemberProperty") + public void testExpectMemberProperty() throws Exception { + runTest("testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/"); + } + + @TestMetadata("expectTopLevelFunction") + public void testExpectTopLevelFunction() throws Exception { + runTest("testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/"); + } + + @TestMetadata("expectTopLevelProperty") + public void testExpectTopLevelProperty() throws Exception { + runTest("testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/"); + } + } } diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/common/common.kt new file mode 100644 index 000000000000..5148ca679917 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/common/common.kt @@ -0,0 +1,3 @@ +expect class MyClass { + fun runAction(block: () -> Unit): Any? +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/jvm/jvm.kt new file mode 100644 index 000000000000..a5150f9c12f4 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualMethod/jvm/jvm.kt @@ -0,0 +1,8 @@ +// "Make not-nullable" "false" +// TOOL: org.jetbrains.kotlin.idea.inspections.RedundantNullableReturnTypeInspection +// ACTION: Convert to block body +// ACTION: Remove explicit type specification + +actual class MyClass { + actual fun runAction(block: () -> Unit): Any? = block() +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/common/common.kt new file mode 100644 index 000000000000..5f36d1cb463a --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/common/common.kt @@ -0,0 +1 @@ +expect fun runAction(block: () -> Unit): Any? \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/jvm/jvm.kt new file mode 100644 index 000000000000..24f2a3ba0029 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelFunction/jvm/jvm.kt @@ -0,0 +1,6 @@ +// "Make not-nullable" "false" +// TOOL: org.jetbrains.kotlin.idea.inspections.RedundantNullableReturnTypeInspection +// ACTION: Convert to block body +// ACTION: Remove explicit type specification + +actual fun runAction(block: () -> Unit): Any? = block() \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/common/common.kt new file mode 100644 index 000000000000..52405ac74bae --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/common/common.kt @@ -0,0 +1 @@ +expect val prop: Any? \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/jvm/jvm.kt new file mode 100644 index 000000000000..c3050eb847ef --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/actualTopLevelProperty/jvm/jvm.kt @@ -0,0 +1,7 @@ +// "Make not-nullable" "false" +// TOOL: org.jetbrains.kotlin.idea.inspections.RedundantNullableReturnTypeInspection +// ACTION: Convert property initializer to getter +// ACTION: Convert to lazy property +// ACTION: Remove explicit type specification + +actual val prop: Any? = 42 \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/common/common.kt new file mode 100644 index 000000000000..05c118798c23 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/common/common.kt @@ -0,0 +1,6 @@ +// "Make not-nullable" "false" +// TOOL: org.jetbrains.kotlin.idea.inspections.RedundantNullableReturnTypeInspection + +expect class MyClass { + actual val prop: Any? +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/jvm/jvm.kt new file mode 100644 index 000000000000..c251227af56b --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectMemberProperty/jvm/jvm.kt @@ -0,0 +1,3 @@ +actual class MyClass { + actual val prop: Any? = 42 +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/common/common.kt new file mode 100644 index 000000000000..10e4366354d8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/common/common.kt @@ -0,0 +1,4 @@ +// "Make not-nullable" "false" +// TOOL: org.jetbrains.kotlin.idea.inspections.RedundantNullableReturnTypeInspection + +expect fun runAction(block: () -> Unit): Any? \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/jvm/jvm.kt new file mode 100644 index 000000000000..3135f1801858 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelFunction/jvm/jvm.kt @@ -0,0 +1 @@ +actual fun runAction(block: () -> Unit): Any? = block() \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/common/common.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/common/common.kt new file mode 100644 index 000000000000..a1bb76c24ec0 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/common/common.kt @@ -0,0 +1,4 @@ +// "Make not-nullable" "false" +// TOOL: org.jetbrains.kotlin.idea.inspections.RedundantNullableReturnTypeInspection + +expect val prop: Any? \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/jvm/jvm.kt b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/jvm/jvm.kt new file mode 100644 index 000000000000..5f7145cb3db8 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/multiModuleQuickFix/redundantNullableReturnType/expectTopLevelProperty/jvm/jvm.kt @@ -0,0 +1 @@ +actual val prop: Any? = 42 \ No newline at end of file