diff --git a/python/helpers/pycharm/docrunner.py b/python/helpers/pycharm/docrunner.py
index 37c4e3459e5f..2052a0729ece 100644
--- a/python/helpers/pycharm/docrunner.py
+++ b/python/helpers/pycharm/docrunner.py
@@ -34,7 +34,10 @@ class TeamcityDocTestResult(TeamcityTestResult):
def getTestId(self, test):
file = os.path.realpath(self.current_suite.filename)
- return "file://" + file + ":" + str( self.current_suite.lineno + test.lineno)
+ line_no = test.lineno
+ if self.current_suite.lineno:
+ line_no += self.current_suite.lineno
+ return "file://" + file + ":" + str(line_no)
def getSuiteLocation(self):
file = os.path.realpath(self.current_suite.filename)
diff --git a/python/src/com/jetbrains/python/PyBundle.properties b/python/src/com/jetbrains/python/PyBundle.properties
index c224e40e0673..8fc2359087fd 100644
--- a/python/src/com/jetbrains/python/PyBundle.properties
+++ b/python/src/com/jetbrains/python/PyBundle.properties
@@ -25,7 +25,7 @@ QFIX.NAME.parameters=Parameters of functions and methods
QFIX.rename.parameter.to.$0=Rename to ''{0}''
QFIX.NAME.add.field.$0.to.class.$1=Add field ''{0}'' to class {1}
-QFIX.added.constructor.$0.for.field.$1=Added a constructor to class {0}
to accommodate new field {1}
+QFIX.added.constructor.$0.for.field.$1=Added a __init__ to class {0}
to accommodate new field {1}
QFIX.failed.to.add.field=
Failed to add a field!
QFIX.NAME.add.method.$0.to.class.$1=Add method {0}() to class {1}
@@ -460,7 +460,8 @@ INSP.NAME.single.quoted.docstring=Single quoted docstring
INSP.message.single.quoted.docstring=Triple double-quoted strings should be used for docstrings.
# PyMissingConstructorInspection
-INSP.NAME.missing.super.constructor=Missed call to constructor of super class
+INSP.NAME.missing.super.constructor=Missed call to __init__ of super class
+INSP.missing.super.constructor.message=Call to __init__ of super class is missed
# PySetFunctionToLiteralInspection
INSP.NAME.set.function.to.literal=Function call can be replaced with set literal
diff --git a/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java b/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java
index b6add93f047c..b4ef1ff0e27c 100644
--- a/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java
@@ -6,10 +6,11 @@ import com.intellij.psi.PsiElementVisitor;
import com.jetbrains.python.PyBundle;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.inspections.quickfix.PyMoveAttributeToInitQuickFix;
-import com.jetbrains.python.psi.PyClass;
-import com.jetbrains.python.psi.PyFunction;
-import com.jetbrains.python.psi.PyTargetExpression;
+import com.jetbrains.python.psi.*;
+import com.jetbrains.python.psi.impl.PyCallExpressionHelper;
import com.jetbrains.python.psi.impl.PyClassImpl;
+import com.jetbrains.python.psi.types.PyClassType;
+import com.jetbrains.python.psi.types.PyType;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -52,9 +53,12 @@ public class PyAttributeOutsideInitInspection extends PyInspection {
Map attributesInInit = new HashMap();
final PyFunction initMethod = containingClass.findMethodByName(PyNames.INIT, false);
- if (initMethod != null)
+ if (initMethod != null) {
PyClassImpl.collectInstanceAttributes(initMethod, attributesInInit);
+ collectAttributesFromSuper(attributesInInit, initMethod);
+ }
+
Map attributes = new HashMap();
PyClassImpl.collectInstanceAttributes(node, attributes);
@@ -66,5 +70,25 @@ public class PyAttributeOutsideInitInspection extends PyInspection {
}
}
+ private void collectAttributesFromSuper(Map attributesInInit, PyFunction initMethod) {
+ final PyStatementList statementList = initMethod.getStatementList();
+ if (statementList != null) {
+ for (PyStatement statement : statementList.getStatements()) {
+ if (statement instanceof PyExpressionStatement) {
+ final PyExpression expression = ((PyExpressionStatement)statement).getExpression();
+ if (expression instanceof PyCallExpression) {
+ final PyType callType = PyCallExpressionHelper.getCallType((PyCallExpression)expression, myTypeEvalContext);
+ if (callType instanceof PyClassType) {
+ final PyClass superClass = ((PyClassType)callType).getPyClass();
+ final PyFunction superInit = superClass.findMethodByName(PyNames.INIT, false);
+ if (superInit != null) {
+ PyClassImpl.collectInstanceAttributes(superInit, attributesInInit);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java
index c19730ba8f35..6f3d6d119e30 100644
--- a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java
@@ -54,10 +54,10 @@ public class PyMissingConstructorInspection extends PyInspection {
return;
}
if (superClasses.length == 1 || node.isNewStyleClass())
- registerProblem(initMethod.getNameIdentifier(), "Call to constructor of super class is missed",
+ registerProblem(initMethod.getNameIdentifier(), PyBundle.message("INSP.missing.super.constructor.message"),
new AddCallSuperQuickFix(node.getSuperClasses()[0], superClasses[0].getText()));
else
- registerProblem(initMethod.getNameIdentifier(), "Call to constructor of super class is missed");
+ registerProblem(initMethod.getNameIdentifier(), PyBundle.message("INSP.missing.super.constructor.message"));
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java
index da29e94bd1f3..12a6dd165bdd 100644
--- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java
+++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java
@@ -700,7 +700,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
actions.add(new AddMethodQuickFix(refText, (PyClassType)qtype, true));
}
else if (!(reference instanceof PyOperatorReference)) {
- actions.add(new AddFieldQuickFix(refText, cls, "None"));
+ actions.add(new AddFieldQuickFix(refText, (PyClassType)qtype, "None"));
}
}
}
diff --git a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
index 5aae8e6ec16b..d5aa057d3887 100644
--- a/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
+++ b/python/src/com/jetbrains/python/inspections/PyUnusedLocalInspectionVisitor.java
@@ -27,6 +27,7 @@ import com.jetbrains.python.psi.impl.PyImportStatementNavigator;
import com.jetbrains.python.psi.resolve.PyResolveContext;
import com.jetbrains.python.psi.search.PyOverridingMethodsSearch;
import com.jetbrains.python.psi.search.PySuperMethodsSearch;
+import com.jetbrains.python.psi.types.PyClassTypeImpl;
import org.jetbrains.annotations.NotNull;
import java.util.*;
@@ -280,7 +281,7 @@ public class PyUnusedLocalInspectionVisitor extends PyInspectionVisitor {
}
}
final LocalQuickFix[] fixes = mayBeField
- ? new LocalQuickFix[] { new AddFieldQuickFix(name, containingClass, name) }
+ ? new LocalQuickFix[] { new AddFieldQuickFix(name, new PyClassTypeImpl(containingClass, false), name) }
: LocalQuickFix.EMPTY_ARRAY;
registerWarning(element, PyBundle.message("INSP.unused.locals.parameter.isnot.used", name), fixes);
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java
index 0475429fa7cc..de8185679e81 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/AddFieldQuickFix.java
@@ -14,6 +14,7 @@ import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.impl.PyPsiUtils;
+import com.jetbrains.python.psi.types.PyClassType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -24,19 +25,19 @@ import org.jetbrains.annotations.Nullable;
*/
public class AddFieldQuickFix implements LocalQuickFix {
- private PyClass myQualifierClass;
+ private PyClassType myQualifierType;
private final String myInitializer;
private String myIdentifier;
- public AddFieldQuickFix(String identifier, PyClass qualifierClass, String initializer) {
+ public AddFieldQuickFix(String identifier, PyClassType qualifierType, String initializer) {
myIdentifier = identifier;
- myQualifierClass = qualifierClass;
+ myQualifierType = qualifierType;
myInitializer = initializer;
}
@NotNull
public String getName() {
- return PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", myIdentifier, myQualifierClass.getName());
+ return PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", myIdentifier, myQualifierType.getName());
}
@NotNull
@@ -66,14 +67,19 @@ public class AddFieldQuickFix implements LocalQuickFix {
public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) {
// expect the descriptor to point to the unresolved identifier.
- PyClass cls = myQualifierClass;
- String item_name = myIdentifier;
- if (cls != null) {
- PsiElement initStatement = addFieldToInit(project, cls, item_name, new CreateFieldCallback(project, item_name, myInitializer));
- if (initStatement != null) {
- showTemplateBuilder(initStatement);
- return;
- }
+ PyClass cls = myQualifierType.getPyClass();
+ PsiElement initStatement;
+ if (!myQualifierType.isDefinition()) {
+ initStatement = addFieldToInit(project, cls, myIdentifier, new CreateFieldCallback(project, myIdentifier, myInitializer));
+ }
+ else {
+ PyStatement field = PyElementGenerator.getInstance(project)
+ .createFromText(LanguageLevel.getDefault(), PyStatement.class, myIdentifier + " = " + myInitializer);
+ initStatement = PyUtil.addElementToStatementList(field, cls.getStatementList(), true);
+ }
+ if (initStatement != null) {
+ showTemplateBuilder(initStatement);
+ return;
}
// somehow we failed. tell about this
PyUtil.showBalloon(project, PyBundle.message("QFIX.failed.to.add.field"), MessageType.ERROR);
@@ -83,14 +89,17 @@ public class AddFieldQuickFix implements LocalQuickFix {
initStatement = CodeInsightUtilBase.forcePsiPostprocessAndRestoreElement(initStatement);
if (initStatement instanceof PyAssignmentStatement) {
final TemplateBuilder builder = TemplateBuilderFactory.getInstance().createTemplateBuilder(initStatement);
- builder.replaceElement(((PyAssignmentStatement) initStatement).getAssignedValue(), myInitializer);
- builder.run();
+ final PyExpression assignedValue = ((PyAssignmentStatement)initStatement).getAssignedValue();
+ if (assignedValue != null) {
+ builder.replaceElement(assignedValue, myInitializer);
+ builder.run();
+ }
}
}
@Nullable
- public static PsiElement addFieldToInit(Project project, PyClass cls, String item_name, Function callback) {
- if (cls != null && item_name != null) {
+ public static PsiElement addFieldToInit(Project project, PyClass cls, String itemName, Function callback) {
+ if (cls != null && itemName != null) {
PyFunction init = cls.findMethodByName(PyNames.INIT, false);
if (init != null) {
return appendToMethod(init, callback);
@@ -100,21 +109,23 @@ public class AddFieldQuickFix implements LocalQuickFix {
init = ancestor.findMethodByName(PyNames.INIT, false);
if (init != null) break;
}
- PyFunction new_init = createInitMethod(project, cls, init);
- if (new_init == null) {
+ PyFunction newInit = createInitMethod(project, cls, init);
+ if (newInit == null) {
return null;
}
- appendToMethod(new_init, callback);
+ appendToMethod(newInit, callback);
- PsiElement add_anchor = null;
+ PsiElement addAnchor = null;
PyFunction[] meths = cls.getMethods();
- if (meths.length > 0) add_anchor = meths[0].getPrevSibling();
- PyStatementList cls_content = cls.getStatementList();
- new_init = (PyFunction) cls_content.addAfter(new_init, add_anchor);
+ if (meths.length > 0) addAnchor = meths[0].getPrevSibling();
+ PyStatementList clsContent = cls.getStatementList();
+ newInit = (PyFunction) clsContent.addAfter(newInit, addAnchor);
- PyUtil.showBalloon(project, PyBundle.message("QFIX.added.constructor.$0.for.field.$1", cls.getName(), item_name), MessageType.INFO);
- return new_init.getStatementList().getStatements()[0];
+ PyUtil.showBalloon(project, PyBundle.message("QFIX.added.constructor.$0.for.field.$1", cls.getName(), itemName), MessageType.INFO);
+ final PyStatementList statementList = newInit.getStatementList();
+ assert statementList != null;
+ return statementList.getStatements()[0];
//else // well, that can't be
}
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java
index 0b4e34859e66..7892b9348bba 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java
@@ -113,7 +113,7 @@ public class AddMethodQuickFix implements LocalQuickFix {
meth.addBefore(deco_list, meth.getFirstChild()); // in the very beginning
}
- meth = (PyFunction)PyUtil.addElementToStatementList(meth, cls_stmt_list);
+ meth = (PyFunction)PyUtil.addElementToStatementList(meth, cls_stmt_list, PyNames.INIT.equals(meth.getName()));
if (myReplaceUsage)
showTemplateBuilder(meth);
}
diff --git a/python/src/com/jetbrains/python/inspections/quickfix/PyMoveAttributeToInitQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/PyMoveAttributeToInitQuickFix.java
index c18e697b7e09..022dd853588d 100644
--- a/python/src/com/jetbrains/python/inspections/quickfix/PyMoveAttributeToInitQuickFix.java
+++ b/python/src/com/jetbrains/python/inspections/quickfix/PyMoveAttributeToInitQuickFix.java
@@ -5,8 +5,9 @@ import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.util.Function;
+import com.intellij.util.FunctionUtil;
import com.jetbrains.python.PyBundle;
-import com.jetbrains.python.PyNames;
import com.jetbrains.python.psi.*;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
@@ -39,31 +40,11 @@ public class PyMoveAttributeToInitQuickFix implements LocalQuickFix {
final PyAssignmentStatement assignment = PsiTreeUtil.getParentOfType(element, PyAssignmentStatement.class);
if (containingClass == null || assignment == null) return;
- final PsiElement copy = assignment.copy();
- if (!addDefinition(copy, containingClass)) return;
-
+ final Function callback = FunctionUtil.constant(assignment);
+ AddFieldQuickFix.addFieldToInit(project, containingClass, ((PyTargetExpression)element).getName(), callback);
removeDefinition(assignment);
}
- private static boolean addDefinition(PsiElement copy, PyClass containingClass) {
- PyFunction init = containingClass.findMethodByName(PyNames.INIT, false);
-
- if (init == null) {
- final PyStatementList classStatementList = containingClass.getStatementList();
- init = PyElementGenerator.getInstance(containingClass.getProject()).createFromText(LanguageLevel.forElement(containingClass),
- PyFunction.class,
- "def __init__(self):\n\t" +
- copy.getText());
- PyUtil.addElementToStatementList(init, classStatementList);
- return true;
- }
-
- final PyStatementList statementList = init.getStatementList();
- if (statementList == null) return false;
- PyUtil.addElementToStatementList(copy, statementList);
- return true;
- }
-
private static boolean removeDefinition(PyAssignmentStatement assignment) {
final PyStatementList statementList = PsiTreeUtil.getParentOfType(assignment, PyStatementList.class);
if (statementList == null) return false;
diff --git a/python/src/com/jetbrains/python/psi/PyUtil.java b/python/src/com/jetbrains/python/psi/PyUtil.java
index 9b72ceb55c05..429a3d4f9aab 100644
--- a/python/src/com/jetbrains/python/psi/PyUtil.java
+++ b/python/src/com/jetbrains/python/psi/PyUtil.java
@@ -1203,15 +1203,16 @@ public class PyUtil {
}
- public static PsiElement addElementToStatementList(@NotNull PsiElement element, @NotNull PyStatementList statementList) {
+ public static PsiElement addElementToStatementList(@NotNull PsiElement element,
+ @NotNull PyStatementList statementList,
+ boolean toTheBeginning) {
final PsiElement firstChild = statementList.getFirstChild();
if (firstChild == statementList.getLastChild() && firstChild instanceof PyPassStatement) {
element = firstChild.replace(element);
}
else {
final PyStatement[] statements = statementList.getStatements();
- String name = element instanceof PsiNamedElement ? ((PsiNamedElement)element).getName() : "";
- if (PyNames.INIT.equals(name) && statements.length > 0) {
+ if (toTheBeginning && statements.length > 0) {
final PyDocStringOwner docStringOwner = PsiTreeUtil.getParentOfType(statementList, PyDocStringOwner.class);
final PyStatement firstStatement = statements[0];
if (docStringOwner != null && firstStatement instanceof PyExpressionStatement &&
diff --git a/python/testData/inspections/AddCallSuper.py b/python/testData/inspections/AddCallSuper.py
index 40590dbc812e..bc63275f6ca3 100644
--- a/python/testData/inspections/AddCallSuper.py
+++ b/python/testData/inspections/AddCallSuper.py
@@ -3,5 +3,5 @@ class A:
pass
class B(A):
- def __init__(self, r, b = 6, *args, **kwargs):
+ def __init__(self, r, b = 6, *args, **kwargs):
print "Constructor B was called"
diff --git a/python/testData/inspections/AddCallSuper1.py b/python/testData/inspections/AddCallSuper1.py
index 2955eb77fe08..3085b5db9e63 100644
--- a/python/testData/inspections/AddCallSuper1.py
+++ b/python/testData/inspections/AddCallSuper1.py
@@ -3,6 +3,6 @@ class A:
pass
class B(A):
- def __init__(self, r, b = 6):
+ def __init__(self, r, b = 6):
"""docstring"""
print "Constructor B was called"
diff --git a/python/testData/inspections/AddCallSuperPass.py b/python/testData/inspections/AddCallSuperPass.py
index 2cf98244251f..9bc68003fc21 100644
--- a/python/testData/inspections/AddCallSuperPass.py
+++ b/python/testData/inspections/AddCallSuperPass.py
@@ -3,5 +3,5 @@ class A:
pass
class B(A):
- def __init__(self, r, b = 6):
+ def __init__(self, r, b = 6):
pass
diff --git a/python/testData/inspections/PyAttributeOutsideInitInspection/definedInSuperClass.py b/python/testData/inspections/PyAttributeOutsideInitInspection/definedInSuperClass.py
new file mode 100644
index 000000000000..071e8096a381
--- /dev/null
+++ b/python/testData/inspections/PyAttributeOutsideInitInspection/definedInSuperClass.py
@@ -0,0 +1,12 @@
+__author__ = 'ktisha'
+
+class Base(object):
+ def __init__(self):
+ self.my = 1
+
+class Child(Base):
+ def __init__(self):
+ super(Child, self).__init__()
+
+ def f(self):
+ self.my = 1
\ No newline at end of file
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/addClassField.py b/python/testData/quickFixes/AddFieldQuickFixTest/addClassField.py
new file mode 100644
index 000000000000..f6372db19419
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/addClassField.py
@@ -0,0 +1,8 @@
+__author__ = 'ktisha'
+
+class A(object):
+
+ def method(self):
+ var = A.FIELD
+ var = self.test
+
diff --git a/python/testData/quickFixes/AddFieldQuickFixTest/addClassField_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addClassField_after.py
new file mode 100644
index 000000000000..908cf4007452
--- /dev/null
+++ b/python/testData/quickFixes/AddFieldQuickFixTest/addClassField_after.py
@@ -0,0 +1,10 @@
+__author__ = 'ktisha'
+
+class A(object):
+
+ FIELD = None
+
+ def method(self):
+ var = A.FIELD
+ var = self.test
+
diff --git a/python/testData/inspections/AddFieldAddConstructor.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor.py
similarity index 100%
rename from python/testData/inspections/AddFieldAddConstructor.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor.py
diff --git a/python/testData/inspections/AddFieldAddConstructor_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor_after.py
similarity index 100%
rename from python/testData/inspections/AddFieldAddConstructor_after.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldAddConstructor_after.py
diff --git a/python/testData/inspections/AddFieldFromInstance.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance.py
similarity index 100%
rename from python/testData/inspections/AddFieldFromInstance.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance.py
diff --git a/python/testData/inspections/AddFieldFromInstance_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance_after.py
similarity index 100%
rename from python/testData/inspections/AddFieldFromInstance_after.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromInstance_after.py
diff --git a/python/testData/inspections/AddFieldFromMethod.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod.py
similarity index 100%
rename from python/testData/inspections/AddFieldFromMethod.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod.py
diff --git a/python/testData/inspections/AddFieldFromMethod_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod_after.py
similarity index 100%
rename from python/testData/inspections/AddFieldFromMethod_after.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldFromMethod_after.py
diff --git a/python/testData/inspections/AddFieldNewConstructor.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldNewConstructor.py
similarity index 100%
rename from python/testData/inspections/AddFieldNewConstructor.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldNewConstructor.py
diff --git a/python/testData/inspections/AddFieldNewConstructor_after.py b/python/testData/quickFixes/AddFieldQuickFixTest/addFieldNewConstructor_after.py
similarity index 100%
rename from python/testData/inspections/AddFieldNewConstructor_after.py
rename to python/testData/quickFixes/AddFieldQuickFixTest/addFieldNewConstructor_after.py
diff --git a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addSuperCall.py b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addSuperCall.py
new file mode 100644
index 000000000000..5cfb8c150ead
--- /dev/null
+++ b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addSuperCall.py
@@ -0,0 +1,9 @@
+__author__ = 'ktisha'
+
+class Base(object):
+ def __init__(self):
+ self.param = 2
+
+class Child(Base):
+ def f(self):
+ self.my = 2
\ No newline at end of file
diff --git a/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addSuperCall_after.py b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addSuperCall_after.py
new file mode 100644
index 000000000000..4dc2613e8ca4
--- /dev/null
+++ b/python/testData/quickFixes/PyMoveAttributeToInitQuickFixTest/addSuperCall_after.py
@@ -0,0 +1,13 @@
+__author__ = 'ktisha'
+
+class Base(object):
+ def __init__(self):
+ self.param = 2
+
+class Child(Base):
+ def __init__(self):
+ super(Child, self).__init__()
+ self.my = 2
+
+ def f(self):
+ pass
diff --git a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
index 70eeef9216ca..2e67d8a67592 100644
--- a/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/PyQuickFixTest.java
@@ -95,26 +95,6 @@ public class PyQuickFixTest extends PyTestCase {
true);
}
- public void testAddFieldFromMethod() {
- doInspectionTest("AddFieldFromMethod.py", PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "y", "A"),
- true, true);
- }
-
- public void testAddFieldFromInstance() {
- doInspectionTest("AddFieldFromInstance.py", PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "y", "A"),
- true, true);
- }
-
- public void testAddFieldAddConstructor() {
- doInspectionTest("AddFieldAddConstructor.py", PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "x", "B"),
- true, true);
- }
-
- public void testAddFieldNewConstructor() {
- doInspectionTest("AddFieldNewConstructor.py", PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "x", "B"),
- true, true);
- }
-
public void testRemoveTrailingSemicolon() {
doInspectionTest("RemoveTrailingSemicolon.py", PyTrailingSemicolonInspection.class, PyBundle.message("QFIX.remove.trailing.semicolon"),
true, true);
diff --git a/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java
index 45bddc738a5c..dee5a034ec94 100644
--- a/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java
+++ b/python/testSrc/com/jetbrains/python/inspections/PyAttributeOutsideInitInspectionTest.java
@@ -15,6 +15,10 @@ public class PyAttributeOutsideInitInspectionTest extends PyTestCase {
doTest();
}
+ public void testDefinedInSuperClass() {
+ doTest();
+ }
+
private void doTest() {
myFixture.configureByFile("inspections/PyAttributeOutsideInitInspection/" + getTestName(true) + ".py");
myFixture.enableInspections(PyAttributeOutsideInitInspection.class);
diff --git a/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
new file mode 100644
index 000000000000..a337e38e10d5
--- /dev/null
+++ b/python/testSrc/com/jetbrains/python/quickFixes/AddFieldQuickFixTest.java
@@ -0,0 +1,31 @@
+package com.jetbrains.python.quickFixes;
+
+import com.jetbrains.python.PyBundle;
+import com.jetbrains.python.inspections.PyUnresolvedReferencesInspection;
+
+/**
+ * User: ktisha
+ */
+public class AddFieldQuickFixTest extends PyQuickFixTestCase {
+
+ public void testAddClassField() {
+ doInspectionTest(PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "FIELD", "A"));
+ }
+
+ public void testAddFieldFromMethod() {
+ doInspectionTest(PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "y", "A"));
+ }
+
+ public void testAddFieldFromInstance() {
+ doInspectionTest(PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "y", "A"));
+ }
+
+ public void testAddFieldAddConstructor() {
+ doInspectionTest(PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "x", "B"));
+ }
+
+ public void testAddFieldNewConstructor() {
+ doInspectionTest(PyUnresolvedReferencesInspection.class, PyBundle.message("QFIX.NAME.add.field.$0.to.class.$1", "x", "B"));
+ }
+
+}
diff --git a/python/testSrc/com/jetbrains/python/quickFixes/PyMoveAttributeToInitQuickFixTest.java b/python/testSrc/com/jetbrains/python/quickFixes/PyMoveAttributeToInitQuickFixTest.java
index b02d5fd4f092..4a4bce54a4b6 100644
--- a/python/testSrc/com/jetbrains/python/quickFixes/PyMoveAttributeToInitQuickFixTest.java
+++ b/python/testSrc/com/jetbrains/python/quickFixes/PyMoveAttributeToInitQuickFixTest.java
@@ -30,4 +30,8 @@ public class PyMoveAttributeToInitQuickFixTest extends PyQuickFixTestCase {
doInspectionTest(PyAttributeOutsideInitInspection.class, PyBundle.message("QFIX.move.attribute"));
}
+ public void testAddSuperCall() {
+ doInspectionTest(PyAttributeOutsideInitInspection.class, PyBundle.message("QFIX.move.attribute"));
+ }
+
}