From 17f92bdc32cc0285deb97d74beb1e7ae5933fba7 Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Mon, 19 Dec 2016 15:51:56 +0100 Subject: [PATCH] extract method: don't mark final if used in anonymous but effectively final in java 8 (IDEA-165642) --- .../extractMethod/ExtractMethodProcessor.java | 2 +- ...metersFinalDueToUsagesInsideAnonymous.java | 20 ++++++++++++++ ...FinalDueToUsagesInsideAnonymous_after.java | 27 +++++++++++++++++++ .../refactoring/ExtractMethodTest.java | 4 +++ 4 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous_after.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 a82b31f8615c..3bea44ff6101 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ExtractMethodProcessor.java @@ -1169,7 +1169,7 @@ public class ExtractMethodProcessor implements MatchProvider { } }); } - else { + else if (!PsiUtil.isLanguageLevel8OrHigher(method)){ method.accept(new JavaRecursiveElementVisitor() { @Override public void visitReferenceExpression(PsiReferenceExpression expression) { final PsiElement resolved = expression.resolve(); diff --git a/java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous.java b/java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous.java new file mode 100644 index 000000000000..20edcc5e6b05 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous.java @@ -0,0 +1,20 @@ +class Box { + private void test(String str1, String str2) { + Data data = new Data() { + @Override + public String getA() { + return str1; + } + @Override + public String getB() { + return str2; + } + }; + System.out.println(data); + } + + static interface Data { + String getA(); + String getB(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous_after.java b/java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous_after.java new file mode 100644 index 000000000000..86a55fec2408 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DontMakeParametersFinalDueToUsagesInsideAnonymous_after.java @@ -0,0 +1,27 @@ +import org.jetbrains.annotations.NotNull; + +class Box { + private void test(String str1, String str2) { + Data data = newMethod(str1, str2); + System.out.println(data); + } + + @NotNull + private Data newMethod(String str1, String str2) { + return new Data() { + @Override + public String getA() { + return str1; + } + @Override + public String getB() { + return str2; + } + }; + } + + static interface Data { + String getA(); + String getB(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 1f174efff7be..edc560cb3e79 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -904,6 +904,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { checkResultByFile(BASE_PATH + getTestName(false) + "_after.java"); } + public void testDontMakeParametersFinalDueToUsagesInsideAnonymous() throws Exception { + doTest(); + } + private void doTestDisabledParam() throws PrepareFailedException { final CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()); settings.ELSE_ON_NEW_LINE = true;