diff --git a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java index 3cea9619e270..00bb80e15cd1 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPullUp/PullUpHelper.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -61,6 +61,7 @@ import com.intellij.usageView.UsageViewUtil; import com.intellij.util.IncorrectOperationException; import com.intellij.util.Query; import com.intellij.util.VisibilityUtil; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -75,12 +76,10 @@ public class PullUpHelper extends BaseRefactoringProcessor{ private final boolean myIsTargetInterface; private final MemberInfo[] myMembersToMove; private final DocCommentPolicy myJavaDocPolicy; - private HashSet myMembersAfterMove = null; + private Set myMembersAfterMove = null; private final PsiManager myManager; - - public PullUpHelper(PsiClass sourceClass, PsiClass targetSuperClass, MemberInfo[] membersToMove, - DocCommentPolicy javaDocPolicy) { + public PullUpHelper(PsiClass sourceClass, PsiClass targetSuperClass, MemberInfo[] membersToMove, DocCommentPolicy javaDocPolicy) { super(sourceClass.getProject()); mySourceClass = sourceClass; myTargetSuperClass = targetSuperClass; @@ -161,10 +160,9 @@ public class PullUpHelper extends BaseRefactoringProcessor{ return RefactoringBundle.message("pullUp.command", UsageViewUtil.getDescriptiveName(mySourceClass)); } - public void moveMembersToBase() - throws IncorrectOperationException { - final HashSet movedMembers = new HashSet(); - myMembersAfterMove = new HashSet(); + public void moveMembersToBase() throws IncorrectOperationException { + final Set movedMembers = ContainerUtil.newHashSet(); + myMembersAfterMove = ContainerUtil.newHashSet(); // build aux sets for (MemberInfo info : myMembersToMove) { @@ -224,10 +222,10 @@ public class PullUpHelper extends BaseRefactoringProcessor{ if (method.findDeepestSuperMethods().length == 0) { deleteOverrideAnnotationIfFound(methodCopy); } - final boolean isOriginalMethodAbstract = method.hasModifierProperty(PsiModifier.ABSTRACT); + final boolean isOriginalMethodAbstract = method.hasModifierProperty(PsiModifier.ABSTRACT) || PsiUtil.isExtensionMethod(method); if (myIsTargetInterface || info.isToAbstract()) { ChangeContextUtil.clearContextInfo(method); - RefactoringUtil.abstractizeMethod(myTargetSuperClass, methodCopy); + RefactoringUtil.makeMethodAbstract(myTargetSuperClass, methodCopy); RefactoringUtil.replaceMovedMemberTypeParameters(methodCopy, PsiUtil.typeParametersIterable(mySourceClass), substitutor, elementFactory); myJavaDocPolicy.processCopiedJavaDoc(methodCopy.getDocComment(), method.getDocComment(), isOriginalMethodAbstract); diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 05662cdcaaeb..da7a834e9230 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2012 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. @@ -552,7 +552,6 @@ public class RefactoringUtil { } private static void removeFinalParameters(PsiMethod method) throws IncorrectOperationException { - // Remove final parameters PsiParameterList paramList = method.getParameterList(); PsiParameter[] params = paramList.getParameters(); @@ -566,7 +565,6 @@ public class RefactoringUtil { public static PsiElement getAnchorElementForMultipleExpressions(@NotNull PsiExpression[] occurrences, PsiElement scope) { PsiElement anchor = null; for (PsiExpression occurrence : occurrences) { - // if (!occurrence.isPhysical()) continue; if (scope != null && !PsiTreeUtil.isAncestor(scope, occurrence, false)) { continue; } @@ -799,13 +797,22 @@ public class RefactoringUtil { return result; } + /** @deprecated use {@linkplain #makeMethodAbstract(com.intellij.psi.PsiClass, com.intellij.psi.PsiMethod)} (to remove in IDEA 13) */ public static void abstractizeMethod(PsiClass targetClass, PsiMethod method) throws IncorrectOperationException { - PsiCodeBlock body = method.getBody(); - if (body != null) { - body.delete(); + makeMethodAbstract(targetClass, method); + } + + public static void makeMethodAbstract(@NotNull PsiClass targetClass, @NotNull PsiMethod method) throws IncorrectOperationException { + final boolean isExtension = PsiUtil.isExtensionMethod(method); + if (!isExtension) { + PsiCodeBlock body = method.getBody(); + if (body != null) { + body.delete(); + } + + PsiUtil.setModifierProperty(method, PsiModifier.ABSTRACT, true); } - PsiUtil.setModifierProperty(method, PsiModifier.ABSTRACT, true); PsiUtil.setModifierProperty(method, PsiModifier.FINAL, false); PsiUtil.setModifierProperty(method, PsiModifier.SYNCHRONIZED, false); PsiUtil.setModifierProperty(method, PsiModifier.NATIVE, false); diff --git a/java/java-tests/testData/refactoring/pullUp/ExtensionMethod.java b/java/java-tests/testData/refactoring/pullUp/ExtensionMethod.java new file mode 100644 index 000000000000..46ec2115c20a --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/ExtensionMethod.java @@ -0,0 +1,8 @@ +interface Base { +} + +interface I2 extends Base { + void foo() default { + System.out.println("Hi there."); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/pullUp/ExtensionMethod_after.java b/java/java-tests/testData/refactoring/pullUp/ExtensionMethod_after.java new file mode 100644 index 000000000000..33876453d679 --- /dev/null +++ b/java/java-tests/testData/refactoring/pullUp/ExtensionMethod_after.java @@ -0,0 +1,8 @@ +interface Base { + void foo() default { + System.out.println("Hi there."); + } +} + +interface I2 extends Base { +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java index 68195d0c3307..686ee6254fcf 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java @@ -134,6 +134,10 @@ public class PullUpTest extends LightRefactoringTestCase { doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); } + public void testExtensionMethod() { + doTest(false, new RefactoringTestUtil.MemberDescriptor("foo", PsiMethod.class)); + } + private void doTest(RefactoringTestUtil.MemberDescriptor... membersToFind) { doTest(true, membersToFind); }