Intention to replace a = b with b.also { a = it }

^KT-22420 Fixed
This commit is contained in:
Dereck Bridie
2020-09-03 15:11:01 +02:00
committed by Vladimir Dolzhenko
parent e387d56d93
commit 94970e2d1e
15 changed files with 131 additions and 0 deletions
@@ -0,0 +1,4 @@
var x = 5
fun foo() {
<spot>10.also { x = it }</spot>
}
@@ -0,0 +1,4 @@
var x = 5
fun foo() {
<spot>x = 10</spot>
}
@@ -0,0 +1,5 @@
<html>
<body>
This intention converts a <b>variable assignment</b> to a variable assignment expression.
</body>
</html>
@@ -1749,6 +1749,7 @@ convert.to.0.as.1=Convert to ''{0} as {1}''
convert.to.0.unsafecast.1=Convert to ''{0}.unsafeCast<{1}>()''
convert.to.unsafecast.call=Convert to unsafeCast() call
convert.to.array.parameter=Convert to array parameter
convert.to.assignment.expression=Convert assignment to assignment expression
create.kotlin.subclass=Create Kotlin subclass
use.destructuring.declaration=Use destructuring declaration
implement.as.constructor.parameter=Implement as constructor parameter
+5
View File
@@ -585,6 +585,11 @@
<category>Kotlin</category>
</intentionAction>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.ConvertVariableAssignmentToExpressionIntention</className>
<category>Kotlin</category>
</intentionAction>
<intentionAction>
<className>org.jetbrains.kotlin.idea.intentions.MergeIfsIntention</className>
<category>Kotlin</category>
@@ -0,0 +1,29 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.references.KtSimpleReference
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
class ConvertVariableAssignmentToExpressionIntention : SelfTargetingIntention<KtBinaryExpression>(
KtBinaryExpression::class.java,
KotlinBundle.lazyMessage("convert.to.assignment.expression"),
) {
override fun isApplicableTo(element: KtBinaryExpression, caretOffset: Int): Boolean {
if (element.operationToken == KtTokens.EQ) return true
return false
}
override fun applyTo(element: KtBinaryExpression, editor: Editor?) {
val left = element.left ?: return
val right = element.right ?: return
val newElement = KtPsiFactory(element.project).createExpressionByPattern("$0.also { $1 = it }", right, left)
element.replace(newElement)
}
}
@@ -0,0 +1 @@
org.jetbrains.kotlin.idea.intentions.ConvertVariableAssignmentToExpressionIntention
@@ -0,0 +1,8 @@
// WITH_RUNTIME
object X {
var string = "foo"
}
fun main() {
X.string <caret>= "bar"
}
@@ -0,0 +1,8 @@
// WITH_RUNTIME
object X {
var string = "foo"
}
fun main() {
"bar".also { X.string = it }
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
object X {
var string = "foo"
}
var target = "baz"
fun main() {
target <caret>= X.string
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
object X {
var string = "foo"
}
var target = "baz"
fun main() {
X.string.also { target = it }
}
@@ -0,0 +1,5 @@
// IS_APPLICABLE: false
var x = 0
fun main() {
x <caret>== 10
}
@@ -0,0 +1,5 @@
// WITH_RUNTIME
var x = 5
fun foo() {
x <caret>= 10
}
@@ -0,0 +1,5 @@
// WITH_RUNTIME
var x = 5
fun foo() {
10.also { x = it }
}
@@ -8240,6 +8240,39 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
}
}
@TestMetadata("idea/testData/intentions/convertVariableAssignmentToExpression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
public static class ConvertVariableAssignmentToExpression extends AbstractIntentionTest {
private void runTest(String testDataFilePath) throws Exception {
KotlinTestUtils.runTest(this::doTest, this, testDataFilePath);
}
public void testAllFilesPresentInConvertVariableAssignmentToExpression() throws Exception {
KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/intentions/convertVariableAssignmentToExpression"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true);
}
@TestMetadata("complexLhs.kt")
public void testComplexLhs() throws Exception {
runTest("idea/testData/intentions/convertVariableAssignmentToExpression/complexLhs.kt");
}
@TestMetadata("complexRhs.kt")
public void testComplexRhs() throws Exception {
runTest("idea/testData/intentions/convertVariableAssignmentToExpression/complexRhs.kt");
}
@TestMetadata("noAssignment.kt")
public void testNoAssignment() throws Exception {
runTest("idea/testData/intentions/convertVariableAssignmentToExpression/noAssignment.kt");
}
@TestMetadata("simple.kt")
public void testSimple() throws Exception {
runTest("idea/testData/intentions/convertVariableAssignmentToExpression/simple.kt");
}
}
@TestMetadata("idea/testData/intentions/copyConcatenatedStringToClipboard")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)