diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java index c94d67efe344..fd8be70e6759 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/JavaReplaceHandler.java @@ -127,18 +127,18 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { return getSymbolReplacementTarget(el) != null; } - @SuppressWarnings({"ConstantConditions"}) - private void handleModifierList(final PsiElement el, final PsiElement replacement) throws IncorrectOperationException { - // We want to copy all comments, including doc comments and modifier lists + @SuppressWarnings("ConstantConditions") + private void copyUnmatchedElements(final PsiElement original, final PsiElement replacement) { + // We want to copy all comments, including doc comments, modifier lists and method bodies // that are present in matched nodes but not present in search/replace Map newNameToSearchPatternNameMap = myContext.getNewName2PatternNameMap(); - Map originalNamedElements = Collector.collectNamedElements(el); + Map originalNamedElements = Collector.collectNamedElements(original); Map replacedNamedElements = Collector.collectNamedElements(replacement); if (originalNamedElements.size() == 0 && replacedNamedElements.size() == 0) { - Replacer.handleComments(el, replacement, myContext); + Replacer.handleComments(original, replacement, myContext); return; } @@ -149,7 +149,7 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { PsiNamedElement replacementNamedElement = replacedNamedElements.get(name); String key = newNameToSearchPatternNameMap.get(name); if (key == null) key = name; - PsiNamedElement searchNamedElement = searchedNamedElements.get(key); + PsiNamedElement searchedNamedElement = searchedNamedElements.get(key); if (replacementNamedElement == null && originalNamedElements.size() == 1 && replacedNamedElements.size() == 1) { replacementNamedElement = replacedNamedElements.entrySet().iterator().next().getValue(); @@ -170,7 +170,7 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { } } - if (replacementNamedElement != null && searchNamedElement != null) { + if (replacementNamedElement != null && searchedNamedElement != null) { Replacer.handleComments(originalNamedElement, replacementNamedElement, myContext); } @@ -191,8 +191,8 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { ) { PsiModifierList modifierList = ((PsiModifierListOwner)originalNamedElements.get(name)).getModifierList(); - if (searchNamedElement instanceof PsiModifierListOwner) { - PsiModifierList modifierListOfSearchedElement = ((PsiModifierListOwner)searchNamedElement).getModifierList(); + if (searchedNamedElement instanceof PsiModifierListOwner) { + PsiModifierList modifierListOfSearchedElement = ((PsiModifierListOwner)searchedNamedElement).getModifierList(); final PsiModifierListOwner modifierListOwner = ((PsiModifierListOwner)replacementNamedElement); PsiModifierList modifierListOfReplacement = modifierListOwner.getModifierList(); @@ -215,6 +215,18 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { } } } + + if (originalNamedElement instanceof PsiMethod && + searchedNamedElement instanceof PsiMethod && + replacementNamedElement instanceof PsiMethod) { + final PsiMethod searchedMethod = (PsiMethod)searchedNamedElement; + final PsiMethod replacementMethod = (PsiMethod)replacementNamedElement; + if (searchedMethod.getBody() == null && replacementMethod.getBody() == null) { + final PsiMethod originalMethod = (PsiMethod)originalNamedElement; + final PsiCodeBlock originalBody = originalMethod.getBody(); + replacementMethod.add(originalBody); + } + } } } @@ -267,12 +279,12 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { if (listContext) { if (statements.length > 1) { final PsiElement replacement = elementParent.addRangeBefore(statements[0], statements[statements.length - 1], elementToReplace); - handleModifierList(elementToReplace, replacement); + copyUnmatchedElements(elementToReplace, replacement); } else if (statements.length == 1) { PsiElement replacement = getMatchExpr(statements[0], elementToReplace); - handleModifierList(elementToReplace, replacement); + copyUnmatchedElements(elementToReplace, replacement); replacement = handleSymbolReplacement(replacement, elementToReplace); if (replacement instanceof PsiTryStatement) { @@ -337,7 +349,7 @@ public class JavaReplaceHandler extends StructuralReplaceHandler { } else { // preserve comments - handleModifierList(elementToReplace, replacement); + copyUnmatchedElements(elementToReplace, replacement); if (replacement instanceof PsiClass) { final PsiStatement[] searchStatements = getCodeBlock().getStatements(); diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java index d00a252e400c..ffb67bb2bda3 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralReplaceTest.java @@ -2389,4 +2389,19 @@ public class StructuralReplaceTest extends StructuralReplaceTestCase { options.clearVariableDefinitions(); } + + public void testMethodContentReplacement() { + final String in = "class A extends TestCase {\n" + + " void testOne() {\n" + + " System.out.println();\n" + + " }\n" + + "}\n"; + final String what = "class '_A { void '_b:[regex( test.* )](); }"; + final String by = "class $A$ {\n @java.lang.Override void $b$();\n}"; + assertEquals("class A extends TestCase {\n" + + " @Override void testOne(){\n" + + " System.out.println();\n" + + " }\n" + + "}\n", replacer.testReplace(in, what, by, options)); + } } \ No newline at end of file