*/
package com.jetbrains.python.refactoring.move;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Lists;
import com.intellij.openapi.actionSystem.DataContext;
import com.intellij.openapi.application.ApplicationManager;
return false;
}
// Local function or method
- if (findTargetFunction(elements[0]) != null) {
+ if (findMovableLocalFunctionOrMethod(elements[0]) != null) {
return true;
}
}
final BaseRefactoringProcessor processor;
- final PyFunction function = findTargetFunction(elements[0]);
+ final PyFunction function = findMovableLocalFunctionOrMethod(elements[0]);
if (function != null) {
final PyMakeFunctionTopLevelDialog dialog = new PyMakeFunctionTopLevelDialog(project, function, initialPath, initialPath);
if (!dialog.showAndGet()) {
// Fallback to the old way to select single element to move
final PsiNamedElement e = PyMoveModuleMembersHelper.extractNamedElement(element);
if (e != null && PyMoveModuleMembersHelper.hasMovableElementType(e)) {
- if (PyMoveModuleMembersHelper.isMovableModuleMember(e) || findTargetFunction(e) != null) {
+ if (PyMoveModuleMembersHelper.isMovableModuleMember(e) || findMovableLocalFunctionOrMethod(e) != null) {
doMove(project, new PsiElement[]{e}, targetContainer, null);
}
else {
});
}
+ @VisibleForTesting
@Nullable
- public static PyFunction findTargetFunction(@NotNull PsiElement element) {
+ public static PyFunction findMovableLocalFunctionOrMethod(@NotNull PsiElement element) {
if (isLocalFunction(element) || isSuitableInstanceMethod(element)) {
return (PyFunction)element;
}
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.util.IncorrectOperationException;
import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.PyTokenTypes;
import com.jetbrains.python.fixtures.PyTestCase;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.psi.impl.PyPsiUtils;
+import com.jetbrains.python.refactoring.move.PyMoveSymbolDelegate;
import com.jetbrains.python.refactoring.move.makeFunctionTopLevel.PyMakeLocalFunctionTopLevelProcessor;
import com.jetbrains.python.refactoring.move.makeFunctionTopLevel.PyMakeMethodTopLevelProcessor;
import org.jetbrains.annotations.NotNull;
}
}
- //private static boolean isActionEnabled() {
- // final PyMakeFunctionTopLevelRefactoring action = new PyMakeFunctionTopLevelRefactoring();
- // final TestActionEvent event = new TestActionEvent(action);
- // action.beforeActionPerformedUpdate(event);
- // return event.getPresentation().isEnabled();
- //}
+ private boolean isActionEnabled() {
+ final PsiElement elementUnderCaret = myFixture.getFile().findElementAt(myFixture.getCaretOffset());
+ return PyMoveSymbolDelegate.findMovableLocalFunctionOrMethod(elementUnderCaret) != null;
+ }
// PY-6637
public void testLocalFunctionSimple() {
}
// PY-6637
- //public void testRefactoringAvailability() {
- // myFixture.configureByFile(getTestName(true) + ".py");
- //
- // final PsiFile file = myFixture.getFile();
- // moveByText("func");
- // assertFalse(isActionEnabled());
- // moveByText("local");
- // assertTrue(isActionEnabled());
- //
- // // move to "def" keyword
- // myFixture.getEditor().getCaretModel().moveCaretRelatively(-3, 0, false, false, false);
- // final PsiElement tokenAtCaret = file.findElementAt(myFixture.getCaretOffset());
- // assertNotNull(tokenAtCaret);
- // assertEquals(tokenAtCaret.getNode().getElementType(), PyTokenTypes.DEF_KEYWORD);
- // assertTrue(isActionEnabled());
- //
- // moveByText("method");
- // assertTrue(isActionEnabled());
- //
- // moveByText("static_method");
- // assertFalse(isActionEnabled());
- // moveByText("class_method");
- // assertFalse(isActionEnabled());
- //
- // // Overridden method
- // moveByText("overridden_method");
- // assertFalse(isActionEnabled());
- //
- // // Overriding method
- // moveByText("upper");
- // assertFalse(isActionEnabled());
- //
- // moveByText("property");
- // assertFalse(isActionEnabled());
- // moveByText("__magic__");
- // assertFalse(isActionEnabled());
- //}
+ public void testRefactoringAvailability() {
+ myFixture.configureByFile(getTestName(true) + ".py");
+
+ final PsiFile file = myFixture.getFile();
+ moveByText("func");
+ assertFalse(isActionEnabled());
+ moveByText("local");
+ assertTrue(isActionEnabled());
+
+ // move to "def" keyword
+ myFixture.getEditor().getCaretModel().moveCaretRelatively(-3, 0, false, false, false);
+ final PsiElement tokenAtCaret = file.findElementAt(myFixture.getCaretOffset());
+ assertNotNull(tokenAtCaret);
+ assertEquals(tokenAtCaret.getNode().getElementType(), PyTokenTypes.DEF_KEYWORD);
+ assertTrue(isActionEnabled());
+
+ moveByText("method");
+ assertTrue(isActionEnabled());
+
+ moveByText("static_method");
+ assertFalse(isActionEnabled());
+ moveByText("class_method");
+ assertFalse(isActionEnabled());
+
+ // Overridden method
+ moveByText("overridden_method");
+ assertFalse(isActionEnabled());
+
+ // Overriding method
+ moveByText("upper");
+ assertFalse(isActionEnabled());
+
+ moveByText("property");
+ assertFalse(isActionEnabled());
+ moveByText("__magic__");
+ assertFalse(isActionEnabled());
+ }
// PY-6637
public void testLocalFunctionNonlocalReferenceToOuterScope() {