Introduce Variable: Parenthesize binary expressions if operation references starts with a new line

#KT-3933 Fixed
This commit is contained in:
Alexey Sedunov
2015-12-08 16:38:19 +03:00
parent ffc8b6fd89
commit 1824f10f07
10 changed files with 87 additions and 2 deletions
@@ -132,6 +132,13 @@ object KotlinIntroduceVariableHandler : KotlinIntroduceHandlerBase() {
return result
}
private fun KtExpression.mustBeParenthesizedInInitializerPosition(): Boolean {
if (this !is KtBinaryExpression) return false
if (left?.mustBeParenthesizedInInitializerPosition() ?: false) return true
return PsiChildRange(left, operationReference).any { (it is PsiWhiteSpace) && it.textContains('\n') }
}
private fun runRefactoring (
expression: KtExpression,
commonContainer: PsiElement,
@@ -139,11 +146,13 @@ object KotlinIntroduceVariableHandler : KotlinIntroduceHandlerBase() {
allReplaces: List<KtExpression>
) {
val initializer = (expression as? KtParenthesizedExpression)?.expression ?: expression
val initializerText = if (initializer.mustBeParenthesizedInInitializerPosition()) "(${initializer.text})" else initializer.text
var property: KtDeclaration = if (componentFunctions.isNotEmpty()) {
buildString {
componentFunctions.indices.joinTo(this, prefix = "val (", postfix = ")") { nameSuggestions[it].first() }
append(" = ")
append(initializer.text)
append(initializerText)
}.let { psiFactory.createDestructuringDeclaration(it) }
}
else {
@@ -155,7 +164,7 @@ object KotlinIntroduceVariableHandler : KotlinIntroduceHandlerBase() {
append(": ").append(IdeDescriptorRenderers.SOURCE_CODE.renderType(typeToRender))
}
append(" = ")
append(initializer.text)
append(initializerText)
}.let { psiFactory.createProperty(it) }
}
@@ -0,0 +1,6 @@
fun foo(i: Int) { }
fun test() {
foo(<selection>1
+ 2</selection>)
}
@@ -0,0 +1,7 @@
fun foo(i: Int) { }
fun test() {
val i = (1
+ 2)
foo(i)
}
@@ -0,0 +1,6 @@
fun foo(i: Int) { }
fun test() {
foo(<selection>1 // abc
/*def*/ + 2</selection>)
}
@@ -0,0 +1,7 @@
fun foo(i: Int) { }
fun test() {
val i = (1 // abc
/*def*/ + 2)
foo(i)
}
@@ -0,0 +1,6 @@
fun foo(i: Int) { }
fun test() {
foo(<selection>1
+ 2 - 3</selection>)
}
@@ -0,0 +1,7 @@
fun foo(i: Int) { }
fun test() {
val i = (1
+ 2 - 3)
foo(i)
}
@@ -0,0 +1,6 @@
fun foo(i: Int) { }
fun test() {
foo(<selection>1 + 2
- 3</selection>)
}
@@ -0,0 +1,7 @@
fun foo(i: Int) { }
fun test() {
val i = (1 + 2
- 3)
foo(i)
}
@@ -235,6 +235,30 @@ public class ExtractionTestGenerated extends AbstractExtractionTest {
doIntroduceVariableTest(fileName);
}
@TestMetadata("multilineBinaryExpression.kt")
public void testMultilineBinaryExpression() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/multilineBinaryExpression.kt");
doIntroduceVariableTest(fileName);
}
@TestMetadata("multilineBinaryExpressionWithComments.kt")
public void testMultilineBinaryExpressionWithComments() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/multilineBinaryExpressionWithComments.kt");
doIntroduceVariableTest(fileName);
}
@TestMetadata("multilineNestedBinaryExpression1.kt")
public void testMultilineNestedBinaryExpression1() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression1.kt");
doIntroduceVariableTest(fileName);
}
@TestMetadata("multilineNestedBinaryExpression2.kt")
public void testMultilineNestedBinaryExpression2() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression2.kt");
doIntroduceVariableTest(fileName);
}
@TestMetadata("NameSuggestionBug1.kt")
public void testNameSuggestionBug1() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/NameSuggestionBug1.kt");