diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java
index e939857703d2..0cd299422694 100644
--- a/python/src/com/jetbrains/python/psi/PyUtil.java
+++ b/python/src/com/jetbrains/python/psi/PyUtil.java
@@ -44,6 +44,7 @@ import com.intellij.psi.*;
import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.QualifiedName;
import com.intellij.ui.awt.RelativePoint;
import com.intellij.util.ArrayUtil;
import com.intellij.util.IncorrectOperationException;
@@ -60,7 +61,6 @@ import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.codeInsight.stdlib.PyNamedTupleType;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyPsiUtils;
-import com.intellij.psi.util.QualifiedName;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.resolve.QualifiedResolveResult;
import com.jetbrains.python.psi.types.*;
@@ -1313,13 +1313,31 @@ public class PyUtil {
final PyStatement[] statements = statementList.getStatements();
if (toTheBeginning && statements.length > 0) {
final PyDocStringOwner docStringOwner = PsiTreeUtil.getParentOfType(statementList, PyDocStringOwner.class);
- final PyStatement firstStatement = statements[0];
- if (docStringOwner != null && firstStatement instanceof PyExpressionStatement &&
- ((PyExpressionStatement)firstStatement).getExpression() == docStringOwner.getDocStringExpression()) {
- element = statementList.addAfter(element, firstStatement);
+ PyStatement anchor = statements[0];
+ if (docStringOwner != null && anchor instanceof PyExpressionStatement &&
+ ((PyExpressionStatement)anchor).getExpression() == docStringOwner.getDocStringExpression()) {
+ final PyStatement next = PsiTreeUtil.getNextSiblingOfType(anchor, PyStatement.class);
+ if (next == null) {
+ return statementList.addAfter(element, anchor);
+ }
+ anchor = next;
}
- else
- element = statementList.addBefore(element, firstStatement);
+ while (anchor instanceof PyExpressionStatement) {
+ final PyExpression expression = ((PyExpressionStatement)anchor).getExpression();
+ if (expression instanceof PyCallExpression) {
+ final PyExpression callee = ((PyCallExpression)expression).getCallee();
+ if ((isSuperCall((PyCallExpression)expression) || (callee != null && PyNames.INIT.equals(callee.getName())))) {
+ final PyStatement next = PsiTreeUtil.getNextSiblingOfType(anchor, PyStatement.class);
+ if (next == null) {
+ return statementList.addAfter(element, anchor);
+ }
+ anchor = next;
+ }
+ else break;
+ }
+ else break;
+ }
+ element = statementList.addBefore(element, anchor);
}
else {
element = statementList.add(element);
diff --git a/python/testData/inspections/FieldFromUnusedParameterKeyword.py b/python/testData/inspections/FieldFromUnusedParameterKeyword.py
deleted file mode 100644
index 35851f0f87df..000000000000
--- a/python/testData/inspections/FieldFromUnusedParameterKeyword.py
+++ /dev/null
@@ -1,3 +0,0 @@
-class A:
- def __init__(self, foo=True):
- print('hello')
\ No newline at end of file
diff --git a/python/testData/inspections/FieldFromUnusedParameterKeyword_after.py b/python/testData/inspections/FieldFromUnusedParameterKeyword_after.py
deleted file mode 100644
index 7e0d6627cc00..000000000000
--- a/python/testData/inspections/FieldFromUnusedParameterKeyword_after.py
+++ /dev/null
@@ -1,4 +0,0 @@
-class A:
- def __init__(self, foo=True):
- print('hello')
- self.foo = foo
\ No newline at end of file
diff --git a/python/testData/inspections/FieldFromUnusedParameter_after.py b/python/testData/inspections/FieldFromUnusedParameter_after.py
deleted file mode 100644
index 7405ba3ec789..000000000000
--- a/python/testData/inspections/FieldFromUnusedParameter_after.py
+++ /dev/null
@@ -1,4 +0,0 @@
-class A:
- def __init__(self, foo):
- print('hello')
- self.foo = foo
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor_after.py
index 881dd8adfc8e..4125368868db 100644
--- a/python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor_after.py
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor_after.py
@@ -5,8 +5,8 @@ class A:
class B(A):
def __init__(self, a, b):
- self.x = None
A.__init__(self, a, b)
+ self.x = None
def foo(self):
return self.x
diff --git a/python/testData/inspections/FieldFromUnusedParameter.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter.py
similarity index 100%
rename from python/testData/inspections/FieldFromUnusedParameter.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter.py
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword.py
new file mode 100644
index 000000000000..27f1600fe718
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword.py
@@ -0,0 +1,3 @@
+class A:
+ def __init__(self, foo=True):
+ print('hello')
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword_after.py
new file mode 100644
index 000000000000..3f86fa418459
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword_after.py
@@ -0,0 +1,4 @@
+class A:
+ def __init__(self, foo=True):
+ self.foo = foo
+ print('hello')
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter_after.py
new file mode 100644
index 000000000000..58785edcedea
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter_after.py
@@ -0,0 +1,4 @@
+class A:
+ def __init__(self, foo):
+ self.foo = foo
+ print('hello')
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py
index da65a030ea4d..040de7386118 100644
--- a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py
+++ b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addPass_after.py
@@ -3,8 +3,8 @@ __author__ = 'ktisha'
class A:
def __init__(self):
- self._a = 1
self.b = 1
+ self._a = 1
def foo(self):
pass
diff --git a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py
index 2dc80743d949..9a83f676bfdc 100644
--- a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py
+++ b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/moveToInit_after.py
@@ -3,8 +3,8 @@ __author__ = 'ktisha'
class A:
def __init__(self):
- self._a = 1
self.b = 1
+ self._a = 1
def foo(self):
c = 1
\ No newline at end of file
diff --git a/python/testData/refactoring/introduceField/py4437.after.py b/python/testData/refactoring/introduceField/py4437.after.py
index e9c7d7535699..07a1331b604a 100644
--- a/python/testData/refactoring/introduceField/py4437.after.py
+++ b/python/testData/refactoring/introduceField/py4437.after.py
@@ -1,7 +1,7 @@
class SomeClass():
def __init__(self):
- self.x = 1
self.a = ''
+ self.x = 1
def foo(self):
self.a
diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
index e0f82b0718c4..4083775e8a41 100644
--- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
@@ -173,13 +173,6 @@ public class PyQuickFixTest extends PyTestCase {
doInspectionTest("AddClass.py", PyUnresolvedReferencesInspection.class, "Create class 'Xyzzy'", true, true);
}
- public void testFieldFromUnusedParameter() { // PY-1398
- doInspectionTest("FieldFromUnusedParameter.py", PyUnusedLocalInspection.class, "Add field 'foo' to class A", true, true);
- }
-
- public void testFieldFromUnusedParameterKeyword() { // PY-1602
- doInspectionTest("FieldFromUnusedParameterKeyword.py", PyUnusedLocalInspection.class, "Add field 'foo' to class A", true, true);
- }
public void testAddFunctionToModule() { // PY-1602
doInspectionTest(
diff --git a/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
index 5ffe1a651f2b..c93553d2c3a4 100644
--- a/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
@@ -15,13 +15,16 @@
*/
package com.jetbrains.python.quickFixes;
+import com.intellij.testFramework.TestDataPath;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyQuickFixTestCase;
import com.jetbrains.python.inspections.PyUnresolvedReferencesInspection;
+import com.jetbrains.python.inspections.PyUnusedLocalInspection;
/**
* User: ktisha
*/
+@TestDataPath("$CONTENT_ROOT/../testData//quickFixes/AddFieldQuickFixTest/")
public class AddFieldQuickFixTest extends PyQuickFixTestCase {
public void testAddClassField() {
@@ -44,4 +47,12 @@ public class AddFieldQuickFixTest extends PyQuickFixTestCase {
doQuickFixTest(PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "x", "B"));
}
+ public void testFromUnusedParameter() { // PY-1398
+ doQuickFixTest(PyUnusedLocalInspection.class, "Add field 'foo' to class A");
+ }
+
+ public void testFromUnusedParameterKeyword() { // PY-1602
+ doQuickFixTest(PyUnusedLocalInspection.class, "Add field 'foo' to class A");
+ }
+
}