From 41d1cf60836f47fafb09f9e95ecb311593805255 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 24 Sep 2015 16:54:32 +0200 Subject: [PATCH] check return type of contains() and compareTo() --- .../inspections/OperatorModifierInspection.kt | 16 +++++++++++++--- .../migration/operatorModifier/containsInt.kt | 7 +++++++ .../idea/quickfix/QuickFixTestGenerated.java | 6 ++++++ 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 idea/testData/quickfix/migration/operatorModifier/containsInt.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt index f47271a413a..546b80d1199 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/OperatorModifierInspection.kt @@ -19,6 +19,8 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.codeInspection.* import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementVisitor +import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.lexer.JetModifierKeywordToken import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.JetModifierListOwner @@ -51,9 +53,9 @@ public class OperatorModifierInspection : AbstractKotlinInspection(), CleanupLoc return true } if (arity == 1 && (name in OperatorConventions.BINARY_OPERATION_NAMES.values() || - name in OperatorConventions.ASSIGNMENT_OPERATIONS.values () || - name == OperatorConventions.CONTAINS || - name == OperatorConventions.COMPARE_TO)) { + name in OperatorConventions.ASSIGNMENT_OPERATIONS.values () || + (name == OperatorConventions.CONTAINS && isBooleanReturnType()) || + (name == OperatorConventions.COMPARE_TO && isIntReturnType()))) { return true } if (name == OperatorConventions.INVOKE) { @@ -67,6 +69,14 @@ public class OperatorModifierInspection : AbstractKotlinInspection(), CleanupLoc } return false } + + private fun JetNamedFunction.isIntReturnType(): Boolean { + return KotlinBuiltIns.isInt(analyze().getType(this) ?: return false) + } + + private fun JetNamedFunction.isBooleanReturnType(): Boolean { + return KotlinBuiltIns.isBoolean(analyze().getType(this) ?: return false) + } } class AddModifierLocalQuickFix(val modifier: JetModifierKeywordToken) : LocalQuickFix { diff --git a/idea/testData/quickfix/migration/operatorModifier/containsInt.kt b/idea/testData/quickfix/migration/operatorModifier/containsInt.kt new file mode 100644 index 00000000000..8d660c643b3 --- /dev/null +++ b/idea/testData/quickfix/migration/operatorModifier/containsInt.kt @@ -0,0 +1,7 @@ +// "Add 'operator' modifier" "false" +// ACTION: Convert member to extension +// ACTION: Convert to block body +// ACTION: Remove explicit type specification +class A { + fun contains(other: A): Int = -1 +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 576926bc968..2509da4ed6c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -4195,6 +4195,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/migration/operatorModifier"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); } + @TestMetadata("containsInt.kt") + public void testContainsInt() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/operatorModifier/containsInt.kt"); + doTest(fileName); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/migration/operatorModifier/simple.kt");