diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt index dcb5973510d..8e1871d965d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.kt @@ -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 ) { 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) } } diff --git a/idea/testData/refactoring/introduceVariable/multilineBinaryExpression.kt b/idea/testData/refactoring/introduceVariable/multilineBinaryExpression.kt new file mode 100644 index 00000000000..01c92bdd09e --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineBinaryExpression.kt @@ -0,0 +1,6 @@ +fun foo(i: Int) { } + +fun test() { + foo(1 + + 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/multilineBinaryExpression.kt.after b/idea/testData/refactoring/introduceVariable/multilineBinaryExpression.kt.after new file mode 100644 index 00000000000..85d8e048ced --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineBinaryExpression.kt.after @@ -0,0 +1,7 @@ +fun foo(i: Int) { } + +fun test() { + val i = (1 + + 2) + foo(i) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/multilineBinaryExpressionWithComments.kt b/idea/testData/refactoring/introduceVariable/multilineBinaryExpressionWithComments.kt new file mode 100644 index 00000000000..3ea6345a6b4 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineBinaryExpressionWithComments.kt @@ -0,0 +1,6 @@ +fun foo(i: Int) { } + +fun test() { + foo(1 // abc + /*def*/ + 2) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/multilineBinaryExpressionWithComments.kt.after b/idea/testData/refactoring/introduceVariable/multilineBinaryExpressionWithComments.kt.after new file mode 100644 index 00000000000..8902f9223fd --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineBinaryExpressionWithComments.kt.after @@ -0,0 +1,7 @@ +fun foo(i: Int) { } + +fun test() { + val i = (1 // abc + /*def*/ + 2) + foo(i) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression1.kt b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression1.kt new file mode 100644 index 00000000000..2602d7ce7ff --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression1.kt @@ -0,0 +1,6 @@ +fun foo(i: Int) { } + +fun test() { + foo(1 + + 2 - 3) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression1.kt.after b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression1.kt.after new file mode 100644 index 00000000000..a37b79fd318 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression1.kt.after @@ -0,0 +1,7 @@ +fun foo(i: Int) { } + +fun test() { + val i = (1 + + 2 - 3) + foo(i) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression2.kt b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression2.kt new file mode 100644 index 00000000000..3808a0a0a50 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression2.kt @@ -0,0 +1,6 @@ +fun foo(i: Int) { } + +fun test() { + foo(1 + 2 + - 3) +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression2.kt.after b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression2.kt.after new file mode 100644 index 00000000000..f038f08631a --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/multilineNestedBinaryExpression2.kt.after @@ -0,0 +1,7 @@ +fun foo(i: Int) { } + +fun test() { + val i = (1 + 2 + - 3) + foo(i) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java index 14b4203c284..16ec371ae1e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/ExtractionTestGenerated.java @@ -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");