diff --git a/python/src/com/jetbrains/python/refactoring/PyRefactoringUtil.java b/python/src/com/jetbrains/python/refactoring/PyRefactoringUtil.java index ce3940760455..04e2ae86ca93 100644 --- a/python/src/com/jetbrains/python/refactoring/PyRefactoringUtil.java +++ b/python/src/com/jetbrains/python/refactoring/PyRefactoringUtil.java @@ -104,7 +104,7 @@ public class PyRefactoringUtil { } @NotNull - public static Collection collectScopeVariables(@Nullable final PsiElement scope) { + public static Collection collectUsedNames(@Nullable final PsiElement scope) { if (!(scope instanceof PyClass) && !(scope instanceof PyFile) && !(scope instanceof PyFunction)) { return Collections.emptyList(); } @@ -121,18 +121,18 @@ public class PyRefactoringUtil { } @Override - public void visitPyStatement(@NotNull final PyStatement node) { - if ((node instanceof PyAssignmentStatement) || (scope instanceof PyFunction)) { - node.acceptChildren(this); - } + public void visitPyReferenceExpression(PyReferenceExpression node) { + variables.add(node.getReferencedName()); } @Override public void visitPyFunction(@NotNull final PyFunction node) { + variables.add(node.getName()); } @Override public void visitPyClass(@NotNull final PyClass node) { + variables.add(node.getName()); } }); return variables; diff --git a/python/src/com/jetbrains/python/refactoring/introduce/IntroduceValidator.java b/python/src/com/jetbrains/python/refactoring/introduce/IntroduceValidator.java index 9c77acd2a417..65a055da8d88 100644 --- a/python/src/com/jetbrains/python/refactoring/introduce/IntroduceValidator.java +++ b/python/src/com/jetbrains/python/refactoring/introduce/IntroduceValidator.java @@ -51,6 +51,6 @@ public abstract class IntroduceValidator { context = psiElement.getContainingFile(); } - return PyRefactoringUtil.collectScopeVariables(context).contains(name); + return PyRefactoringUtil.collectUsedNames(context).contains(name); } } diff --git a/python/testData/refactoring/introduceVariable/suggestNamesNotInScope.py b/python/testData/refactoring/introduceVariable/suggestNamesNotInScope.py new file mode 100644 index 000000000000..7a5ca9bea4db --- /dev/null +++ b/python/testData/refactoring/introduceVariable/suggestNamesNotInScope.py @@ -0,0 +1,2 @@ +if myfunc() == 3: + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceVariableTest.java b/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceVariableTest.java index c7e145526351..89c9f80568ff 100644 --- a/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceVariableTest.java +++ b/python/testSrc/com/jetbrains/python/refactoring/PyIntroduceVariableTest.java @@ -52,6 +52,12 @@ public class PyIntroduceVariableTest extends PyIntroduceTestCase { assertFalse(strings.contains("str")); } + public void testSuggestNamesNotInScope() { // PY-4605 + final Collection strings = buildSuggestions(PyExpression.class); + assertTrue(strings.contains("myfunc1")); + assertFalse(strings.contains("myfunc")); + } + public void testIncorrectSelection() { // PY-4455 doTestCannotPerform(); }