diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java index 968b537bb71d..c008f7f7a609 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java @@ -92,12 +92,28 @@ public class ExtractLightMethodObjectHandler { final TextRange range = originalContext.getTextRange(); final PsiElement originalAnchor = CodeInsightUtil.findElementInRange(copy, range.getStartOffset(), range.getEndOffset(), originalContext.getClass()); - //todo before this or super, not found etc - final PsiElement anchor = RefactoringUtil.getParentStatement(originalAnchor, false); - if (anchor == null) { + + final PsiClass containingClass = PsiTreeUtil.getParentOfType(originalAnchor, PsiClass.class); + if (containingClass == null) { return null; } - final PsiElement container = anchor.getParent(); + + PsiElement anchor = RefactoringUtil.getParentStatement(originalAnchor, false); + if (anchor == null) { + if (PsiTreeUtil.getParentOfType(originalAnchor, PsiCodeBlock.class) != null) { + anchor = originalAnchor; + } + } + + final PsiElement container; + if (anchor == null) { + container = ((PsiClassInitializer)containingClass.add(elementFactory.createClassInitializer())).getBody(); + anchor = container.getLastChild(); + } + else { + container = anchor.getParent(); + } + final PsiElement firstElementCopy = container.addRangeBefore(elements[0], elements[elements.length - 1], anchor); final PsiElement[] elementsCopy = CodeInsightUtil.findStatementsInRange(copy, firstElementCopy.getTextRange().getStartOffset(), diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnClosingBrace.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnClosingBrace.java new file mode 100644 index 000000000000..48a25567d205 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnClosingBrace.java @@ -0,0 +1,10 @@ +class Sample { + + void a() { + System.out.println(""); + } + + private int foo() { + return 1; + } +} diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnClosingBraceLocalClass.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnClosingBraceLocalClass.java new file mode 100644 index 000000000000..010af145aaca --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnClosingBraceLocalClass.java @@ -0,0 +1,12 @@ +class Sample { + + void a() { + class Local { + + } + } + + private int foo() { + return 1; + } +} diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnEmptyMethod.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnEmptyMethod.java new file mode 100644 index 000000000000..6436369d9d84 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnEmptyMethod.java @@ -0,0 +1,7 @@ +class Sample { + static {} + + int foo() { + return 1; + } +} diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnFieldInitialization.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnFieldInitialization.java new file mode 100644 index 000000000000..e1746e57ed23 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnFieldInitialization.java @@ -0,0 +1,7 @@ +class Sample { + int i = 0; + + int foo() { + return 1; + } +} diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnSuperConstructorCall.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnSuperConstructorCall.java new file mode 100644 index 000000000000..69d6f91a4643 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/OnSuperConstructorCall.java @@ -0,0 +1,9 @@ +class Sample { + public Sample() { + super(); + } + + int foo() { + return 1; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java index af1fee9363dc..d6440fd5de19 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java @@ -214,6 +214,56 @@ public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase { " }", false); } + public void testOnClosingBrace() throws Exception { + doTest(" foo()", "int result = new Test().invoke();", + + "public class Test {\n" + + " public int invoke() {\n" + + " return foo();\n" + + " }\n" + + " }"); + } + + public void testOnClosingBraceLocalClass() throws Exception { + doTest(" foo()", "int result = new Test().invoke();", + + "public class Test {\n" + + " public int invoke() {\n" + + " return foo();\n" + + " }\n" + + " }"); + } + + public void testOnFieldInitialization() throws Exception { + doTest(" foo()", "int result = new Test().invoke();", + + "public class Test {\n" + + " public int invoke() {\n" + + " return foo();\n" + + " }\n" + + " }"); + } + + public void testOnEmptyMethod() throws Exception { + doTest(" foo()", "int result = Test.invoke();", + + "public static class Test {\n" + + " public static int invoke() {\n" + + " return foo();\n" + + " }\n" + + " }"); + } + + public void testOnSuperConstructorCall() throws Exception { + doTest(" foo()", "int result = new Test().invoke();", + + "public class Test {\n" + + " public int invoke() {\n" + + " return foo();\n" + + " }\n" + + " }"); + } + @Override protected Sdk getProjectJDK() { return IdeaTestUtil.getMockJdk18();