From 26bae9e5495270e3a64fa5ec62c49f41c6fdaeee Mon Sep 17 00:00:00 2001 From: Alexandr Suhinin Date: Fri, 7 Apr 2023 12:10:14 +0300 Subject: [PATCH] [extract method] IDEA-317497: search static context until target class only GitOrigin-RevId: 1e5c8e3319a9a45506e0785d4e7912d71f0233c6 --- .../extractMethod/newImpl/ExtractOptionsPipeline.kt | 2 +- .../NonStaticExtractFromStaticInner.java | 8 ++++++++ .../NonStaticExtractFromStaticInner_after.java | 12 ++++++++++++ .../TypeParametersInNonStaticTarget.java | 8 ++++++++ .../TypeParametersInNonStaticTarget_after.java | 12 ++++++++++++ .../ExtractMethodAndDuplicatesInplaceTest.kt | 12 ++++++++++++ 6 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner.java create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner_after.java create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget.java create mode 100644 java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget_after.java diff --git a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractOptionsPipeline.kt b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractOptionsPipeline.kt index b97a3634e209..3cc003a33dc9 100644 --- a/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractOptionsPipeline.kt +++ b/java/java-impl-refactorings/src/com/intellij/refactoring/extractMethod/newImpl/ExtractOptionsPipeline.kt @@ -125,7 +125,7 @@ object ExtractMethodPipeline { if (statement != null && JavaHighlightUtil.isSuperOrThisCall(statement, true, true)) { return extractOptions.copy(isStatic = true) } - val shouldBeStatic = PsiUtil.getEnclosingStaticElement(extractOptions.elements.first(), null) != null + val shouldBeStatic = PsiUtil.getEnclosingStaticElement(extractOptions.elements.first(), extractOptions.targetClass) != null return extractOptions.copy(isStatic = shouldBeStatic) } diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner.java new file mode 100644 index 000000000000..2cb82c2b663c --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner.java @@ -0,0 +1,8 @@ +class Test { + + static class Inner{ + public void get(List list, I i) { + list.get(i); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner_after.java new file mode 100644 index 000000000000..d5fabe1cf50d --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/NonStaticExtractFromStaticInner_after.java @@ -0,0 +1,12 @@ +class Test { + + static class Inner{ + public void get(List list, I i) { + extracted(list, i); + } + + private void extracted(List list, I i) { + list.get(i); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget.java new file mode 100644 index 000000000000..2cb82c2b663c --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget.java @@ -0,0 +1,8 @@ +class Test { + + static class Inner{ + public void get(List list, I i) { + list.get(i); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget_after.java new file mode 100644 index 000000000000..0500fdf8ca5e --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/TypeParametersInNonStaticTarget_after.java @@ -0,0 +1,12 @@ +class Test { + + static class Inner{ + public void get(List list, I i) { + extracted(list, i); + } + + private static void extracted(List list, I i) { + list.get(i); + } + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt index 89804426c764..a6d342519380 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodAndDuplicatesInplaceTest.kt @@ -492,6 +492,18 @@ class ExtractMethodAndDuplicatesInplaceTest: LightJavaCodeInsightTestCase() { doTest() } + fun testTypeParametersInNonStaticTarget(){ + JavaRefactoringSettings.getInstance().EXTRACT_STATIC_METHOD = true + shouldSelectTargetClass("Inner in Test") + doTest() + } + + fun testNonStaticExtractFromStaticInner(){ + shouldSelectTargetClass("Inner in Test") + JavaRefactoringSettings.getInstance().EXTRACT_STATIC_METHOD = false + doTest() + } + fun testRefactoringListener(){ templateTest { configureByFile("$BASE_PATH/${getTestName(false)}.java")