fixed PY-12545 Override method: generated incorrect super call for local classes

This commit is contained in:
Ekaterina Tuzova
2014-04-01 19:59:44 +04:00
parent c46012d5a4
commit 50bd74d1f1
4 changed files with 31 additions and 2 deletions

View File

@@ -235,12 +235,12 @@ public class PyOverrideImplementUtil {
if (!langLevel.isPy3K()) {
final String baseFirstName = !baseParams.isEmpty() ? baseParams.get(0).getName() : null;
final String firstName = baseFirstName != null ? baseFirstName : PyNames.CANONICAL_SELF;
PsiElement outerClass = PsiTreeUtil.getParentOfType(pyClass, PyClass.class, true);
PsiElement outerClass = PsiTreeUtil.getParentOfType(pyClass, PyClass.class, true, PyFunction.class);
String className = pyClass.getName();
final List<String> nameResult = Lists.newArrayList(className);
while(outerClass instanceof PyClass) {
nameResult.add(0, ((PyClass)outerClass).getName());
outerClass = PsiTreeUtil.getParentOfType(outerClass, PyClass.class, true);
outerClass = PsiTreeUtil.getParentOfType(outerClass, PyClass.class, true, PyFunction.class);
}
className = StringUtil.join(nameResult, ".");

View File

@@ -0,0 +1,8 @@
class X(object):
def foo(self):
pass
class A():
def service(self):
class B<caret>(X):
pass

View File

@@ -0,0 +1,10 @@
class X(object):
def foo(self):
pass
class A():
def service(self):
class B(X):
def foo(self):
super(B, self).foo()

View File

@@ -15,6 +15,8 @@
*/
package com.jetbrains.python;
import com.intellij.psi.PsiElement;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.python.codeInsight.override.PyMethodMember;
import com.jetbrains.python.codeInsight.override.PyOverrideImplementUtil;
import com.jetbrains.python.fixtures.PyTestCase;
@@ -87,6 +89,15 @@ public class PyOverrideTest extends PyTestCase {
myFixture.checkResultByFile("override/" + getTestName(true) + "_after.py", true);
}
public void testInnerFunctionClass() {
myFixture.configureByFile("override/" + getTestName(true) + ".py");
PyFunction toOverride = getTopLevelClass(0).getMethods()[0];
final PsiElement element = myFixture.getElementAtCaret();
PyOverrideImplementUtil.overrideMethods(myFixture.getEditor(), PsiTreeUtil.getParentOfType(element, PyClass.class, false),
Collections.singletonList(new PyMethodMember(toOverride)), false);
myFixture.checkResultByFile("override/" + getTestName(true) + "_after.py", true);
}
public void testQualified() { // PY-2171
myFixture.configureByFile("override/" + getTestName(true) + ".py");
PyClass dateClass = PyClassNameIndex.findClass("datetime.date", myFixture.getProject());