Revert "Replace with ordinary assignment: do not suggest when operator is augmented assignment operator function"

This reverts commit 73e319ca
This commit is contained in:
Yan Zhulanow
2020-10-24 00:21:03 +09:00
parent 7fccd0153b
commit 383190f25e
9 changed files with 7 additions and 65 deletions
@@ -8,23 +8,21 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.codeInsight.intention.LowPriorityAction
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.psi.KtNameReferenceExpression
import org.jetbrains.kotlin.psi.KtPsiFactory
import org.jetbrains.kotlin.psi.createExpressionByPattern
class ReplaceWithOrdinaryAssignmentIntention : SelfTargetingIntention<KtBinaryExpression>( class ReplaceWithOrdinaryAssignmentIntention : SelfTargetingIntention<KtBinaryExpression>(
KtBinaryExpression::class.java, KtBinaryExpression::class.java,
KotlinBundle.lazyMessage("replace.with.ordinary.assignment") KotlinBundle.lazyMessage("replace.with.ordinary.assignment")
), LowPriorityAction { ), LowPriorityAction {
override fun isApplicableTo(element: KtBinaryExpression, caretOffset: Int): Boolean { override fun isApplicableTo(element: KtBinaryExpression, caretOffset: Int): Boolean {
val operationReference = element.operationReference
if (!operationReference.textRange.containsOffset(caretOffset)) return false
if (element.operationToken !in KtTokens.AUGMENTED_ASSIGNMENTS) return false if (element.operationToken !in KtTokens.AUGMENTED_ASSIGNMENTS) return false
val left = element.left ?: return false if (element.left !is KtNameReferenceExpression) return false
if ((left.safeAs<KtQualifiedExpression>()?.selectorExpression ?: left) !is KtNameReferenceExpression) return false
if (element.right == null) return false if (element.right == null) return false
return operationReference.mainReference.resolve().safeAs<KtFunction>()?.name?.endsWith("Assign") != true return element.operationReference.textRange.containsOffset(caretOffset)
} }
override fun applyTo(element: KtBinaryExpression, editor: Editor?) { override fun applyTo(element: KtBinaryExpression, editor: Editor?) {
@@ -1,7 +0,0 @@
// IS_APPLICABLE: false
operator fun Int.minusAssign(element: Int) {}
fun test() {
val x = 1
x <caret>-= 9
}
@@ -1,6 +0,0 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
fun main() {
val mutableList = mutableListOf(4, 5, 6, 7, 8)
mutableList <caret>+= 9
}
@@ -1,7 +0,0 @@
// IS_APPLICABLE: false
operator fun Int.plusAssign(element: Int) {}
fun test() {
val x = 1
x <caret>+= 9
}
@@ -1,8 +0,0 @@
class Foo {
var x: Int = 1
}
fun main() {
val foo = Foo()
foo.x <caret>+= 1
}
@@ -1,8 +0,0 @@
class Foo {
var x: Int = 1
}
fun main() {
val foo = Foo()
foo.x = foo.x + 1
}
-1
View File
@@ -18,7 +18,6 @@ org.jetbrains.kotlin.idea.intentions.ConvertPropertyInitializerToGetterIntention
org.jetbrains.kotlin.idea.intentions.CreateKotlinSubClassIntention org.jetbrains.kotlin.idea.intentions.CreateKotlinSubClassIntention
org.jetbrains.kotlin.idea.intentions.MoveMemberToCompanionObjectIntention org.jetbrains.kotlin.idea.intentions.MoveMemberToCompanionObjectIntention
org.jetbrains.kotlin.idea.intentions.MovePropertyToConstructorIntention org.jetbrains.kotlin.idea.intentions.MovePropertyToConstructorIntention
org.jetbrains.kotlin.idea.intentions.ReplaceWithOrdinaryAssignmentIntention
org.jetbrains.kotlin.idea.intentions.SpecifyTypeExplicitlyIntention org.jetbrains.kotlin.idea.intentions.SpecifyTypeExplicitlyIntention
org.jetbrains.kotlin.idea.quickfix.AddAnnotationTargetFix org.jetbrains.kotlin.idea.quickfix.AddAnnotationTargetFix
org.jetbrains.kotlin.idea.quickfix.AddExclExclCallFix org.jetbrains.kotlin.idea.quickfix.AddExclExclCallFix
@@ -1,6 +1,7 @@
// "Change 'list' to val" "false" // "Change 'list' to val" "false"
// ACTION: Replace overloaded operator with function call // ACTION: Replace overloaded operator with function call
// ACTION: Replace with 'plusAssign()' call // ACTION: Replace with 'plusAssign()' call
// ACTION: Replace with ordinary assignment
// ERROR: Assignment operators ambiguity: <br>public operator fun <T> Collection<Int>.plus(element: Int): List<Int> defined in kotlin.collections<br>public inline operator fun <T> MutableCollection<in Int>.plusAssign(element: Int): Unit defined in kotlin.collections // ERROR: Assignment operators ambiguity: <br>public operator fun <T> Collection<Int>.plus(element: Int): List<Int> defined in kotlin.collections<br>public inline operator fun <T> MutableCollection<in Int>.plusAssign(element: Int): Unit defined in kotlin.collections
// WITH_RUNTIME // WITH_RUNTIME
@@ -15607,16 +15607,6 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/complexRightExpression.kt"); runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/complexRightExpression.kt");
} }
@TestMetadata("minusAssignOperatorFun.kt")
public void testMinusAssignOperatorFun() throws Exception {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/minusAssignOperatorFun.kt");
}
@TestMetadata("mutableList.kt")
public void testMutableList() throws Exception {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/mutableList.kt");
}
@TestMetadata("nonAssignmentExpression.kt") @TestMetadata("nonAssignmentExpression.kt")
public void testNonAssignmentExpression() throws Exception { public void testNonAssignmentExpression() throws Exception {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/nonAssignmentExpression.kt"); runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/nonAssignmentExpression.kt");
@@ -15627,16 +15617,6 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/nonAugmentedAssign.kt"); runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/nonAugmentedAssign.kt");
} }
@TestMetadata("plusAssignOperatorFun.kt")
public void testPlusAssignOperatorFun() throws Exception {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/plusAssignOperatorFun.kt");
}
@TestMetadata("qualifiedExpression.kt")
public void testQualifiedExpression() throws Exception {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/qualifiedExpression.kt");
}
@TestMetadata("simple.kt") @TestMetadata("simple.kt")
public void testSimple() throws Exception { public void testSimple() throws Exception {
runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/simple.kt"); runTest("idea/testData/intentions/replaceWithOrdinaryAssignment/simple.kt");