From ddda8c9cef54c15ad53043012ef090108087a76e Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Wed, 15 Jan 2014 18:32:25 +0400 Subject: [PATCH] add field after super call --- .../src/com/jetbrains/python/psi/PyUtil.java | 32 +++++++++++++++---- .../FieldFromUnusedParameterKeyword.py | 3 -- .../FieldFromUnusedParameterKeyword_after.py | 4 --- .../FieldFromUnusedParameter_after.py | 4 --- .../addFieldAddConstructor_after.py | 2 +- .../fromUnusedParameter.py} | 0 .../fromUnusedParameterKeyword.py | 3 ++ .../fromUnusedParameterKeyword_after.py | 4 +++ .../fromUnusedParameter_after.py | 4 +++ .../addPass_after.py | 2 +- .../moveToInit_after.py | 2 +- .../introduceField/py4437.after.py | 2 +- .../com/jetbrains/python/PyQuickFixTest.java | 7 ---- .../quickFixes/AddFieldQuickFixTest.java | 11 +++++++ 14 files changed, 51 insertions(+), 29 deletions(-) delete mode 100644 python/testData/inspections/FieldFromUnusedParameterKeyword.py delete mode 100644 python/testData/inspections/FieldFromUnusedParameterKeyword_after.py delete mode 100644 python/testData/inspections/FieldFromUnusedParameter_after.py rename python/testData/{inspections/FieldFromUnusedParameter.py => quickFixes/AddFieldQuickFixTest/fromUnusedParameter.py} (100%) create mode 100644 python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword.py create mode 100644 python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameterKeyword_after.py create mode 100644 python/testData/quickFixes/AddFieldQuickFixTest/fromUnusedParameter_after.py 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"); + } + }