diff --git a/python/src/com/jetbrains/python/codeInsight/codeFragment/PyCodeFragmentUtil.java b/python/src/com/jetbrains/python/codeInsight/codeFragment/PyCodeFragmentUtil.java index 7e0b3e6d5244..025b3c573d87 100644 --- a/python/src/com/jetbrains/python/codeInsight/codeFragment/PyCodeFragmentUtil.java +++ b/python/src/com/jetbrains/python/codeInsight/codeFragment/PyCodeFragmentUtil.java @@ -59,8 +59,8 @@ public class PyCodeFragmentUtil { for (PsiElement element : filterElementsInScope(getInputElements(subGraph, graph), owner)) { final String name = getName(element); if (name != null) { - // Ignore "self", it is generated automatically when extracting any method fragment - if (PyPsiUtils.isMethodContext(element) && "self".equals(name)) { + // Ignore "self" and "cls", they are generated automatically when extracting any method fragment + if (resolvesToBoundMethodParameter(element)) { continue; } if (globalWrites.contains(name)) { @@ -82,6 +82,33 @@ public class PyCodeFragmentUtil { return new PyCodeFragment(inputNames, outputNames, globalWrites, subGraphAnalysis.returns > 0); } + private static boolean resolvesToBoundMethodParameter(@NotNull PsiElement element) { + if (PyPsiUtils.isMethodContext(element)) { + final PyFunction function = PsiTreeUtil.getParentOfType(element, PyFunction.class); + if (function != null) { + final PsiReference reference = element.getReference(); + if (reference != null) { + final PsiElement resolved = reference.resolve(); + if (resolved instanceof PyParameter) { + final PyParameterList parameterList = PsiTreeUtil.getParentOfType(resolved, PyParameterList.class); + if (parameterList != null) { + final PyParameter[] parameters = parameterList.getParameters(); + if (parameters.length > 0) { + if (resolved == parameters[0]) { + final PyFunction.Modifier modifier = function.getModifier(); + if (modifier == null || modifier == PyFunction.Modifier.CLASSMETHOD) { + return true; + } + } + } + } + } + } + } + } + return false; + } + @Nullable private static String getName(@NotNull PsiElement element) { if (element instanceof PsiNamedElement) { diff --git a/python/testData/refactoring/extractmethod/ClassMethod.after.py b/python/testData/refactoring/extractmethod/ClassMethod.after.py index b1305936b574..52040554331e 100644 --- a/python/testData/refactoring/extractmethod/ClassMethod.after.py +++ b/python/testData/refactoring/extractmethod/ClassMethod.after.py @@ -1,8 +1,8 @@ class C: @classmethod def baz(cls): - print "hello world" + print('foo', cls) @classmethod def foo(cls): - cls.baz() \ No newline at end of file + cls.baz() diff --git a/python/testData/refactoring/extractmethod/ClassMethod.before.py b/python/testData/refactoring/extractmethod/ClassMethod.before.py index 55471bc18288..79ac2f015574 100644 --- a/python/testData/refactoring/extractmethod/ClassMethod.before.py +++ b/python/testData/refactoring/extractmethod/ClassMethod.before.py @@ -1,4 +1,4 @@ class C: @classmethod def foo(cls): - print "hello world" \ No newline at end of file + print('foo', cls)