fixed PY-10976 Method override in nested class generated with incorrect super call

This commit is contained in:
Ekaterina Tuzova
2013-10-08 20:30:05 +04:00
parent ef73535523
commit 70d3040b08
4 changed files with 39 additions and 1 deletions
@@ -1,5 +1,6 @@
package com.jetbrains.python.codeInsight.override;
import com.google.common.collect.Lists;
import com.intellij.codeInsight.CodeInsightUtilCore;
import com.intellij.featureStatistics.FeatureUsageTracker;
import com.intellij.featureStatistics.ProductivityFeatureNames;
@@ -217,7 +218,16 @@ 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;
statementBody.append(pyClass.getName()).append(", ").append(firstName);
PsiElement outerClass = PsiTreeUtil.getParentOfType(pyClass, PyClass.class, true);
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);
}
className = StringUtil.join(nameResult, ".");
statementBody.append(className).append(", ").append(firstName);
}
statementBody.append(").").append(baseFunction.getName()).append("(");
if (parameters.size() > 0) {
+6
View File
@@ -0,0 +1,6 @@
class X(object):
def foo(self): pass
class Outer(object):
class <caret>Inner(X):
pass
@@ -0,0 +1,9 @@
class X(object):
def foo(self): pass
class Outer(object):
class Inner(X):
def foo(self):
super(Outer.Inner, self).foo()
@@ -1,5 +1,7 @@
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;
@@ -63,6 +65,17 @@ public class PyOverrideTest extends PyTestCase {
doTest();
}
public void testInnerClass() { // PY-10976
myFixture.configureByFile("override/" + getTestName(true) + ".py");
PyFunction toOverride = getTopLevelClass(0).getMethods()[0];
final PsiElement element = myFixture.getElementAtCaret();
PyClass pyClass = PsiTreeUtil.getParentOfType(element, PyClass.class, false);
assertNotNull(pyClass);
PyOverrideImplementUtil.overrideMethods(myFixture.getEditor(), pyClass,
Collections.singletonList(new PyMethodMember(toOverride)));
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());