From 33d2916e1216f05edc9ec934e86c1fbeb5a3a361 Mon Sep 17 00:00:00 2001 From: Dennis Ushakov Date: Tue, 23 Jun 2009 17:56:30 +0400 Subject: [PATCH] extensibility for Pull Up and Push Down --- .../DefaultRefactoringSupportProvider.java | 8 +++++ .../refactoring/RefactoringSupportProvider.java | 12 +++++++ .../intellij/refactoring/lang/ElementsHandler.java | 27 +++++++++++++++ .../intellij/refactoring/actions/PullUpAction.java | 37 +++++++++++++++++++++ .../refactoring/actions/PushDownAction.java | 38 ++++++++++++++++++++++ platform-resources/src/idea/LangActions.xml | 3 ++ .../intellij/refactoring/actions/PullUpAction.java | 36 -------------------- .../refactoring/actions/PushDownAction.java | 37 --------------------- .../{PullUpHandler.java => JavaPullUpHandler.java} | 23 +++++++++++-- .../refactoring/memberPullUp/PullUpDialog.java | 2 +- ...shDownHandler.java => JavaPushDownHandler.java} | 21 +++++++++++- .../refactoring/memberPushDown/PushDownDialog.java | 2 +- .../memberPushDown/PushDownProcessor.java | 4 +-- .../JavaRefactoringActionHandlerFactoryImpl.java | 8 ++--- resources/src/idea/ActionManager.xml | 8 +++-- .../lang/java/JavaRefactoringSupportProvier.java | 10 ++++++ 16 files changed, 189 insertions(+), 87 deletions(-) create mode 100644 lang-api/src/com/intellij/refactoring/lang/ElementsHandler.java create mode 100644 lang-impl/src/com/intellij/refactoring/actions/PullUpAction.java create mode 100644 lang-impl/src/com/intellij/refactoring/actions/PushDownAction.java delete mode 100644 refactoring/impl/com/intellij/refactoring/actions/PullUpAction.java delete mode 100644 refactoring/impl/com/intellij/refactoring/actions/PushDownAction.java rename refactoring/impl/com/intellij/refactoring/memberPullUp/{PullUpHandler.java => JavaPullUpHandler.java} (89%) rename refactoring/impl/com/intellij/refactoring/memberPushDown/{PushDownHandler.java => JavaPushDownHandler.java} (81%) diff --git a/lang-api/src/com/intellij/lang/refactoring/DefaultRefactoringSupportProvider.java b/lang-api/src/com/intellij/lang/refactoring/DefaultRefactoringSupportProvider.java index 425114a893..28a90d377d 100644 --- a/lang-api/src/com/intellij/lang/refactoring/DefaultRefactoringSupportProvider.java +++ b/lang-api/src/com/intellij/lang/refactoring/DefaultRefactoringSupportProvider.java @@ -50,6 +50,14 @@ public class DefaultRefactoringSupportProvider implements RefactoringSupportProv return null; } + public RefactoringActionHandler getPullUpHandler() { + return null; + } + + public RefactoringActionHandler getPushDownHandler() { + return null; + } + public boolean doInplaceRenameFor(final PsiElement element, final PsiElement context) { return false; } diff --git a/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java b/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java index ab9431c756..4b1d31c815 100644 --- a/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java +++ b/lang-api/src/com/intellij/lang/refactoring/RefactoringSupportProvider.java @@ -67,5 +67,17 @@ public interface RefactoringSupportProvider { */ @Nullable RefactoringActionHandler getIntroduceParameterHandler(); + /** + * @return handler for pulling up members in this language + * @see com.intellij.refactoring.RefactoringActionHandler + */ + @Nullable RefactoringActionHandler getPullUpHandler(); + + /** + * @return handler for pulling up members in this language + * @see com.intellij.refactoring.RefactoringActionHandler + */ + @Nullable RefactoringActionHandler getPushDownHandler(); + boolean doInplaceRenameFor(PsiElement element, PsiElement context); } diff --git a/lang-api/src/com/intellij/refactoring/lang/ElementsHandler.java b/lang-api/src/com/intellij/refactoring/lang/ElementsHandler.java new file mode 100644 index 0000000000..176d5115c9 --- /dev/null +++ b/lang-api/src/com/intellij/refactoring/lang/ElementsHandler.java @@ -0,0 +1,27 @@ +/* + * Copyright 2000-2009 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. + */ + +package com.intellij.refactoring.lang; + +import com.intellij.psi.PsiElement; +import com.intellij.refactoring.RefactoringActionHandler; + +/** + * @author Dennis.Ushakov + */ +public interface ElementsHandler extends RefactoringActionHandler { + boolean isEnabledOnElements(PsiElement[] elements); +} diff --git a/lang-impl/src/com/intellij/refactoring/actions/PullUpAction.java b/lang-impl/src/com/intellij/refactoring/actions/PullUpAction.java new file mode 100644 index 0000000000..9e75f8fe2b --- /dev/null +++ b/lang-impl/src/com/intellij/refactoring/actions/PullUpAction.java @@ -0,0 +1,37 @@ +package com.intellij.refactoring.actions; + +import com.intellij.lang.Language; +import com.intellij.lang.LanguageRefactoringSupport; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.psi.PsiElement; +import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.refactoring.lang.ElementsHandler; + +public class PullUpAction extends BaseRefactoringAction { + public boolean isAvailableInEditorOnly() { + return false; + } + + public boolean isEnabledOnElements(PsiElement[] elements) { + if (elements.length > 0) { + final Language language = elements[0].getLanguage(); + final RefactoringActionHandler handler = LanguageRefactoringSupport.INSTANCE.forLanguage(language).getPullUpHandler(); + return handler instanceof ElementsHandler && ((ElementsHandler)handler).isEnabledOnElements(elements); + } + return false; + } + + public RefactoringActionHandler getHandler(DataContext dataContext) { + final Language language = LangDataKeys.LANGUAGE.getData(dataContext); + if (language != null) { + return LanguageRefactoringSupport.INSTANCE.forLanguage(language).getPullUpHandler(); + } + + return null; + } + + protected boolean isAvailableForLanguage(final Language language) { + return LanguageRefactoringSupport.INSTANCE.forLanguage(language).getPullUpHandler() != null; + } +} \ No newline at end of file diff --git a/lang-impl/src/com/intellij/refactoring/actions/PushDownAction.java b/lang-impl/src/com/intellij/refactoring/actions/PushDownAction.java new file mode 100644 index 0000000000..f83fc10177 --- /dev/null +++ b/lang-impl/src/com/intellij/refactoring/actions/PushDownAction.java @@ -0,0 +1,38 @@ +package com.intellij.refactoring.actions; + +import com.intellij.lang.Language; +import com.intellij.lang.LanguageRefactoringSupport; +import com.intellij.openapi.actionSystem.DataContext; +import com.intellij.openapi.actionSystem.LangDataKeys; +import com.intellij.psi.PsiElement; +import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.refactoring.lang.ElementsHandler; + + +public class PushDownAction extends BaseRefactoringAction { + public boolean isAvailableInEditorOnly() { + return false; + } + + public boolean isEnabledOnElements(PsiElement[] elements) { + if (elements.length > 0) { + final Language language = elements[0].getLanguage(); + final RefactoringActionHandler handler = LanguageRefactoringSupport.INSTANCE.forLanguage(language).getPushDownHandler(); + return handler instanceof ElementsHandler && ((ElementsHandler)handler).isEnabledOnElements(elements); + } + return false; + } + + public RefactoringActionHandler getHandler(DataContext dataContext) { + final Language language = LangDataKeys.LANGUAGE.getData(dataContext); + if (language != null) { + return LanguageRefactoringSupport.INSTANCE.forLanguage(language).getPushDownHandler(); + } + + return null; + } + + protected boolean isAvailableForLanguage(final Language language) { + return LanguageRefactoringSupport.INSTANCE.forLanguage(language).getPushDownHandler() != null; + } +} \ No newline at end of file diff --git a/platform-resources/src/idea/LangActions.xml b/platform-resources/src/idea/LangActions.xml index e70bdd2be6..944e8ddfde 100644 --- a/platform-resources/src/idea/LangActions.xml +++ b/platform-resources/src/idea/LangActions.xml @@ -277,6 +277,9 @@ + + + diff --git a/refactoring/impl/com/intellij/refactoring/actions/PullUpAction.java b/refactoring/impl/com/intellij/refactoring/actions/PullUpAction.java deleted file mode 100644 index 8e62086d6b..0000000000 --- a/refactoring/impl/com/intellij/refactoring/actions/PullUpAction.java +++ /dev/null @@ -1,36 +0,0 @@ - -package com.intellij.refactoring.actions; - -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.refactoring.RefactoringActionHandler; -import com.intellij.refactoring.memberPullUp.PullUpHandler; - -public class PullUpAction extends BaseRefactoringAction { - public boolean isAvailableInEditorOnly() { - return false; - } - - public boolean isEnabledOnElements(PsiElement[] elements) { - /* - if (elements.length == 1) { - return elements[0] instanceof PsiClass || elements[0] instanceof PsiField || elements[0] instanceof PsiMethod; - } - else if (elements.length > 1){ - for (int idx = 0; idx < elements.length; idx++) { - PsiElement element = elements[idx]; - if (!(element instanceof PsiField || element instanceof PsiMethod)) return false; - } - return true; - } - return false; - */ - // todo: multiple selection etc - return elements.length == 1 && elements[0] instanceof PsiClass; - } - - public RefactoringActionHandler getHandler(DataContext dataContext) { - return new PullUpHandler(); - } -} \ No newline at end of file diff --git a/refactoring/impl/com/intellij/refactoring/actions/PushDownAction.java b/refactoring/impl/com/intellij/refactoring/actions/PushDownAction.java deleted file mode 100644 index 3e34927aaa..0000000000 --- a/refactoring/impl/com/intellij/refactoring/actions/PushDownAction.java +++ /dev/null @@ -1,37 +0,0 @@ - -package com.intellij.refactoring.actions; - -import com.intellij.openapi.actionSystem.DataContext; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.refactoring.RefactoringActionHandler; -import com.intellij.refactoring.memberPushDown.PushDownHandler; - - -public class PushDownAction extends BaseRefactoringAction { - public boolean isAvailableInEditorOnly() { - return false; - } - - public boolean isEnabledOnElements(PsiElement[] elements) { - /* - if (elements.length == 1) { - return elements[0] instanceof PsiClass || elements[0] instanceof PsiField || elements[0] instanceof PsiMethod; - } - else if (elements.length > 1){ - for (int idx = 0; idx < elements.length; idx++) { - PsiElement element = elements[idx]; - if (!(element instanceof PsiField || element instanceof PsiMethod)) return false; - } - return true; - } - return false; - */ - // todo: multiple selection etc - return elements.length == 1 && elements[0] instanceof PsiClass; - } - - public RefactoringActionHandler getHandler(DataContext dataContext) { - return new PushDownHandler(); - } -} \ No newline at end of file diff --git a/refactoring/impl/com/intellij/refactoring/memberPullUp/PullUpHandler.java b/refactoring/impl/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java similarity index 89% rename from refactoring/impl/com/intellij/refactoring/memberPullUp/PullUpHandler.java rename to refactoring/impl/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java index 8d52149aef..bf5b4725d2 100644 --- a/refactoring/impl/com/intellij/refactoring/memberPullUp/PullUpHandler.java +++ b/refactoring/impl/com/intellij/refactoring/memberPullUp/JavaPullUpHandler.java @@ -22,6 +22,7 @@ import com.intellij.psi.*; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.lang.ElementsHandler; import com.intellij.refactoring.ui.ConflictsDialog; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.JavaDocPolicy; @@ -35,8 +36,8 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -public class PullUpHandler implements RefactoringActionHandler, PullUpDialog.Callback { - private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.memberPullUp.PullUpHandler"); +public class JavaPullUpHandler implements RefactoringActionHandler, PullUpDialog.Callback, ElementsHandler { + private static final Logger LOG = Logger.getInstance("#com.intellij.refactoring.memberPullUp.JavaPullUpHandler"); public static final String REFACTORING_NAME = RefactoringBundle.message("pull.members.up.title"); private PsiClass mySubclass; private Project myProject; @@ -185,4 +186,22 @@ public class PullUpHandler implements RefactoringActionHandler, PullUpDialog.Cal } return true; } + + public boolean isEnabledOnElements(PsiElement[] elements) { + /* + if (elements.length == 1) { + return elements[0] instanceof PsiClass || elements[0] instanceof PsiField || elements[0] instanceof PsiMethod; + } + else if (elements.length > 1){ + for (int idx = 0; idx < elements.length; idx++) { + PsiElement element = elements[idx]; + if (!(element instanceof PsiField || element instanceof PsiMethod)) return false; + } + return true; + } + return false; + */ + // todo: multiple selection etc + return elements.length == 1 && elements[0] instanceof PsiClass; + } } diff --git a/refactoring/impl/com/intellij/refactoring/memberPullUp/PullUpDialog.java b/refactoring/impl/com/intellij/refactoring/memberPullUp/PullUpDialog.java index fdbb978b29..97ec60bbf1 100644 --- a/refactoring/impl/com/intellij/refactoring/memberPullUp/PullUpDialog.java +++ b/refactoring/impl/com/intellij/refactoring/memberPullUp/PullUpDialog.java @@ -56,7 +56,7 @@ public class PullUpDialog extends DialogWrapper { myMemberInfos = myMemberInfoStorage.getClassMemberInfos(aClass).toArray(new MemberInfo[0]); myCallback = callback; - setTitle(PullUpHandler.REFACTORING_NAME); + setTitle(JavaPullUpHandler.REFACTORING_NAME); init(); } diff --git a/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownHandler.java b/refactoring/impl/com/intellij/refactoring/memberPushDown/JavaPushDownHandler.java similarity index 81% rename from refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownHandler.java rename to refactoring/impl/com/intellij/refactoring/memberPushDown/JavaPushDownHandler.java index 99ef3489e3..ede736993e 100644 --- a/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownHandler.java +++ b/refactoring/impl/com/intellij/refactoring/memberPushDown/JavaPushDownHandler.java @@ -9,6 +9,7 @@ import com.intellij.psi.impl.source.jsp.jspJava.JspClass; import com.intellij.refactoring.HelpID; import com.intellij.refactoring.RefactoringActionHandler; import com.intellij.refactoring.RefactoringBundle; +import com.intellij.refactoring.lang.ElementsHandler; import com.intellij.refactoring.util.CommonRefactoringUtil; import com.intellij.refactoring.util.RefactoringMessageUtil; import com.intellij.refactoring.util.classMembers.MemberInfo; @@ -20,7 +21,7 @@ import java.util.List; /** * @author dsl */ -public class PushDownHandler implements RefactoringActionHandler { +public class JavaPushDownHandler implements RefactoringActionHandler, ElementsHandler { public static final String REFACTORING_NAME = RefactoringBundle.message("push.members.down.title"); public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) { @@ -87,4 +88,22 @@ public class PushDownHandler implements RefactoringActionHandler { aClass); dialog.show(); } + + public boolean isEnabledOnElements(PsiElement[] elements) { + /* + if (elements.length == 1) { + return elements[0] instanceof PsiClass || elements[0] instanceof PsiField || elements[0] instanceof PsiMethod; + } + else if (elements.length > 1){ + for (int idx = 0; idx < elements.length; idx++) { + PsiElement element = elements[idx]; + if (!(element instanceof PsiField || element instanceof PsiMethod)) return false; + } + return true; + } + return false; + */ + // todo: multiple selection etc + return elements.length == 1 && elements[0] instanceof PsiClass; + } } \ No newline at end of file diff --git a/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownDialog.java b/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownDialog.java index ae965a796c..b52e37d60f 100644 --- a/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownDialog.java +++ b/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownDialog.java @@ -30,7 +30,7 @@ public class PushDownDialog extends RefactoringDialog { myMemberInfos = memberInfos; myClass = aClass; - setTitle(PushDownHandler.REFACTORING_NAME); + setTitle(JavaPushDownHandler.REFACTORING_NAME); init(); } diff --git a/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownProcessor.java b/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownProcessor.java index 2e3a476d64..7031b17cad 100644 --- a/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownProcessor.java +++ b/refactoring/impl/com/intellij/refactoring/memberPushDown/PushDownProcessor.java @@ -44,7 +44,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor { } protected String getCommandName() { - return PushDownHandler.REFACTORING_NAME; + return JavaPushDownHandler.REFACTORING_NAME; } protected UsageViewDescriptor createUsageViewDescriptor(UsageInfo[] usages) { @@ -71,7 +71,7 @@ public class PushDownProcessor extends BaseRefactoringProcessor { RefactoringBundle.message("interface.0.does.not.have.inheritors", myClass.getQualifiedName()) : RefactoringBundle.message("class.0.does.not.have.inheritors", myClass.getQualifiedName()); final String message = noInheritors + "\n" + RefactoringBundle.message("push.down.will.delete.members"); - final int answer = Messages.showYesNoDialog(message, PushDownHandler.REFACTORING_NAME, Messages.getWarningIcon()); + final int answer = Messages.showYesNoDialog(message, JavaPushDownHandler.REFACTORING_NAME, Messages.getWarningIcon()); if (answer != 0) return false; } for (UsageInfo usage : usagesIn) { diff --git a/refactoring/impl/com/intellij/refactoring/openapi/impl/JavaRefactoringActionHandlerFactoryImpl.java b/refactoring/impl/com/intellij/refactoring/openapi/impl/JavaRefactoringActionHandlerFactoryImpl.java index 312bcfe7c3..e63fed594f 100644 --- a/refactoring/impl/com/intellij/refactoring/openapi/impl/JavaRefactoringActionHandlerFactoryImpl.java +++ b/refactoring/impl/com/intellij/refactoring/openapi/impl/JavaRefactoringActionHandlerFactoryImpl.java @@ -17,8 +17,8 @@ import com.intellij.refactoring.introduceParameter.IntroduceParameterHandler; import com.intellij.refactoring.introduceVariable.IntroduceVariableHandler; import com.intellij.refactoring.invertBoolean.InvertBooleanHandler; import com.intellij.refactoring.makeStatic.MakeStaticHandler; -import com.intellij.refactoring.memberPullUp.PullUpHandler; -import com.intellij.refactoring.memberPushDown.PushDownHandler; +import com.intellij.refactoring.memberPullUp.JavaPullUpHandler; +import com.intellij.refactoring.memberPushDown.JavaPushDownHandler; import com.intellij.refactoring.replaceConstructorWithFactory.ReplaceConstructorWithFactoryHandler; import com.intellij.refactoring.tempWithQuery.TempWithQueryHandler; import com.intellij.refactoring.turnRefsToSuper.TurnRefsToSuperHandler; @@ -31,11 +31,11 @@ public class JavaRefactoringActionHandlerFactoryImpl extends JavaRefactoringActi } public RefactoringActionHandler createPullUpHandler() { - return new PullUpHandler(); + return new JavaPullUpHandler(); } public RefactoringActionHandler createPushDownHandler() { - return new PushDownHandler(); + return new JavaPushDownHandler(); } public RefactoringActionHandler createTurnRefsToSuperHandler() { diff --git a/resources/src/idea/ActionManager.xml b/resources/src/idea/ActionManager.xml index 3cce71e8ce..aa89471690 100644 --- a/resources/src/idea/ActionManager.xml +++ b/resources/src/idea/ActionManager.xml @@ -154,9 +154,11 @@ + + + + - - @@ -172,7 +174,7 @@ - + diff --git a/source/com/intellij/lang/java/JavaRefactoringSupportProvier.java b/source/com/intellij/lang/java/JavaRefactoringSupportProvier.java index 7b13ea80a2..4d61ea6b8c 100644 --- a/source/com/intellij/lang/java/JavaRefactoringSupportProvier.java +++ b/source/com/intellij/lang/java/JavaRefactoringSupportProvier.java @@ -3,6 +3,8 @@ package com.intellij.lang.java; import com.intellij.lang.refactoring.RefactoringSupportProvider; import com.intellij.psi.*; import com.intellij.refactoring.RefactoringActionHandler; +import com.intellij.refactoring.memberPushDown.JavaPushDownHandler; +import com.intellij.refactoring.memberPullUp.JavaPullUpHandler; import com.intellij.refactoring.introduceParameter.IntroduceParameterHandler; import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer; import com.intellij.refactoring.extractMethod.ExtractMethodHandler; @@ -45,4 +47,12 @@ public class JavaRefactoringSupportProvier implements RefactoringSupportProvider public RefactoringActionHandler getIntroduceParameterHandler() { return new IntroduceParameterHandler(); } + + public RefactoringActionHandler getPullUpHandler() { + return new JavaPullUpHandler(); + } + + public RefactoringActionHandler getPushDownHandler() { + return new JavaPushDownHandler(); + } } -- 2.11.4.GIT