From 79395feed7bad29b63a8d6c6b5dece88178299d2 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Fri, 13 Sep 2013 17:10:07 +0400 Subject: [PATCH] Fixed overriding instance and subclass checks for types (PY-10229) --- .../codeInsight/override/PyOverrideImplementUtil.java | 4 +++- python/testData/override/instanceCheck.py | 2 ++ python/testData/override/instanceCheck_after.py | 3 +++ python/testSrc/com/jetbrains/python/PyOverrideTest.java | 9 +++++++++ 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 python/testData/override/instanceCheck.py create mode 100644 python/testData/override/instanceCheck_after.py diff --git a/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java b/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java index fc14c58d12d5..34e9e3829175 100644 --- a/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java +++ b/python/src/com/jetbrains/python/codeInsight/override/PyOverrideImplementUtil.java @@ -220,7 +220,9 @@ public class PyOverrideImplementUtil { statementBody.append("("); final LanguageLevel langLevel = ((PyFile)pyClass.getContainingFile()).getLanguageLevel(); if (!langLevel.isPy3K()) { - statementBody.append(pyClass.getName()).append(", ").append(PyUtil.getFirstParameterName(baseFunction)); + 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); } statementBody.append(").").append(baseFunction.getName()).append("("); if (parameters.size() > 0) { diff --git a/python/testData/override/instanceCheck.py b/python/testData/override/instanceCheck.py new file mode 100644 index 000000000000..7d0b4a0ef50d --- /dev/null +++ b/python/testData/override/instanceCheck.py @@ -0,0 +1,2 @@ +class MyType(type): + pass diff --git a/python/testData/override/instanceCheck_after.py b/python/testData/override/instanceCheck_after.py new file mode 100644 index 000000000000..41bea75888a8 --- /dev/null +++ b/python/testData/override/instanceCheck_after.py @@ -0,0 +1,3 @@ +class MyType(type): + def __instancecheck__(cls, instance): + return super(MyType, cls).__instancecheck__(instance) diff --git a/python/testSrc/com/jetbrains/python/PyOverrideTest.java b/python/testSrc/com/jetbrains/python/PyOverrideTest.java index 2039877a1ecc..3ee4a60a67b0 100644 --- a/python/testSrc/com/jetbrains/python/PyOverrideTest.java +++ b/python/testSrc/com/jetbrains/python/PyOverrideTest.java @@ -97,4 +97,13 @@ public class PyOverrideTest extends PyTestCase { public void testKwargs() { // PY-7401 doTest3k(); } + + // PY-10229 + public void testInstanceCheck() { + myFixture.configureByFile("override/" + getTestName(true) + ".py"); + final PyClass cls = getTopLevelClass(0); + final PyFunction method = cls.findMethodByName("__instancecheck__", true); + PyOverrideImplementUtil.overrideMethods(myFixture.getEditor(), cls, Collections.singletonList(new PyMethodMember(method))); + myFixture.checkResultByFile("override/" + getTestName(true) + "_after.py", true); + } }