From cd0e90bc700ddc6e3d2bf54cc7d5b66fa41b9997 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Wed, 16 Jan 2013 17:06:39 +0400 Subject: [PATCH] fixed PY-7699 Wrongly reported missed call to superclass constructor using prefixed/embedded class --- .../PyMissingConstructorInspection.java | 4 +++- .../innerClass.py | 18 ++++++++++++++++++ .../inspections/PyMissingConstructorTest.java | 7 +++++-- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 python/testData/inspections/PyMissingConstructorInspection/innerClass.py diff --git a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java index ed93c2f82cff..c19730ba8f35 100644 --- a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java @@ -123,7 +123,9 @@ public class PyMissingConstructorInspection extends PyInspection { PyExpression[] args = ((PyCallExpression)qualifier).getArguments(); if (args.length > 0) { String firstArg = args[0].getText(); - if (firstArg.equals(cl.getName()) || firstArg.equals(CANONICAL_SELF+"."+ CLASS)) + final String qualifiedName = cl.getQualifiedName(); + if (firstArg.equals(cl.getName()) || firstArg.equals(CANONICAL_SELF+"."+ CLASS) || + (qualifiedName != null && qualifiedName.endsWith(firstArg))) return true; for (PyClass s : cl.iterateAncestorClasses()) { if (firstArg.equals(s.getName())) diff --git a/python/testData/inspections/PyMissingConstructorInspection/innerClass.py b/python/testData/inspections/PyMissingConstructorInspection/innerClass.py new file mode 100644 index 000000000000..92cc3c83f432 --- /dev/null +++ b/python/testData/inspections/PyMissingConstructorInspection/innerClass.py @@ -0,0 +1,18 @@ + +class Base(object): + def __init__(self, param): + print "Base", param + + +class Wrapper(object): + class Child(Base): + def __init__(self, param1, param2): + # Here PyCharm claims no super call + super(Wrapper.Child, self).__init__(param2) + print "Child", param1 + + def __init__(self): + self.child = self.Child("aaa", "bbb") + + +wrapper = Wrapper() diff --git a/python/testSrc/com/jetbrains/python/inspections/PyMissingConstructorTest.java b/python/testSrc/com/jetbrains/python/inspections/PyMissingConstructorTest.java index cf734731f38c..f575647386a7 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyMissingConstructorTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyMissingConstructorTest.java @@ -33,8 +33,11 @@ public class PyMissingConstructorTest extends PyTestCase { doTest(); } - // PY-7176 - public void testException() { + public void testException() { // PY-7176 + doTest(); + } + + public void testInnerClass() { //PY-7699 doTest(); }