From 45c5c2163f82c2dfe0a05993625fdf7870f7fdc9 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 7 Apr 2015 18:33:49 +0200 Subject: [PATCH] extract functional parameter: ensure final inside anonymous, no additional qualifier (IDEA-138895) --- .../extractMethod/ExtractMethodProcessor.java | 5 ++--- .../introduceParameter/IntroduceParameterHandler.java | 9 +++++++++ .../afterInsideAnonymous.java | 10 ++++++++++ .../beforeInsideAnonymous.java | 10 ++++++++++ .../refactoring/IntroduceFunctionalParameterTest.java | 4 ++++ 5 files changed, 35 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/refactoring/introduceFunctionalParameter/afterInsideAnonymous.java create mode 100644 java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeInsideAnonymous.java diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java index 82aa58e8535e..987e7157303c 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -47,7 +47,6 @@ import com.intellij.openapi.util.*; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.wm.WindowManager; -import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; import com.intellij.psi.codeStyle.*; import com.intellij.psi.controlFlow.ControlFlowUtil; @@ -861,7 +860,7 @@ public class ExtractMethodProcessor implements MatchProvider { final PsiStatement exitStatementCopy = prepareMethodBody(newMethod, true); if (myExpression == null) { - if (myNeedChangeContext) { + if (myNeedChangeContext && isNeedToChangeCallContext()) { for (PsiElement element : myElements) { ChangeContextUtil.encodeContextInfo(element, false); } @@ -1387,7 +1386,7 @@ public class ExtractMethodProcessor implements MatchProvider { else { skipInstanceQualifier = instanceQualifier == null || instanceQualifier instanceof PsiThisExpression; if (skipInstanceQualifier) { - if (myNeedChangeContext) { + if (isNeedToChangeCallContext() && myNeedChangeContext) { boolean needsThisQualifier = false; PsiElement parent = myCodeFragmentMember; while (!myTargetClass.equals(parent)) { 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 7a6fe2485342..5435ec3e5489 100644 --- a/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/introduceParameter/IntroduceParameterHandler.java @@ -437,6 +437,10 @@ public class IntroduceParameterHandler extends IntroduceHandlerBase { } boolean mustBeFinal = false; + if (myExpr != null) { + final PsiElement parent = myExpr.getUserData(ElementToWorkOn.PARENT); + mustBeFinal = parent != null && PsiTreeUtil.getParentOfType(parent, PsiClass.class, PsiMethod.class) != method; + } for (PsiExpression occurrence : occurences) { if (PsiTreeUtil.getParentOfType(occurrence, PsiClass.class, PsiMethod.class) != method) { mustBeFinal = true; @@ -705,6 +709,11 @@ public class IntroduceParameterHandler extends IntroduceHandlerBase { return new MyAbstractExtractDialog(); } + @Override + protected boolean isNeedToChangeCallContext() { + return false; + } + public void setMethodName(String methodName) { myMethodName = methodName; } diff --git a/java/java-tests/testData/refactoring/introduceFunctionalParameter/afterInsideAnonymous.java b/java/java-tests/testData/refactoring/introduceFunctionalParameter/afterInsideAnonymous.java new file mode 100644 index 000000000000..e7371e9211a1 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceFunctionalParameter/afterInsideAnonymous.java @@ -0,0 +1,10 @@ +class Test { + void foo(final Runnable anObject) { + Runnable c = new Runnable() { + @Override + public void run() { + anObject.run(); + } + }; + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeInsideAnonymous.java b/java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeInsideAnonymous.java new file mode 100644 index 000000000000..89fbc1df97cc --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceFunctionalParameter/beforeInsideAnonymous.java @@ -0,0 +1,10 @@ +class Test { + void foo() { + Runnable c = new Runnable() { + @Override + public void run() { + System.out.println(); + } + }; + } +} \ 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 2f9702d095e1..7c0709372700 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFunctionalParameterTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceFunctionalParameterTest.java @@ -57,6 +57,10 @@ public class IntroduceFunctionalParameterTest extends LightRefactoringTestCase doTest(); } + public void testInsideAnonymous() throws Exception { + doTest(); + } + @NotNull @Override protected String getTestDataPath() {