From 9863deb8d96144a846ccfc8ac0f713525b1a57fe Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Mon, 26 Sep 2016 18:58:18 +0200 Subject: [PATCH] introduce functional parameter: exclude only selection range from used parameters check as for functional interfaces the whole code block is treated as selection's parent (IDEA-154299) --- .../introduceField/ElementToWorkOn.java | 2 + .../IntroduceParameterHandler.java | 1 + .../refactoring/introduceParameter/Util.java | 5 +++ ...UsedParametersOutsideSelectedFragment.java | 38 +++++++++++++++++++ ...UsedParametersOutsideSelectedFragment.java | 32 ++++++++++++++++ .../IntroduceFunctionalParameterTest.java | 4 ++ 6 files changed, 82 insertions(+) create mode 100644 java/java-tests/testData/refactoring/introduceFunctionalParameter/afterUsedParametersOutsideSelectedFragment.java create mode 100644 java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeUsedParametersOutsideSelectedFragment.java diff --git a/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java b/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java index fd12b13051c8..64245a0b0917 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceField/ElementToWorkOn.java @@ -23,6 +23,7 @@ import com.intellij.openapi.editor.RangeMarker; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pass; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.util.PsiExpressionTrimRenderer; import com.intellij.psi.util.PsiTreeUtil; @@ -44,6 +45,7 @@ public class ElementToWorkOn { public static final Key PREFIX = Key.create("prefix"); public static final Key SUFFIX = Key.create("suffix"); public static final Key TEXT_RANGE = Key.create("range"); + public static final Key EXPR_RANGE = Key.create("expr_range"); public static final Key REPLACE_NON_PHYSICAL = Key.create("replace_non_physical"); public static final Key OUT_OF_CODE_BLOCK= Key.create("out_of_code_block"); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java index 1dcdbc291086..8cfe95213ebd 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java @@ -679,6 +679,7 @@ public class IntroduceParameterHandler extends IntroduceHandlerBase { expression.putUserData(ElementToWorkOn.PREFIX, prefixText.get()); expression.putUserData(ElementToWorkOn.SUFFIX, suffixText.get()); expression.putUserData(ElementToWorkOn.TEXT_RANGE, marker); + expression.putUserData(ElementToWorkOn.EXPR_RANGE, elements.length == 1 ? elements[0].getTextRange() : null); new Introducer(project, expression, null, editor) .introduceParameter(methodToIntroduceParameter, methodToSearchFor); diff --git a/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java b/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java index 52d492059e3c..571a3d2a2e0e 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/Util.java @@ -25,6 +25,7 @@ package com.intellij.refactoring.introduceParameter; import com.intellij.codeInsight.generation.GenerateMembersUtil; +import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.search.searches.OverridingMethodsSearch; import com.intellij.psi.search.searches.ReferencesSearch; @@ -89,6 +90,10 @@ public class Util { return PsiTreeUtil.getParentOfType(getPhysical(expr), PsiMethod.class); } public static boolean isAncestor(PsiElement ancestor, PsiElement element, boolean strict) { + final TextRange exprRange = ancestor.getUserData(ElementToWorkOn.EXPR_RANGE); + if (exprRange != null) { + return exprRange.contains(element.getTextRange()); + } return PsiTreeUtil.isAncestor(getPhysical(ancestor), getPhysical(element), strict); } diff --git a/java/java-tests/testData/refactoring/introduceFunctionalParameter/afterUsedParametersOutsideSelectedFragment.java b/java/java-tests/testData/refactoring/introduceFunctionalParameter/afterUsedParametersOutsideSelectedFragment.java new file mode 100644 index 000000000000..805ec8c115e5 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceFunctionalParameter/afterUsedParametersOutsideSelectedFragment.java @@ -0,0 +1,38 @@ +import java.util.function.BooleanSupplier; + +class A2 { + void method(MyObject obj, BooleanSupplier anObject) { + obj.method1(); + if (anObject.getAsBoolean()) { + doOtherStaff(); + } + obj.method2(); + } + + { + final MyObject obj = new MyObject(); + method(obj, new BooleanSupplier() { + public boolean getAsBoolean() { + return obj.isCondition1(); + } + }); + } + + private void doOtherStaff() { + + } + + private class MyObject { + public void method1() { + + } + + public boolean isCondition1() { + return true; + } + + public void method2() { + + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeUsedParametersOutsideSelectedFragment.java b/java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeUsedParametersOutsideSelectedFragment.java new file mode 100644 index 000000000000..1673859a3957 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeUsedParametersOutsideSelectedFragment.java @@ -0,0 +1,32 @@ + +class A2 { + void method(MyObject obj) { + obj.method1(); + if (obj.isCondition1()) { + doOtherStaff(); + } + obj.method2(); + } + + { + method(new MyObject()); + } + + private void doOtherStaff() { + + } + + private class MyObject { + public void method1() { + + } + + public boolean isCondition1() { + return true; + } + + public void method2() { + + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFunctionalParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFunctionalParameterTest.java index dbac0ff8100c..53e5ee0a22e8 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFunctionalParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFunctionalParameterTest.java @@ -70,6 +70,10 @@ public class IntroduceFunctionalParameterTest extends LightRefactoringTestCase doTest(); } + public void testUsedParametersOutsideSelectedFragment() throws Exception { + doTest(); + } + @NotNull @Override protected String getTestDataPath() {