From da62cc4f5d64794a838e579cfa9dd2965eabbaa6 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 18 Apr 2013 22:25:51 +0400 Subject: [PATCH] Use TypeEvalContext for getting ancestor classes if it's available --- .../PyAttributeOutsideInitInspection.java | 2 +- .../PyClassHasNoInitInspection.java | 2 +- .../PyMissingConstructorInspection.java | 18 +++++++++--------- .../PyUnresolvedReferencesInspection.java | 8 ++++---- .../psi/impl/PyCallExpressionHelper.java | 2 +- .../psi/impl/references/PyReferenceImpl.java | 2 +- .../python/psi/types/PyClassTypeImpl.java | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) diff --git a/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java b/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java index 02cdf65cc08e..554cdc763400 100644 --- a/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyAttributeOutsideInitInspection.java @@ -65,7 +65,7 @@ public class PyAttributeOutsideInitInspection extends PyInspection { collectAttributesFromSuper(attributesInInit, initMethod); } else { - for (PyClass superClass : containingClass.getAncestorClasses()) { + for (PyClass superClass : containingClass.getAncestorClasses(myTypeEvalContext)) { final PyFunction superInit = superClass.findMethodByName(PyNames.INIT, false); if (superInit != null) PyClassImpl.collectInstanceAttributes(superInit, attributesInInit); diff --git a/python/src/com/jetbrains/python/inspections/PyClassHasNoInitInspection.java b/python/src/com/jetbrains/python/inspections/PyClassHasNoInitInspection.java index 82df134a19b1..0303763563fd 100644 --- a/python/src/com/jetbrains/python/inspections/PyClassHasNoInitInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyClassHasNoInitInspection.java @@ -44,7 +44,7 @@ public class PyClassHasNoInitInspection extends PyInspection { registerProblem(node.getNameIdentifier(), PyBundle.message("INSP.class.has.no.init"), new AddMethodQuickFix("__init__", new PyClassTypeImpl(node, false), false)); } - for (PyClass ancestor : node.getAncestorClasses()) { + for (PyClass ancestor : node.getAncestorClasses(myTypeEvalContext)) { final PyFunction ancestorInit = ancestor.findInitOrNew(false); if (ancestorInit == null) { registerProblem(node.getNameIdentifier(), PyBundle.message("INSP.parent.$0.has.no.init", ancestor.getName()), diff --git a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java index 6ce1ab531f45..5cf9950b9d35 100644 --- a/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyMissingConstructorInspection.java @@ -61,8 +61,8 @@ public class PyMissingConstructorInspection extends PyInspection { } } - private static boolean superHasConstructor(@NotNull PyClass cls) { - for (PyClass c : cls.getAncestorClasses()) { + private boolean superHasConstructor(@NotNull PyClass cls) { + for (PyClass c : cls.getAncestorClasses(myTypeEvalContext)) { final String name = c.getName(); final String className = cls.getName(); if (!OBJECT.equals(name) && !FAKE_OLD_BASE.equals(name) && className != null && @@ -77,7 +77,7 @@ public class PyMissingConstructorInspection extends PyInspection { if (PyBroadExceptionInspection.equalsException(cls, context)) { return true; } - for (PyClass baseClass : cls.getAncestorClasses()) { + for (PyClass baseClass : cls.getAncestorClasses(myTypeEvalContext)) { if (PyBroadExceptionInspection.equalsException(baseClass, context)) { return true; } @@ -85,7 +85,7 @@ public class PyMissingConstructorInspection extends PyInspection { return false; } - private static boolean hasConstructorCall(PyClass node, PyFunction initMethod) { + private boolean hasConstructorCall(PyClass node, PyFunction initMethod) { PyStatementList statementList = initMethod.getStatementList(); CallVisitor visitor = new CallVisitor(node); if (statementList != null) { @@ -95,7 +95,7 @@ public class PyMissingConstructorInspection extends PyInspection { return false; } - private static class CallVisitor extends PyRecursiveElementVisitor { + private class CallVisitor extends PyRecursiveElementVisitor { private boolean myHasConstructorCall = false; private PyClass myClass; CallVisitor(PyClass node) { @@ -108,7 +108,7 @@ public class PyMissingConstructorInspection extends PyInspection { myHasConstructorCall = true; } - private static boolean isConstructorCall(PyCallExpression expression, PyClass cl) { + private boolean isConstructorCall(PyCallExpression expression, PyClass cl) { PyExpression callee = expression.getCallee(); if (callee instanceof PyQualifiedExpression) { PyExpression qualifier = ((PyQualifiedExpression)callee).getQualifier(); @@ -127,7 +127,7 @@ public class PyMissingConstructorInspection extends PyInspection { if (firstArg.equals(cl.getName()) || firstArg.equals(CANONICAL_SELF+"."+ CLASS) || (qualifiedName != null && qualifiedName.endsWith(firstArg))) return true; - for (PyClass s : cl.getAncestorClasses()) { + for (PyClass s : cl.getAncestorClasses(myTypeEvalContext)) { if (firstArg.equals(s.getName())) return true; } @@ -144,7 +144,7 @@ public class PyMissingConstructorInspection extends PyInspection { return false; } - private static boolean isSuperClassCall(PyClass cl, PyExpression qualifier) { + private boolean isSuperClassCall(PyClass cl, PyExpression qualifier) { PsiElement callingClass = null; if (qualifier instanceof PyCallExpression) { PyExpression innerCallee = ((PyCallExpression)qualifier).getCallee(); @@ -159,7 +159,7 @@ public class PyMissingConstructorInspection extends PyInspection { if (ref != null) callingClass = ref.resolve(); } - for (PyClass s : cl.getAncestorClasses()) { + for (PyClass s : cl.getAncestorClasses(myTypeEvalContext)) { if (s.equals(callingClass)) { return true; } diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index 37e76f0108bd..ec905ceabdac 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -134,7 +134,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { final List slots = pyClass.getSlots(); final String attrName = node.getReferencedName(); if (slots != null && !slots.contains(attrName) && !slots.contains(PyNames.DICT)) { - for (PyClass ancestor : pyClass.getAncestorClasses()) { + for (PyClass ancestor : pyClass.getAncestorClasses(myTypeEvalContext)) { if (ancestor == null) { return; } @@ -628,7 +628,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection { return null; } - private static boolean ignoreUnresolvedMemberForType(@NotNull PyType qtype, PsiReference reference, String refText) { + private boolean ignoreUnresolvedMemberForType(@NotNull PyType qtype, PsiReference reference, String refText) { if (qtype instanceof PyNoneType || PyTypeChecker.isUnknown(qtype)) { // this almost always means that we don't know the type, so don't show an error in this case return true; @@ -667,12 +667,12 @@ public class PyUnresolvedReferencesInspection extends PyInspection { return false; } - private static boolean isDecoratedAsDynamic(@NotNull PyClass cls, boolean inherited) { + private boolean isDecoratedAsDynamic(@NotNull PyClass cls, boolean inherited) { if (inherited) { if (isDecoratedAsDynamic(cls, false)) { return true; } - for (PyClass base : cls.getAncestorClasses()) { + for (PyClass base : cls.getAncestorClasses(myTypeEvalContext)) { if (base != null && isDecoratedAsDynamic(base, false)) { return true; } diff --git a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java index 9c78ef8a688c..a996987d1938 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java +++ b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java @@ -505,7 +505,7 @@ public class PyCallExpressionHelper { return getSuperClassUnionType(firstClass); } if (secondClass.isSubclass(firstClass)) { - final Iterator iterator = firstClass.getAncestorClasses().iterator(); + final Iterator iterator = firstClass.getAncestorClasses(context).iterator(); if (iterator.hasNext()) { return new PyClassTypeImpl(iterator.next(), false); // super(Foo, self) has type of Foo, modulo __get__() } diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java index 35b7773b7fe6..b50b16e490ac 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -125,7 +125,7 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference it.set(rrr.replace(init)); } else { // init not found; maybe it's ancestor's - for (PyClass ancestor : cls.getAncestorClasses()) { + for (PyClass ancestor : cls.getAncestorClasses(myContext.getTypeEvalContext())) { init = ancestor.findMethodByName(PyNames.INIT, false); if (init != null) { // add to results as low priority diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index 0b24f8100746..b172ec83553b 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -155,7 +155,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { PyType first_arg_type = context.getType(first_arg); if (first_arg_type instanceof PyClassType) { PyClass derived_class = ((PyClassType)first_arg_type).getPyClass(); - final Iterator base_it = derived_class.getAncestorClasses().iterator(); + final Iterator base_it = derived_class.getAncestorClasses(context).iterator(); if (base_it.hasNext()) { return new PyClassTypeImpl(base_it.next(), true).resolveMember(name, location, direction, resolveContext); }