diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt index 95086e8bd9d..05393d4d05b 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/intentions/OperatorToFunctionIntention.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.KtNodeTypes import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze @@ -58,7 +59,8 @@ class OperatorToFunctionIntention : SelfTargetingIntention(KtExpre val opRef = element.operationReference if (!opRef.textRange.containsOffset(caretOffset)) return false return when (opRef.getReferencedNameElementType()) { - KtTokens.PLUS, KtTokens.MINUS, KtTokens.MUL, KtTokens.DIV, KtTokens.PERC, KtTokens.RANGE, KtTokens.IN_KEYWORD, KtTokens.NOT_IN, KtTokens.PLUSEQ, KtTokens.MINUSEQ, KtTokens.MULTEQ, KtTokens.DIVEQ, KtTokens.PERCEQ, KtTokens.EQEQ, KtTokens.EXCLEQ, KtTokens.GT, KtTokens.LT, KtTokens.GTEQ, KtTokens.LTEQ -> true + KtTokens.PLUS, KtTokens.MINUS, KtTokens.MUL, KtTokens.DIV, KtTokens.PERC, KtTokens.RANGE, KtTokens.IN_KEYWORD, KtTokens.NOT_IN, KtTokens.PLUSEQ, KtTokens.MINUSEQ, KtTokens.MULTEQ, KtTokens.DIVEQ, KtTokens.PERCEQ, KtTokens.GT, KtTokens.LT, KtTokens.GTEQ, KtTokens.LTEQ -> true + KtTokens.EQEQ, KtTokens.EXCLEQ -> listOf(element.left, element.right).none { it?.node?.elementType == KtNodeTypes.NULL } KtTokens.EQ -> element.left is KtArrayAccessExpression else -> false } diff --git a/idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInLeftSide.kt b/idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInLeftSide.kt new file mode 100644 index 00000000000..fc09cd567c8 --- /dev/null +++ b/idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInLeftSide.kt @@ -0,0 +1,6 @@ +// IS_APPLICABLE: false +fun test(x: String?) { + if (null != x) { + x.length + } +} diff --git a/idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInRightSide.kt b/idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInRightSide.kt new file mode 100644 index 00000000000..170f27c5d99 --- /dev/null +++ b/idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInRightSide.kt @@ -0,0 +1,6 @@ +// IS_APPLICABLE: false +fun test(x: String?) { + if (x != null) { + x.length + } +} diff --git a/idea/testData/intentions/operatorToFunction/binaryEqEqNullInLeftSide.kt b/idea/testData/intentions/operatorToFunction/binaryEqEqNullInLeftSide.kt new file mode 100644 index 00000000000..bf799f9bab0 --- /dev/null +++ b/idea/testData/intentions/operatorToFunction/binaryEqEqNullInLeftSide.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun test(x: String?) { + null == x +} diff --git a/idea/testData/intentions/operatorToFunction/binaryEqEqNullInRightSide.kt b/idea/testData/intentions/operatorToFunction/binaryEqEqNullInRightSide.kt new file mode 100644 index 00000000000..fb5359fae81 --- /dev/null +++ b/idea/testData/intentions/operatorToFunction/binaryEqEqNullInRightSide.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +fun test(x: String?) { + x == null +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 2d62f443406..e44682192b0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -11807,6 +11807,30 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("binaryEqEqNotNullInLeftSide.kt") + public void testBinaryEqEqNotNullInLeftSide() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInLeftSide.kt"); + doTest(fileName); + } + + @TestMetadata("binaryEqEqNotNullInRightSide.kt") + public void testBinaryEqEqNotNullInRightSide() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/operatorToFunction/binaryEqEqNotNullInRightSide.kt"); + doTest(fileName); + } + + @TestMetadata("binaryEqEqNullInLeftSide.kt") + public void testBinaryEqEqNullInLeftSide() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/operatorToFunction/binaryEqEqNullInLeftSide.kt"); + doTest(fileName); + } + + @TestMetadata("binaryEqEqNullInRightSide.kt") + public void testBinaryEqEqNullInRightSide() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/operatorToFunction/binaryEqEqNullInRightSide.kt"); + doTest(fileName); + } + @TestMetadata("binaryEqEqNullable.kt") public void testBinaryEqEqNullable() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/operatorToFunction/binaryEqEqNullable.kt");