From 1b715ab25371b00225c9ee80299dd640c6545a6e Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Wed, 26 Sep 2018 18:08:03 +0900 Subject: [PATCH] "Add non-null asserted (!!) call": Fix for array access expression (KT-27071) ^KT-27071 Fixed --- .../kotlin/idea/quickfix/ExclExclCallFixes.kt | 11 ++++++++-- .../quickfix/addExclExclCall/array.kt | 5 +++++ .../quickfix/addExclExclCall/array.kt.after | 5 +++++ .../quickfix/addExclExclCall/array2.kt | 5 +++++ .../quickfix/addExclExclCall/array2.kt.after | 5 +++++ .../quickfix/addExclExclCall/array3.kt | 5 +++++ .../quickfix/addExclExclCall/array3.kt.after | 5 +++++ .../quickfix/addExclExclCall/array4.kt | 7 +++++++ .../quickfix/addExclExclCall/array4.kt.after | 7 +++++++ .../idea/quickfix/QuickFixTestGenerated.java | 20 +++++++++++++++++++ 10 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 idea/testData/quickfix/addExclExclCall/array.kt create mode 100644 idea/testData/quickfix/addExclExclCall/array.kt.after create mode 100644 idea/testData/quickfix/addExclExclCall/array2.kt create mode 100644 idea/testData/quickfix/addExclExclCall/array2.kt.after create mode 100644 idea/testData/quickfix/addExclExclCall/array3.kt create mode 100644 idea/testData/quickfix/addExclExclCall/array3.kt.after create mode 100644 idea/testData/quickfix/addExclExclCall/array4.kt create mode 100644 idea/testData/quickfix/addExclExclCall/array4.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt index f9e4551c166..8647b5b2b8f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/ExclExclCallFixes.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.diagnostics.Errors.UNSAFE_CALL import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor @@ -114,7 +115,7 @@ class AddExclExclCallFix(psiElement: PsiElement, val checkImplicitReceivers: Boo return (psiElement.prevSibling as? KtExpression).expressionForCall() } return when (psiElement) { - is KtArrayAccessExpression -> psiElement.arrayExpression.expressionForCall() + is KtArrayAccessExpression -> psiElement.expressionForCall() is KtOperationReferenceExpression -> { val parent = psiElement.parent when (parent) { @@ -152,7 +153,13 @@ class AddExclExclCallFix(psiElement: PsiElement, val checkImplicitReceivers: Boo } companion object : KotlinSingleIntentionActionFactory() { - override fun createAction(diagnostic: Diagnostic): IntentionAction = AddExclExclCallFix(diagnostic.psiElement) + override fun createAction(diagnostic: Diagnostic): IntentionAction { + val psiElement = diagnostic.psiElement + if (diagnostic.factory == UNSAFE_CALL && psiElement is KtArrayAccessExpression) { + psiElement.arrayExpression?.let { return AddExclExclCallFix(it) } + } + return AddExclExclCallFix(psiElement) + } } } diff --git a/idea/testData/quickfix/addExclExclCall/array.kt b/idea/testData/quickfix/addExclExclCall/array.kt new file mode 100644 index 00000000000..8fa9b488bd7 --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array.kt @@ -0,0 +1,5 @@ +// "Add non-null asserted (!!) call" "true" + +fun foo(a: Array?): String { + return a[0] +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/array.kt.after b/idea/testData/quickfix/addExclExclCall/array.kt.after new file mode 100644 index 00000000000..5e0883b5c17 --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array.kt.after @@ -0,0 +1,5 @@ +// "Add non-null asserted (!!) call" "true" + +fun foo(a: Array?): String { + return a!![0] +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/array2.kt b/idea/testData/quickfix/addExclExclCall/array2.kt new file mode 100644 index 00000000000..60bc77914d8 --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array2.kt @@ -0,0 +1,5 @@ +// "Add non-null asserted (!!) call" "true" + +fun foo(a: Array): String { + return a[0] +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/array2.kt.after b/idea/testData/quickfix/addExclExclCall/array2.kt.after new file mode 100644 index 00000000000..9df38f9e15a --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array2.kt.after @@ -0,0 +1,5 @@ +// "Add non-null asserted (!!) call" "true" + +fun foo(a: Array): String { + return a[0]!! +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/array3.kt b/idea/testData/quickfix/addExclExclCall/array3.kt new file mode 100644 index 00000000000..165b1e54af0 --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array3.kt @@ -0,0 +1,5 @@ +// "Add non-null asserted (!!) call" "true" + +fun foo(a: Array) { + a[0].length +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/array3.kt.after b/idea/testData/quickfix/addExclExclCall/array3.kt.after new file mode 100644 index 00000000000..17cf7281435 --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array3.kt.after @@ -0,0 +1,5 @@ +// "Add non-null asserted (!!) call" "true" + +fun foo(a: Array) { + a[0]!!.length +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/array4.kt b/idea/testData/quickfix/addExclExclCall/array4.kt new file mode 100644 index 00000000000..3f56bb9c72f --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array4.kt @@ -0,0 +1,7 @@ +// "Add non-null asserted (!!) call" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Array? + +fun foo(a: Array?): String { + return a[0] +} \ No newline at end of file diff --git a/idea/testData/quickfix/addExclExclCall/array4.kt.after b/idea/testData/quickfix/addExclExclCall/array4.kt.after new file mode 100644 index 00000000000..dee96921e51 --- /dev/null +++ b/idea/testData/quickfix/addExclExclCall/array4.kt.after @@ -0,0 +1,7 @@ +// "Add non-null asserted (!!) call" "true" +// SHOULD_BE_AVAILABLE_AFTER_EXECUTION +// ERROR: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Array? + +fun foo(a: Array?): String { + return a[0]!! +} \ 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 fcef2b40dc1..e33ad7fb49a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -516,6 +516,26 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/addExclExclCall"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("array.kt") + public void testArray() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/array.kt"); + } + + @TestMetadata("array2.kt") + public void testArray2() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/array2.kt"); + } + + @TestMetadata("array3.kt") + public void testArray3() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/array3.kt"); + } + + @TestMetadata("array4.kt") + public void testArray4() throws Exception { + runTest("idea/testData/quickfix/addExclExclCall/array4.kt"); + } + @TestMetadata("implicit.kt") public void testImplicit() throws Exception { runTest("idea/testData/quickfix/addExclExclCall/implicit.kt");