diff --git a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java index f3642d773d4b..62aadb764082 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java @@ -187,6 +187,7 @@ public class PyClassImpl extends PyPresentableElementImpl implement // stub-based resolve currently works correctly only with classes in file level final PsiElement parent = stub.getParentStub().getPsi(); if (!(parent instanceof PyFile)) { + // TODO[yole] handle this case return null; } @@ -195,15 +196,21 @@ public class PyClassImpl extends PyPresentableElementImpl implement if (qualifiedName == null) { return null; } - // TODO[yole] handle more cases - if (qualifiedName.getComponentCount() != 1) { + + NameDefiner currentParent = (NameDefiner) parent; + for (String component : qualifiedName.getComponents()) { + PsiElement element = currentParent.getElementNamed(component); + element = PyReferenceExpressionImpl.turnDirIntoInit(element); + if (!(element instanceof NameDefiner)) { + return null; + } + currentParent = (NameDefiner) element; + } + + if (!(currentParent instanceof PyClass)) { return null; } - final PsiElement superClass = ((PyFile)parent).getElementNamed(qualifiedName.getLastComponent()); - if (!(superClass instanceof PyClass)) { - return null; - } - result.add((PyClass) superClass); + result.add((PyClass) currentParent); } return result; } diff --git a/python/testData/resolve/multiFile/resolveQualifiedSuperClass/ResolveQualifiedSuperClass.py b/python/testData/resolve/multiFile/resolveQualifiedSuperClass/ResolveQualifiedSuperClass.py new file mode 100644 index 000000000000..715eafd37170 --- /dev/null +++ b/python/testData/resolve/multiFile/resolveQualifiedSuperClass/ResolveQualifiedSuperClass.py @@ -0,0 +1,6 @@ +import bar + +class Foo(bar.Super): pass + +Foo().copy() +# diff --git a/python/testData/resolve/multiFile/resolveQualifiedSuperClass/bar/__init__.py b/python/testData/resolve/multiFile/resolveQualifiedSuperClass/bar/__init__.py new file mode 100644 index 000000000000..9a95d8aae243 --- /dev/null +++ b/python/testData/resolve/multiFile/resolveQualifiedSuperClass/bar/__init__.py @@ -0,0 +1,5 @@ +import foo + +class Super(foo.SuperDuper): + pass + diff --git a/python/testData/resolve/multiFile/resolveQualifiedSuperClass/foo/__init__.py b/python/testData/resolve/multiFile/resolveQualifiedSuperClass/foo/__init__.py new file mode 100644 index 000000000000..76b1a97ca6e7 --- /dev/null +++ b/python/testData/resolve/multiFile/resolveQualifiedSuperClass/foo/__init__.py @@ -0,0 +1,2 @@ +class SuperDuper(object): + def copy(self): pass diff --git a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java index 1b4b79229a37..e6701fad2497 100644 --- a/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java +++ b/python/testSrc/com/jetbrains/python/PyMultiFileResolveTest.java @@ -148,6 +148,12 @@ public class PyMultiFileResolveTest extends PyLightFixtureTestCase { assertNull(doResolve()); // make sure we don't have a SOE here } + public void testResolveQualifiedSuperClass() throws Exception { + PsiElement element = doResolve(); + assertTrue(element instanceof PyFunction); + assertEquals("copy", ((PyFunction) element).getName()); + } + private PsiFile prepareFile() throws Exception { String testName = getTestName(true); String fileName = getTestName(false) + ".py";