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)