diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractKotlinInplaceIntroducer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractKotlinInplaceIntroducer.kt index 1aad63d692b..850aa6460f0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractKotlinInplaceIntroducer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/AbstractKotlinInplaceIntroducer.kt @@ -72,9 +72,9 @@ public abstract class AbstractKotlinInplaceIntroducer( containingFile: PsiFile, declaration: D, marker: RangeMarker, - exprText: String + exprText: String? ): JetExpression? { - if (!declaration.isValid()) return null + if (exprText == null || !declaration.isValid()) return null return containingFile .findElementAt(marker.getStartOffset()) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java index 554cbdaaf61..795417c4154 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceVariable/KotlinIntroduceVariableHandler.java @@ -180,8 +180,7 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { Pass callback = new Pass() { @Override public void pass(OccurrencesChooser.ReplaceChoice replaceChoice) { - boolean replaceOccurrence = - container != expression.getParent() || BindingContextUtilPackage.isUsedAsExpression(expression, bindingContext); + boolean replaceOccurrence = shouldReplaceOccurrence(expression, bindingContext, container); List allReplaces; if (OccurrencesChooser.ReplaceChoice.ALL == replaceChoice) { if (allOccurrences.size() > 1) replaceOccurrence = true; @@ -415,17 +414,21 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { } } } - for (JetExpression replace : allReplaces) { - if (replaceOccurrence && !needBraces) { - replaceExpression(replace); - } - else if (!needBraces) { - PsiElement sibling = PsiTreeUtil.skipSiblingsBackward(replace, PsiWhiteSpace.class); - if (sibling == property) { - replace.getParent().deleteChildRange(property.getNextSibling(), replace); + if (!needBraces) { + for (int i = 0; i < allReplaces.size(); i++) { + JetExpression replace = allReplaces.get(i); + + if (i != 0 ? replaceOccurrence : shouldReplaceOccurrence(replace, bindingContext, commonContainer)) { + replaceExpression(replace); } else { - replace.delete(); + PsiElement sibling = PsiTreeUtil.skipSiblingsBackward(replace, PsiWhiteSpace.class); + if (sibling == property) { + replace.getParent().deleteChildRange(property.getNextSibling(), replace); + } + else { + replace.delete(); + } } } } @@ -515,6 +518,14 @@ public class KotlinIntroduceVariableHandler extends KotlinIntroduceHandlerBase { ); } + private static boolean shouldReplaceOccurrence( + @NotNull JetExpression expression, + @NotNull BindingContext bindingContext, + @Nullable PsiElement container + ) { + return BindingContextUtilPackage.isUsedAsExpression(expression, bindingContext) || container != expression.getParent(); + } + @Nullable private static PsiElement getContainer(PsiElement place) { if (place instanceof JetBlockExpression || place instanceof JetClassBody || diff --git a/idea/testData/refactoring/introduceVariable/FewOccurrences.kt.after b/idea/testData/refactoring/introduceVariable/FewOccurrences.kt.after index b249efa00cd..3ba0cd58248 100644 --- a/idea/testData/refactoring/introduceVariable/FewOccurrences.kt.after +++ b/idea/testData/refactoring/introduceVariable/FewOccurrences.kt.after @@ -1,6 +1,5 @@ fun a() { val i = 1 i - i if (true) i } \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions1.kt b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions1.kt new file mode 100644 index 00000000000..ab077808f58 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions1.kt @@ -0,0 +1,10 @@ +class A { + fun test() = 1 +} + +fun main(args: Array) { + val a = A() + a.test() + + val b = a.test() +} diff --git a/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions1.kt.after b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions1.kt.after new file mode 100644 index 00000000000..0b78b2234b5 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions1.kt.after @@ -0,0 +1,10 @@ +class A { + fun test() = 1 +} + +fun main(args: Array) { + val a = A() + val i = a.test() + + val b = i +} diff --git a/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions2.kt b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions2.kt new file mode 100644 index 00000000000..0fca55b8a35 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions2.kt @@ -0,0 +1,10 @@ +class A { + fun test() = 1 +} + +fun main(args: Array) { + val a = A() + a.test() + + val b = a.test() +} diff --git a/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions2.kt.after b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions2.kt.after new file mode 100644 index 00000000000..0b78b2234b5 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions2.kt.after @@ -0,0 +1,10 @@ +class A { + fun test() = 1 +} + +fun main(args: Array) { + val a = A() + val i = a.test() + + val b = i +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index f02f69505d3..40a98b910cd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -271,6 +271,18 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("UsedAndUnusedExpressions1.kt") + public void testUsedAndUnusedExpressions1() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions1.kt"); + doIntroduceVariableTest(fileName); + } + + @TestMetadata("UsedAndUnusedExpressions2.kt") + public void testUsedAndUnusedExpressions2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/UsedAndUnusedExpressions2.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("WhenAddBlock.kt") public void testWhenAddBlock() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/WhenAddBlock.kt");