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 5a7e5ca64ea1..ad7f135a340f 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java @@ -79,7 +79,7 @@ public class ExtractLightMethodObjectHandler { final PsiFile file, @NotNull final PsiCodeFragment fragment, final String methodName) throws PrepareFailedException { - final PsiElement[] elements = fragment.getChildren(); + final PsiElement[] elements = CodeInsightUtil.findStatementsInRange(fragment, 0, fragment.getTextLength()); if (elements.length == 0) { return null; } @@ -96,12 +96,11 @@ public class ExtractLightMethodObjectHandler { CodeInsightUtil.findElementInRange(copy, range.getStartOffset(), range.getEndOffset(), originalContext.getClass()); //todo before this or super, not found etc final PsiElement anchor = RefactoringUtil.getParentStatement(originalAnchor, false); - final PsiElement[] elementsCopy = new PsiElement[elements.length]; final PsiElement container = anchor.getParent(); - elementsCopy[0] = container.addRangeBefore(elements[0], elements[elements.length - 1], anchor); - for (int i = 1; i < elements.length; i++) { - elementsCopy[i] = elementsCopy[i - 1].getNextSibling(); - } + final PsiElement firstElementCopy = container.addRangeBefore(elements[0], elements[elements.length - 1], anchor); + final PsiElement[] elementsCopy = CodeInsightUtil.findStatementsInRange(copy, + firstElementCopy.getTextRange().getStartOffset(), + anchor.getTextRange().getStartOffset()); final int start = elementsCopy[0].getTextRange().getStartOffset(); diff --git a/java/java-tests/testData/refactoring/extractMethodObject4Debugger/InnerClass.java b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/InnerClass.java new file mode 100644 index 000000000000..448724bf0543 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethodObject4Debugger/InnerClass.java @@ -0,0 +1,30 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +class Sample { + + void a() { + System.out.println(""); + } + + class I { + public I(int i) { + } + + void foo() { + bar(); + } + } +} diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java index ea22976efee0..3ef46c33fbb3 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodObject4DebuggerTest.java @@ -112,6 +112,18 @@ public class ExtractMethodObject4DebuggerTest extends LightRefactoringTestCase { " }"); } + public void testInnerClass() throws Exception { + doTest(" new In(2).foo()", "new Test().invoke();", + + "public class Test {\n" + + " public void invoke() {\n" + + " new In(2).foo()\n" + + " }\n" + + " }"); + } + + + @Override protected Sdk getProjectJDK() { return IdeaTestUtil.getMockJdk18();