From 4a03fc61e86bdaecefdbce2f8c8bac4e12335493 Mon Sep 17 00:00:00 2001 From: Mikhail Golubev Date: Thu, 19 Mar 2015 19:42:52 +0300 Subject: [PATCH] PY-15348 Do not include non-trivial target expressions in the "Move Module Members" dialog --- .../move/PyMoveModuleMembersHelper.java | 11 ++++++--- .../move/collectMovableModuleMembers.py | 23 +++++++++++++++++++ .../python/refactoring/PyMoveTest.java | 20 ++++++++++++---- 3 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 python/testData/refactoring/move/collectMovableModuleMembers.py diff --git a/python/src/com/jetbrains/python/refactoring/move/PyMoveModuleMembersHelper.java b/python/src/com/jetbrains/python/refactoring/move/PyMoveModuleMembersHelper.java index 4bb9aed877f1..f13b59bf5f92 100644 --- a/python/src/com/jetbrains/python/refactoring/move/PyMoveModuleMembersHelper.java +++ b/python/src/com/jetbrains/python/refactoring/move/PyMoveModuleMembersHelper.java @@ -53,12 +53,17 @@ public class PyMoveModuleMembersHelper { } /** - * Collects all top-level variables, classes and functions (in this order) as returned by {@link PyFile#getTopLevelAttributes()}, - * {@link PyFile#getTopLevelClasses()} and {@link PyFile#getTopLevelFunctions()}. + * Collects all movable top-level variables, classes and functions (in this order) as returned by {@link PyFile#getTopLevelAttributes()}, + * {@link PyFile#getTopLevelClasses()} and {@link PyFile#getTopLevelFunctions()}. Target expression are filtered with + * {@link #isTargetOfSimpleAssignment(PsiElement)}. */ public static List getTopLevelModuleMembers(@NotNull PyFile pyFile) { final List result = new ArrayList(); - result.addAll(pyFile.getTopLevelAttributes()); + for (PyTargetExpression attr : pyFile.getTopLevelAttributes()) { + if (isTargetOfSimpleAssignment(attr)) { + result.add(attr); + } + } result.addAll(pyFile.getTopLevelClasses()); result.addAll(pyFile.getTopLevelFunctions()); return result; diff --git a/python/testData/refactoring/move/collectMovableModuleMembers.py b/python/testData/refactoring/move/collectMovableModuleMembers.py new file mode 100644 index 000000000000..c11a04d19b07 --- /dev/null +++ b/python/testData/refactoring/move/collectMovableModuleMembers.py @@ -0,0 +1,23 @@ +from module import symbol as alias + +CONST = 42 + + +# x is visible externally in Python 2 +[x for x in range(3)] + +for i in range(3): + pass + +if True: + class C: + class Inner: + pass + + def method(self): + pass + + +def outer_func(): + def inner_func(): + pass diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java index b1fd32be06e3..cbb5c10669a4 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyMoveTest.java @@ -30,19 +30,18 @@ import com.intellij.util.containers.ContainerUtil; import com.jetbrains.python.PythonTestUtil; import com.jetbrains.python.codeInsight.PyCodeInsightSettings; import com.jetbrains.python.fixtures.PyTestCase; -import com.jetbrains.python.psi.LanguageLevel; -import com.jetbrains.python.psi.PyClass; -import com.jetbrains.python.psi.PyFunction; -import com.jetbrains.python.psi.PyTargetExpression; +import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.stubs.PyClassNameIndex; import com.jetbrains.python.psi.stubs.PyFunctionNameIndex; import com.jetbrains.python.psi.stubs.PyVariableNameIndex; +import com.jetbrains.python.refactoring.move.PyMoveModuleMembersHelper; import com.jetbrains.python.refactoring.move.PyMoveModuleMembersProcessor; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.util.Collection; +import java.util.List; import static com.jetbrains.python.refactoring.move.PyMoveModuleMembersHelper.isMovableModuleMember; @@ -87,6 +86,19 @@ public class PyMoveTest extends PyTestCase { }); } + // PY-15348 + public void testCollectMovableModuleMembers() { + myFixture.configureByFile("/refactoring/move/" + getTestName(true) + ".py"); + final List members = PyMoveModuleMembersHelper.getTopLevelModuleMembers((PyFile)myFixture.getFile()); + final List names = ContainerUtil.map(members, new Function() { + @Override + public String fun(PyElement element) { + return element.getName(); + } + }); + assertSameElements(names, "CONST", "C", "outer_func"); + } + // PY-3929 // PY-4095 public void testImportAs() {