diff --git a/python/src/com/jetbrains/python/inspections/PyCallByClassInspection.java b/python/src/com/jetbrains/python/inspections/PyCallByClassInspection.java index 990f65264aca..463899ebff5f 100644 --- a/python/src/com/jetbrains/python/inspections/PyCallByClassInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyCallByClassInspection.java @@ -120,7 +120,8 @@ public class PyCallByClassInspection extends PyInspection { if (method != null) { PyClass calling_class = method.getContainingClass(); assert calling_class != null; // it's a method - if (first_arg_class.isSubclass(qual_class, null) && calling_class.isSubclass(qual_class, null)) { + if (first_arg_class.isSubclass(qual_class, myTypeEvalContext) && + calling_class.isSubclass(qual_class, myTypeEvalContext)) { break; // TODO: might propose to switch to super() here } diff --git a/python/src/com/jetbrains/python/inspections/PyMethodParametersInspection.java b/python/src/com/jetbrains/python/inspections/PyMethodParametersInspection.java index e740c7fb5ead..fd2e5447d9dc 100644 --- a/python/src/com/jetbrains/python/inspections/PyMethodParametersInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyMethodParametersInspection.java @@ -121,7 +121,7 @@ public class PyMethodParametersInspection extends PyInspection { PsiElement zope_interface = findZopeInterface(node); final PyClass cls = node.getContainingClass(); if (zope_interface instanceof PyClass) { - if (cls != null && cls.isSubclass((PyClass) zope_interface, null)) return; // it can have any params + if (cls != null && cls.isSubclass((PyClass) zope_interface, myTypeEvalContext)) return; // it can have any params } // analyze function itself PyUtil.MethodFlags flags = PyUtil.MethodFlags.of(node); diff --git a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java index b1016ef85ea8..149632748a45 100644 --- a/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyProtectedMemberInspection.java @@ -141,12 +141,12 @@ public class PyProtectedMemberInspection extends PyInspection { if (parentClass != null) { if (PyTestUtil.isPyTestClass(parentClass, null) && ignoreTestFunctions) return; - if (parentClass.isSubclass(resolvedClass, null)) + if (parentClass.isSubclass(resolvedClass, myTypeEvalContext)) return; PyClass outerClass = getClassOwner(parentClass); while (outerClass != null) { - if (outerClass.isSubclass(resolvedClass, null)) + if (outerClass.isSubclass(resolvedClass, myTypeEvalContext)) return; outerClass = getClassOwner(outerClass); diff --git a/python/src/com/jetbrains/python/inspections/PySuperArgumentsInspection.java b/python/src/com/jetbrains/python/inspections/PySuperArgumentsInspection.java index 028bc580e6c8..553485319ff0 100644 --- a/python/src/com/jetbrains/python/inspections/PySuperArgumentsInspection.java +++ b/python/src/com/jetbrains/python/inspections/PySuperArgumentsInspection.java @@ -65,7 +65,7 @@ public class PySuperArgumentsInspection extends PyInspection { PyClass firstClass = findClassOf(arguments[0]); PyClass secondClass = findClassOf(arguments[1]); if (firstClass != null && secondClass != null) { - if (!secondClass.isSubclass(firstClass, null)) { + if (!secondClass.isSubclass(firstClass, myTypeEvalContext)) { registerProblem( node.getArgumentList(), PyBundle.message("INSP.$0.is.not.superclass.of.$1", diff --git a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java index 2910fcdc91ec..5f08ae8a8938 100644 --- a/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java +++ b/python/src/com/jetbrains/python/inspections/quickfix/AddMethodQuickFix.java @@ -96,8 +96,9 @@ public class AddMethodQuickFix implements LocalQuickFix { boolean madeInstance = false; if (callByClass) { if (args.length > 0) { - PyType firstArgType = TypeEvalContext.userInitiated(cls.getProject(), cls.getContainingFile()).getType(args[0]); - if (firstArgType instanceof PyClassType && ((PyClassType)firstArgType).getPyClass().isSubclass(cls, null)) { + final TypeEvalContext context = TypeEvalContext.userInitiated(cls.getProject(), cls.getContainingFile()); + final PyType firstArgType = context.getType(args[0]); + if (firstArgType instanceof PyClassType && ((PyClassType)firstArgType).getPyClass().isSubclass(cls, context)) { // class, first arg ok: instance method builder.parameter("self"); // NOTE: might use a name other than 'self', according to code style. madeInstance = true; diff --git a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java index 607d3288b1c5..7c7ada71d9b3 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java +++ b/python/src/com/jetbrains/python/psi/impl/PyCallExpressionHelper.java @@ -16,7 +16,6 @@ package com.jetbrains.python.psi.impl; import com.intellij.codeInsight.completion.CompletionUtil; -import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.psi.PsiElement; @@ -367,7 +366,7 @@ public class PyCallExpressionHelper { PyClass resolvedParent = PsiTreeUtil.getStubOrPsiParentOfType(resolved, PyClass.class); if (resolvedParent != null) { final PyClass qualifierClass = ((PyClassType)qualifierType).getPyClass(); - if ((qualifierClass.isSubclass(resolvedParent, null) || resolvedParent.isSubclass(qualifierClass, null))) { + if ((qualifierClass.isSubclass(resolvedParent, context) || resolvedParent.isSubclass(qualifierClass, context))) { return true; } } diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java index 79528c1dd01f..92dda6a7e259 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java @@ -501,8 +501,7 @@ public class PyQualifiedReference extends PyReferenceImpl { PyClass aClass = PsiTreeUtil.getParentOfType(resolveResult, PyClass.class); PyClass bClass = PsiTreeUtil.getParentOfType(element, PyClass.class); - if (isSubclass(aClass, bClass) - || (isSubclass(bClass, aClass))) { + if (aClass != null && bClass != null && bClass.isSubclass(aClass, myContext.getTypeEvalContext())) { return true; } } @@ -513,13 +512,6 @@ public class PyQualifiedReference extends PyReferenceImpl { return false; } - private static boolean isSubclass(@Nullable PyClass aClass, @Nullable PyClass bClass) { - if (aClass == null || bClass == null) { - return false; - } - return bClass.isSubclass(aClass, null); - } - private static boolean isLocalScope(PsiElement element) { if (element instanceof PyParameter) { return true; 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 ecdaa5164f10..5d35f39b52d2 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -530,7 +530,8 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference if (PyUtil.isClassAttribute(myElement) && (PyUtil.isClassAttribute(expr) || PyUtil.isInstanceAttribute(expr))) { final PyClass c1 = PsiTreeUtil.getParentOfType(element, PyClass.class); final PyClass c2 = PsiTreeUtil.getParentOfType(myElement, PyClass.class); - if (c1 != null && c2 != null && (c1.isSubclass(c2, null) || c2.isSubclass(c1, null))) { + final TypeEvalContext context = myContext.getTypeEvalContext(); + if (c1 != null && c2 != null && (c1.isSubclass(c2, context) || c2.isSubclass(c1, context))) { return true; } } diff --git a/python/src/com/jetbrains/python/psi/search/PySuperMethodsSearchExecutor.java b/python/src/com/jetbrains/python/psi/search/PySuperMethodsSearchExecutor.java index 251f7c501340..cd68593e82a7 100644 --- a/python/src/com/jetbrains/python/psi/search/PySuperMethodsSearchExecutor.java +++ b/python/src/com/jetbrains/python/psi/search/PySuperMethodsSearchExecutor.java @@ -44,7 +44,7 @@ public class PySuperMethodsSearchExecutor implements QueryExecutor