Add tests about matching __slots__ against structural type (PY-29233)

This commit is contained in:
Semyon Proshev
2018-05-29 17:24:38 +03:00
parent 84e61c21cd
commit 2588b3f8a0
3 changed files with 26 additions and 4 deletions
@@ -12,7 +12,6 @@ import com.intellij.psi.PsiInvalidElementAccessException;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ObjectUtils;
import com.intellij.util.ProcessingContext;
import com.intellij.util.Processor;
import com.intellij.util.containers.ContainerUtil;
@@ -681,7 +680,9 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
result.add(expression.getName());
}
result.addAll(ObjectUtils.notNull(myClass.getSlots(context), Collections.emptyList()));
if (myClass.isNewStyleClass(context)) {
result.addAll(ContainerUtil.notNullize(myClass.getOwnSlots()));
}
for (PyClassMembersProvider provider : Extensions.getExtensions(PyClassMembersProvider.EP_NAME)) {
for (PyCustomMember member : provider.getMembers(this, null, context)) {
@@ -2,8 +2,29 @@ class A(object):
__slots__ = 'x', 'y'
class B(object):
__slots__ = ['x']
class C(B):
pass
class D(object):
pass
class E(D):
__slots__ = ['x']
class F:
__slots__ = ['x']
def copy_values(a):
print(a.x)
copy_values(A())
copy_values(A())
copy_values(C())
copy_values(E())
copy_values(<warning descr="Type 'D' doesn't have expected attribute 'x'">D()</warning>)
@@ -344,7 +344,7 @@ public class PyTypeCheckerInspectionTest extends PyInspectionTestCase {
doTest();
}
// PY-22222
// PY-22222, PY-29233
public void testPassClassWithDunderSlotsToMethodThatUsesSlottedAttribute() {
doTest();
}