From 9bc46fa4fd0575964dfc20be619fa3dea7958adc Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Thu, 25 Apr 2013 14:13:25 +0400 Subject: [PATCH] Fixed regression in resolving 'namedtuple' members --- .../python/psi/impl/PyJavaClassType.java | 17 +++++++++++++---- .../python/psi/impl/PyJavaMethodType.java | 3 +-- .../python/psi/impl/PyJavaPackageType.java | 3 +-- .../python/psi/types/PyClassLikeType.java | 8 ++++++++ .../com/jetbrains/python/psi/types/PyType.java | 3 +-- .../codeInsight/stdlib/PyNamedTupleType.java | 5 ++--- .../PyStatementEffectInspection.java | 6 +++--- .../PyUnresolvedReferencesInspection.java | 4 ++-- .../psi/impl/PyTargetExpressionImpl.java | 2 +- .../impl/references/PyOperatorReference.java | 4 ++-- .../impl/references/PyQualifiedReference.java | 4 ++-- .../psi/impl/references/PyReferenceImpl.java | 2 +- .../python/psi/resolve/ResolveImportUtil.java | 2 +- .../python/psi/types/PyClassTypeImpl.java | 18 ++++++++++++++---- .../python/psi/types/PyFunctionType.java | 2 +- .../python/psi/types/PyGenericType.java | 2 +- .../python/psi/types/PyImportedModuleType.java | 4 ++-- .../python/psi/types/PyModuleType.java | 2 +- .../jetbrains/python/psi/types/PyNoneType.java | 2 +- .../python/psi/types/PyTypeChecker.java | 4 ++-- .../python/psi/types/PyTypeParser.java | 2 +- .../python/psi/types/PyTypeReferenceImpl.java | 2 +- .../python/psi/types/PyUnionType.java | 4 ++-- .../jetbrains/python/PythonAllTestsSuite.java | 1 + 24 files changed, 65 insertions(+), 41 deletions(-) diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java index 6e9166e104df..56e5ac47c285 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java @@ -33,10 +33,19 @@ public class PyJavaClassType implements PyClassLikeType { @Nullable public List resolveMember(@NotNull final String name, PyExpression location, - AccessDirection direction, - PyResolveContext resolveContext, + @NotNull AccessDirection direction, + @NotNull PyResolveContext resolveContext) { + return resolveMember(name, location, direction, resolveContext, true); + } + + @Nullable + @Override + public List resolveMember(@NotNull String name, + @Nullable PyExpression location, + @NotNull AccessDirection direction, + @NotNull PyResolveContext resolveContext, boolean inherited) { - final PsiMethod[] methods = myClass.findMethodsByName(name, true); + final PsiMethod[] methods = myClass.findMethodsByName(name, inherited); if (methods.length > 0) { ResolveResultList resultList = new ResolveResultList(); for (PsiMethod method : methods) { @@ -44,7 +53,7 @@ public class PyJavaClassType implements PyClassLikeType { } return resultList; } - final PsiField field = myClass.findFieldByName(name, true); + final PsiField field = myClass.findFieldByName(name, inherited); if (field != null) return ResolveResultList.to(field); return null; } diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java index 066b374035f8..d13a0c9d1280 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaMethodType.java @@ -43,8 +43,7 @@ public class PyJavaMethodType implements PyCallableType { public List resolveMember(@NotNull String name, @Nullable PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, - boolean inherited) { + PyResolveContext resolveContext) { return Collections.emptyList(); } diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java index 973c39b42b66..977e7d2a3573 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaPackageType.java @@ -38,8 +38,7 @@ public class PyJavaPackageType implements PyType { public List resolveMember(@NotNull String name, @Nullable PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, - boolean inherited) { + PyResolveContext resolveContext) { Project project = myPackage.getProject(); JavaPsiFacade facade = JavaPsiFacade.getInstance(project); String childName = myPackage.getQualifiedName() + "." + name; diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java index 0cd121491809..992066c0bb06 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyClassLikeType.java @@ -1,5 +1,9 @@ package com.jetbrains.python.psi.types; +import com.jetbrains.python.psi.AccessDirection; +import com.jetbrains.python.psi.PyExpression; +import com.jetbrains.python.psi.resolve.PyResolveContext; +import com.jetbrains.python.psi.resolve.RatedResolveResult; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -19,5 +23,9 @@ public interface PyClassLikeType extends PyCallableType { @NotNull List getSuperClassTypes(@NotNull TypeEvalContext context); + @Nullable + List resolveMember(@NotNull final String name, @Nullable PyExpression location, AccessDirection direction, + PyResolveContext resolveContext, boolean inherited); + boolean isValid(); } diff --git a/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java b/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java index 308ee9f0692c..bdcf257d0a4a 100644 --- a/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java +++ b/python/psi-api/src/com/jetbrains/python/psi/types/PyType.java @@ -26,14 +26,13 @@ public interface PyType { * @param location the expression of type qualifierType on which the member is being resolved (optional) * @param direction * @param resolveContext - * @param inherited look up inherited members and members provided by class providers * @return null if name definitely cannot be found (e.g. in a qualified reference), * or an empty list if name is not found but other contexts are worth looking at, * or a list of elements that define the name, a la multiResolve(). */ @Nullable List resolveMember(@NotNull final String name, @Nullable PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited); + PyResolveContext resolveContext); /** * Proposes completion variants from type's attributes. diff --git a/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java b/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java index af3eafb58b7a..858ea2712712 100644 --- a/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java +++ b/python/src/com/jetbrains/python/codeInsight/stdlib/PyNamedTupleType.java @@ -45,9 +45,8 @@ public class PyNamedTupleType extends PyClassTypeImpl implements PyCallableType public List resolveMember(@NotNull String name, @Nullable PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, - boolean inherited) { - final List classMembers = super.resolveMember(name, location, direction, resolveContext, inherited); + PyResolveContext resolveContext) { + final List classMembers = super.resolveMember(name, location, direction, resolveContext); if (classMembers != null && !classMembers.isEmpty()) { return classMembers; } diff --git a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java index 3b2e851360ad..61a7663df3c3 100644 --- a/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyStatementEffectInspection.java @@ -123,7 +123,7 @@ public class PyStatementEffectInspection extends PyInspection { PyType type = myTypeEvalContext.getType(binary.getLeftExpression()); if (type != null && !type.isBuiltin(myTypeEvalContext) && - type.resolveMember(method, null, AccessDirection.READ, resolveWithoutImplicits(), true) != null) { + type.resolveMember(method, null, AccessDirection.READ, resolveWithoutImplicits()) != null) { return true; } final PyExpression rhs = binary.getRightExpression(); @@ -131,8 +131,8 @@ public class PyStatementEffectInspection extends PyInspection { type = myTypeEvalContext.getType(rhs); if (type != null) { String rmethod = "__r" + method.substring(2); // __add__ -> __radd__ - if (!type.isBuiltin(myTypeEvalContext) && type.resolveMember(rmethod, null, AccessDirection.READ, resolveWithoutImplicits(), - true) != null) { + if (!type.isBuiltin(myTypeEvalContext) && type.resolveMember(rmethod, null, AccessDirection.READ, resolveWithoutImplicits() + ) != null) { return true; } } diff --git a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java index d695b504f2e2..d603a74677d2 100644 --- a/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java +++ b/python/src/com/jetbrains/python/inspections/PyUnresolvedReferencesInspection.java @@ -805,8 +805,8 @@ public class PyUnresolvedReferencesInspection extends PyInspection { final PyType type = context.getType(cls); if (type != null) { final List results = type.resolveMember(name, null, AccessDirection.READ, - PyResolveContext.noImplicits().withTypeEvalContext(context), - true); + PyResolveContext.noImplicits().withTypeEvalContext(context) + ); if (results != null && !results.isEmpty()) { return results.get(0).getElement(); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java index 6ff0197e7662..33f6ab67140e 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyTargetExpressionImpl.java @@ -454,7 +454,7 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl results = type.resolveMember(name, null, AccessDirection.READ, - PyResolveContext.noImplicits(), true); + PyResolveContext.noImplicits()); if (results != null && !results.isEmpty()) { return results.get(0).getElement(); } diff --git a/python/src/com/jetbrains/python/psi/impl/references/PyOperatorReference.java b/python/src/com/jetbrains/python/psi/impl/references/PyOperatorReference.java index 6f59ff424a9e..48614982b79c 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyOperatorReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyOperatorReference.java @@ -131,7 +131,7 @@ public class PyOperatorReference extends PyReferenceImpl { final PyType type = typeEvalContext.getType(object); typeEvalContext.trace("Side text is %s, type is %s", object.getText(), type); if (type != null && !(type instanceof PyTypeReference)) { - List res = type.resolveMember(name, object, AccessDirection.of(myElement), myContext, true); + List res = type.resolveMember(name, object, AccessDirection.of(myElement), myContext); if (res != null && res.size() > 0) { results.addAll(res); } @@ -141,7 +141,7 @@ public class PyOperatorReference extends PyReferenceImpl { final PyClass pyClass = ((PyClassType)type).getPyClass(); vFile = pyClass.getContainingFile().getVirtualFile(); } - type.resolveMember(name, object, AccessDirection.of(myElement), myContext, true); + type.resolveMember(name, object, AccessDirection.of(myElement), myContext); typeEvalContext.trace("Could not resolve member %s in type %s from file %s", name, type, vFile); } } 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 11d9f1a928c9..38a79b0399b9 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyQualifiedReference.java @@ -71,8 +71,8 @@ public class PyQualifiedReference extends PyReferenceImpl { qualifierType.assertValid("qualifier: " + qualifier); // resolve within the type proper AccessDirection ctx = AccessDirection.of(myElement); - final List membersOfQualifier = qualifierType.resolveMember(referencedName, qualifier, ctx, myContext, - true); + final List membersOfQualifier = qualifierType.resolveMember(referencedName, qualifier, ctx, myContext + ); if (membersOfQualifier == null) { return ret; // qualifier is positive that such name cannot exist in it } 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 c0081f5269a1..b50b16e490ac 100644 --- a/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/references/PyReferenceImpl.java @@ -302,7 +302,7 @@ public class PyReferenceImpl implements PsiReferenceEx, PsiPolyVariantReference if (PyModuleType.MODULE_MEMBERS.contains(name)) { PyType otype = builtins_cache.getObjectType(); // "object" as a closest kin to "module" if (otype != null && name != null) { - ret.addAll(otype.resolveMember(name, null, AccessDirection.READ, myContext, true)); + ret.addAll(otype.resolveMember(name, null, AccessDirection.READ, myContext)); } } } diff --git a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java index 51b4205d5ee9..466c58c6f9fa 100644 --- a/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java +++ b/python/src/com/jetbrains/python/psi/resolve/ResolveImportUtil.java @@ -274,7 +274,7 @@ public class ResolveImportUtil { PyType refType = PyReferenceExpressionImpl.getReferenceTypeFromProviders(parent, TypeEvalContext.fast(), null); if (refType != null) { final List result = refType.resolveMember(referencedName, null, AccessDirection.READ, - PyResolveContext.defaultContext(), true); + PyResolveContext.defaultContext()); if (result != null && !result.isEmpty()) { return result.get(0).getElement(); } diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index cd2ad2eaaefa..2486dfb1ecb0 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -99,6 +99,16 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { } @Nullable + @Override + public List resolveMember(@NotNull final String name, + @Nullable PyExpression location, + AccessDirection direction, + PyResolveContext resolveContext) { + return resolveMember(name, location, direction, resolveContext, true); + } + + @Nullable + @Override public List resolveMember(@NotNull final String name, @Nullable PyExpression location, AccessDirection direction, @@ -159,7 +169,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { PyClass derived_class = ((PyClassType)first_arg_type).getPyClass(); 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, true); + return new PyClassTypeImpl(base_it.next(), true).resolveMember(name, location, direction, resolveContext); } else { return null; // no base classes = super() cannot proxy anything meaningful from a base class @@ -181,8 +191,8 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { return ResolveResultList.to(superMember); } } - else if (type != null) { - final List results = type.resolveMember(name, location, direction, resolveContext, false); + if (type != null) { + final List results = type.resolveMember(name, location, direction, resolveContext); if (results != null && !results.isEmpty()) { return results; } @@ -193,7 +203,7 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { if (isDefinition() && myClass.isNewStyleClass()) { PyClassType typeType = getMetaclassType(); if (typeType != null) { - List typeMembers = typeType.resolveMember(name, location, direction, resolveContext, true); + List typeMembers = typeType.resolveMember(name, location, direction, resolveContext); if (typeMembers != null && !typeMembers.isEmpty()) { return typeMembers; } diff --git a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java index e2ff1f05826c..3bbfce984a95 100644 --- a/python/src/com/jetbrains/python/psi/types/PyFunctionType.java +++ b/python/src/com/jetbrains/python/psi/types/PyFunctionType.java @@ -37,7 +37,7 @@ public class PyFunctionType implements PyCallableType { public List resolveMember(@NotNull String name, @Nullable PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited) { + PyResolveContext resolveContext) { return Collections.emptyList(); } diff --git a/python/src/com/jetbrains/python/psi/types/PyGenericType.java b/python/src/com/jetbrains/python/psi/types/PyGenericType.java index 649bc72e3281..9c0b0245c764 100644 --- a/python/src/com/jetbrains/python/psi/types/PyGenericType.java +++ b/python/src/com/jetbrains/python/psi/types/PyGenericType.java @@ -25,7 +25,7 @@ public class PyGenericType implements PyType { public List resolveMember(@NotNull String name, @Nullable PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited) { + PyResolveContext resolveContext) { return null; } diff --git a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java index 90edfdffd197..fd4b93f5f7fe 100644 --- a/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyImportedModuleType.java @@ -38,11 +38,11 @@ public class PyImportedModuleType implements PyType { public List resolveMember(@NotNull String name, PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited) { + PyResolveContext resolveContext) { final PsiElement resolved = myImportedModule.resolve(); if (resolved instanceof PyFile) { final PyFile file = (PyFile)resolved; - return new PyModuleType(file, myImportedModule).resolveMember(name, location, direction, resolveContext, inherited); + return new PyModuleType(file, myImportedModule).resolveMember(name, location, direction, resolveContext); } else if (resolved instanceof PsiDirectory) { final List elements = Collections.singletonList(ResolveImportUtil.resolveChild(resolved, name, null, true, true)); diff --git a/python/src/com/jetbrains/python/psi/types/PyModuleType.java b/python/src/com/jetbrains/python/psi/types/PyModuleType.java index 79cb39fff107..6a16835a05c9 100644 --- a/python/src/com/jetbrains/python/psi/types/PyModuleType.java +++ b/python/src/com/jetbrains/python/psi/types/PyModuleType.java @@ -62,7 +62,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje public List resolveMember(@NotNull final String name, @Nullable PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited) { + PyResolveContext resolveContext) { for (PyModuleMembersProvider provider : Extensions.getExtensions(PyModuleMembersProvider.EP_NAME)) { final PsiElement element = provider.resolveMember(myModule, name); if (element != null) { diff --git a/python/src/com/jetbrains/python/psi/types/PyNoneType.java b/python/src/com/jetbrains/python/psi/types/PyNoneType.java index 2905f46abbe7..e34ba6f94c6c 100644 --- a/python/src/com/jetbrains/python/psi/types/PyNoneType.java +++ b/python/src/com/jetbrains/python/psi/types/PyNoneType.java @@ -24,7 +24,7 @@ public class PyNoneType implements PyType { // TODO must extend ClassType. It's public List resolveMember(@NotNull final String name, PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited) { + PyResolveContext resolveContext) { return null; } diff --git a/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java b/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java index 020f2acf4d35..eefb1636612f 100644 --- a/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java +++ b/python/src/com/jetbrains/python/psi/types/PyTypeChecker.java @@ -464,8 +464,8 @@ public class PyTypeChecker { for (PyType member : unionType.getMembers()) { if (member != null) { final PyResolveContext resolveContext = PyResolveContext.noImplicits().withTypeEvalContext(context); - final List results = member.resolveMember(name, callee, AccessDirection.READ, resolveContext, - true); + final List results = member.resolveMember(name, callee, AccessDirection.READ, resolveContext + ); if (results != null && !results.isEmpty()) { sameNameCount++; } diff --git a/python/src/com/jetbrains/python/psi/types/PyTypeParser.java b/python/src/com/jetbrains/python/psi/types/PyTypeParser.java index 0a6ea6067ada..f7e20b6c94d2 100644 --- a/python/src/com/jetbrains/python/psi/types/PyTypeParser.java +++ b/python/src/com/jetbrains/python/psi/types/PyTypeParser.java @@ -241,7 +241,7 @@ public class PyTypeParser { final String shortName = classRange.substring(qName); if (moduleType != null) { final PyResolveContext context = PyResolveContext.defaultContext(); - final List results = moduleType.resolveMember(shortName, null, AccessDirection.READ, context, true); + final List results = moduleType.resolveMember(shortName, null, AccessDirection.READ, context); if (results != null && !results.isEmpty()) { final RatedResolveResult result = results.get(0); final PsiElement resolved = result.getElement(); diff --git a/python/src/com/jetbrains/python/psi/types/PyTypeReferenceImpl.java b/python/src/com/jetbrains/python/psi/types/PyTypeReferenceImpl.java index 2077c55afb5e..1727ed264e64 100644 --- a/python/src/com/jetbrains/python/psi/types/PyTypeReferenceImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyTypeReferenceImpl.java @@ -23,7 +23,7 @@ public abstract class PyTypeReferenceImpl implements PyTypeReference { public List resolveMember(@NotNull String name, PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited) { + PyResolveContext resolveContext) { return Collections.emptyList(); } diff --git a/python/src/com/jetbrains/python/psi/types/PyUnionType.java b/python/src/com/jetbrains/python/psi/types/PyUnionType.java index 01d5ab3e7b86..466733d97b4f 100644 --- a/python/src/com/jetbrains/python/psi/types/PyUnionType.java +++ b/python/src/com/jetbrains/python/psi/types/PyUnionType.java @@ -27,12 +27,12 @@ public class PyUnionType implements PyType { public List resolveMember(@NotNull String name, PyExpression location, AccessDirection direction, - PyResolveContext resolveContext, boolean inherited) { + PyResolveContext resolveContext) { SmartList ret = new SmartList(); boolean all_nulls = true; for (PyType member : myMembers) { if (member != null) { - List result = member.resolveMember(name, null, direction, resolveContext, inherited); + List result = member.resolveMember(name, null, direction, resolveContext); if (result != null) { all_nulls = false; ret.addAll(result); diff --git a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java index bb8c2ede1e97..e1f3ee507b19 100644 --- a/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java +++ b/python/testSrc/com/jetbrains/python/PythonAllTestsSuite.java @@ -96,6 +96,7 @@ public class PythonAllTestsSuite { PyCompletionPatternsTest.class, PyCompatibilityInspectionTest.class, PyUnresolvedReferencesInspectionTest.class, + Py3UnresolvedReferencesInspectionTest.class, PyCallingNonCallableInspectionTest.class, PyUnboundLocalVariableInspectionTest.class, PyMethodOverridingInspectionTest.class,