From f08e9832a66f47cae92330af6c1c71b64441b38c Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Sun, 17 Sep 2017 17:44:51 +0300 Subject: [PATCH] Show warning also if arrays are compared by '!=' #KT-20259 Fixed --- .../ReplaceArrayEqualityOpWithArraysEquals.html | 2 +- .../description.html | 2 +- ...ReplaceArrayEqualityOpWithArraysEqualsIntention.kt | 11 +++++++++-- .../inspectionData/expected.xml | 8 ++++++++ .../replaceArrayEqualityOpWithArraysEquals/test.kt | 1 + .../arrayEXCLEQ.kt | 8 ++++++++ .../arrayEXCLEQ.kt.after | 10 ++++++++++ .../idea/intentions/IntentionTestGenerated.java | 6 ++++++ 8 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt create mode 100644 idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after diff --git a/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html b/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html index 74bf53dda29..f7d5dce04b7 100644 --- a/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html +++ b/idea/resources/inspectionDescriptions/ReplaceArrayEqualityOpWithArraysEquals.html @@ -1,5 +1,5 @@ -This inspection detects '==' operator for arrays that should be replaced with 'Arrays.equals' +This inspection detects '==' or '!=' operator for arrays that should be replaced with 'Arrays.equals' \ No newline at end of file diff --git a/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html b/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html index 4d248a19655..ae679a64594 100644 --- a/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html +++ b/idea/resources/intentionDescriptions/ReplaceArrayEqualityOpWithArraysEqualsIntention/description.html @@ -1,5 +1,5 @@ -This intention replace '==' operator for arrays with 'Arrays.equals' +This intention replace '==' or '!=' operator for arrays with 'Arrays.equals' \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt index 38c95ff7a42..92ee272b2d0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ReplaceArrayEqualityOpWithArraysEqualsIntention.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.createExpressionByPattern import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall class ReplaceArrayEqualityOpWithArraysEqualsInspection : @@ -44,12 +45,18 @@ class ReplaceArrayEqualityOpWithArraysEqualsIntention : SelfTargetingOffsetIndep ktFile.resolveImportReference(FqName("java.util.Arrays")).firstOrNull()?.let { ImportInsertHelper.getInstance(project).importDescriptor(ktFile, it) } - val expression = factory.createExpression("Arrays.equals(${left.text}, ${right.text})") + val template = buildString { + if (element.operationToken == KtTokens.EXCLEQ) append("!") + append("Arrays.equals($0, $1)") + } + val expression = factory.createExpressionByPattern(template, left, right) element.replace(expression) } override fun isApplicableTo(element: KtBinaryExpression): Boolean { - if (element.operationToken != KtTokens.EQEQ) return false + val operationToken = element.operationToken + if (operationToken != KtTokens.EQEQ && operationToken != KtTokens.EXCLEQ) return false + if (operationToken == KtTokens.EXCLEQ) text = "Replace '!=' with 'Arrays.equals'" val right = element.right ?: return false val left = element.left ?: return false val rightResolvedCall = right.getResolvedCall(right.analyze()) ?: return false diff --git a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml index 0bf7675fc66..8a280eed640 100644 --- a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml +++ b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/inspectionData/expected.xml @@ -7,4 +7,12 @@ Replace '==' with 'Arrays.equals' Replace '==' with 'Arrays.equals' + + test.kt + 7 + light_idea_test_case + + Replace '!=' with 'Arrays.equals' + Replace '!=' with 'Arrays.equals' + \ No newline at end of file diff --git a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt index b0a0896a5da..c95b971be8e 100644 --- a/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt +++ b/idea/testData/inspections/replaceArrayEqualityOpWithArraysEquals/test.kt @@ -4,4 +4,5 @@ fun foo() { val c: Any? = null a == b // YES a == c // NO + a != b } \ No newline at end of file diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt new file mode 100644 index 00000000000..945cee99ba2 --- /dev/null +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +// INTENTION_TEXT: Replace '!=' with 'Arrays.equals' +fun foo() { + val a = arrayOf("a", "b", "c") + val b = arrayOf("a", "b", "c") + if (a != b) { + } +} diff --git a/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after new file mode 100644 index 00000000000..3436155d9d3 --- /dev/null +++ b/idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt.after @@ -0,0 +1,10 @@ +import java.util.Arrays + +// WITH_RUNTIME +// INTENTION_TEXT: Replace '!=' with 'Arrays.equals' +fun foo() { + val a = arrayOf("a", "b", "c") + val b = arrayOf("a", "b", "c") + if (!Arrays.equals(a, b)) { + } +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index e2f8d7298b8..904ea194c6a 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -13562,6 +13562,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("arrayEXCLEQ.kt") + public void testArrayEXCLEQ() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/arrayEXCLEQ.kt"); + doTest(fileName); + } + @TestMetadata("primitiveArrayEQEQ.kt") public void testPrimitiveArrayEQEQ() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/replaceArrayEqualityOpWithArraysEquals/primitiveArrayEQEQ.kt");