From b8c72ec4e9c0041b6231247f6711cf63b3f66680 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Mon, 26 Oct 2015 18:08:18 +0300 Subject: [PATCH] Suggest to add !! as a quick-fix for type mistmach --- ...clExlCallFixes.kt => ExclExclCallFixes.kt} | 6 +++-- .../QuickFixFactoryForTypeMismatchError.java | 7 ++++++ .../addExclExclToRemoveNullability.kt | 7 ++++++ .../addExclExclToRemoveNullability.kt.after | 7 ++++++ ...moveNullabilityDisabledWhenItCannotHelp.kt | 9 +++++++ ...ddExclExclToRemoveNullabilityForGeneric.kt | 8 +++++++ ...ExclToRemoveNullabilityForGeneric.kt.after | 8 +++++++ ...dExclExclToRemoveNullabilityForSubclass.kt | 14 +++++++++++ ...xclToRemoveNullabilityForSubclass.kt.after | 14 +++++++++++ .../idea/quickfix/QuickFixTestGenerated.java | 24 +++++++++++++++++++ 10 files changed, 102 insertions(+), 2 deletions(-) rename idea/src/org/jetbrains/kotlin/idea/quickfix/{ExclExlCallFixes.kt => ExclExclCallFixes.kt} (95%) create mode 100644 idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt create mode 100644 idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityDisabledWhenItCannotHelp.kt create mode 100644 idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt create mode 100644 idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt.after create mode 100644 idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt create mode 100644 idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExlCallFixes.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt similarity index 95% rename from idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExlCallFixes.kt rename to idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt index 3083eb729b9..10b77285390 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExlCallFixes.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt @@ -43,8 +43,7 @@ public class RemoveExclExclCallFix(val psiElement: PsiElement) : ExclExclCallFix override fun getText(): String = JetBundle.message("remove.unnecessary.non.null.assertion") override fun isAvailable(project: Project, editor: Editor?, file: PsiFile): Boolean - = super.isAvailable(project, editor, file) && - getExclExclPostfixExpression() != null + = super.isAvailable(project, editor, file) && getExclExclPostfixExpression() != null override fun invoke(project: Project, editor: Editor?, file: PsiFile?) { if (!FileModificationService.getInstance().prepareFileForWrite(file)) return @@ -88,6 +87,9 @@ public class AddExclExclCallFix(val psiElement: PsiElement) : ExclExclCallFix() return sibling } } + else if (psiElement is KtExpression) { + return psiElement + } return null } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java index c453d29d1b7..7bce13519a5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixFactoryForTypeMismatchError.java @@ -97,6 +97,13 @@ public class QuickFixFactoryForTypeMismatchError extends JetIntentionActionsFact actions.add(new CastExpressionFix(expression, expectedType)); } + if (!expectedType.isMarkedNullable() && org.jetbrains.kotlin.types.TypeUtils.isNullableType(expressionType)) { + KotlinType nullableExpected = TypeUtilsKt.makeNullable(expectedType); + if (TypeUtilsKt.isSubtypeOf(expressionType, nullableExpected)) { + actions.add(new AddExclExclCallFix(expression)); + } + } + // Property initializer type mismatch property type: KtProperty property = PsiTreeUtil.getParentOfType(expression, KtProperty.class); if (property != null) { diff --git a/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt new file mode 100644 index 00000000000..6e23a0d48ca --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt @@ -0,0 +1,7 @@ +// "Add non-null asserted (!!) call" "true" +fun test() { + val s: String? = null + other(s) +} + +fun other(s: String) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt.after b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt.after new file mode 100644 index 00000000000..0b4386e127c --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt.after @@ -0,0 +1,7 @@ +// "Add non-null asserted (!!) call" "true" +fun test() { + val s: String? = null + other(s!!) +} + +fun other(s: String) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityDisabledWhenItCannotHelp.kt b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityDisabledWhenItCannotHelp.kt new file mode 100644 index 00000000000..e8322744a06 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityDisabledWhenItCannotHelp.kt @@ -0,0 +1,9 @@ +// "Add non-null asserted (!!) call" "false" +// ACTION: Change parameter 's' type of function 'other' to 'String?' +// ERROR: ype mismatch.
Required:kotlin.Int
Found:kotlin.String?
+fun test() { + val s: String? = "" + other(s) +} + +fun other(s: Int) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt new file mode 100644 index 00000000000..021504f1c8c --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt @@ -0,0 +1,8 @@ +// "Add non-null asserted (!!) call" "true" +interface Some + +fun test(t: T) { + other(t) +} + +fun other(s: Any) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt.after b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt.after new file mode 100644 index 00000000000..92963bcabdd --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt.after @@ -0,0 +1,8 @@ +// "Add non-null asserted (!!) call" "true" +interface Some + +fun test(t: T) { + other(t!!) +} + +fun other(s: Any) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt new file mode 100644 index 00000000000..b4acbcf8806 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt @@ -0,0 +1,14 @@ +// "Add non-null asserted (!!) call" "true" + +interface A +class B: A + +open class C +open class D: C() + +fun test() { + val s: B? = B() + other(s) +} + +fun other(s: A) {} \ No newline at end of file diff --git a/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt.after b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt.after new file mode 100644 index 00000000000..d6bec0e21d7 --- /dev/null +++ b/idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt.after @@ -0,0 +1,14 @@ +// "Add non-null asserted (!!) call" "true" + +interface A +class B: A + +open class C +open class D: C() + +fun test() { + val s: B? = B() + other(s!!) +} + +fun other(s: A) {} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 9b6a16073f0..f34266cf877 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -6161,6 +6161,30 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { doTest(fileName); } + @TestMetadata("addExclExclToRemoveNullability.kt") + public void testAddExclExclToRemoveNullability() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullability.kt"); + doTest(fileName); + } + + @TestMetadata("addExclExclToRemoveNullabilityDisabledWhenItCannotHelp.kt") + public void testAddExclExclToRemoveNullabilityDisabledWhenItCannotHelp() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityDisabledWhenItCannotHelp.kt"); + doTest(fileName); + } + + @TestMetadata("addExclExclToRemoveNullabilityForGeneric.kt") + public void testAddExclExclToRemoveNullabilityForGeneric() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForGeneric.kt"); + doTest(fileName); + } + + @TestMetadata("addExclExclToRemoveNullabilityForSubclass.kt") + public void testAddExclExclToRemoveNullabilityForSubclass() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/typeMismatch/addExclExclToRemoveNullabilityForSubclass.kt"); + doTest(fileName); + } + public void testAllFilesPresentInTypeMismatch() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/typeMismatch"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); }