mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
Fixed regression in resolving 'namedtuple' members
This commit is contained in:
@@ -33,10 +33,19 @@ public class PyJavaClassType implements PyClassLikeType {
|
||||
@Nullable
|
||||
public List<? extends RatedResolveResult> 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<? extends RatedResolveResult> 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;
|
||||
}
|
||||
|
||||
@@ -43,8 +43,7 @@ public class PyJavaMethodType implements PyCallableType {
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull String name,
|
||||
@Nullable PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext,
|
||||
boolean inherited) {
|
||||
PyResolveContext resolveContext) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
@@ -38,8 +38,7 @@ public class PyJavaPackageType implements PyType {
|
||||
public List<? extends RatedResolveResult> 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;
|
||||
|
||||
@@ -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<PyClassLikeType> getSuperClassTypes(@NotNull TypeEvalContext context);
|
||||
|
||||
@Nullable
|
||||
List<? extends RatedResolveResult> resolveMember(@NotNull final String name, @Nullable PyExpression location, AccessDirection direction,
|
||||
PyResolveContext resolveContext, boolean inherited);
|
||||
|
||||
boolean isValid();
|
||||
}
|
||||
|
||||
@@ -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<? extends RatedResolveResult> resolveMember(@NotNull final String name, @Nullable PyExpression location, AccessDirection direction,
|
||||
PyResolveContext resolveContext, boolean inherited);
|
||||
PyResolveContext resolveContext);
|
||||
|
||||
/**
|
||||
* Proposes completion variants from type's attributes.
|
||||
|
||||
@@ -45,9 +45,8 @@ public class PyNamedTupleType extends PyClassTypeImpl implements PyCallableType
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull String name,
|
||||
@Nullable PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext,
|
||||
boolean inherited) {
|
||||
final List<? extends RatedResolveResult> classMembers = super.resolveMember(name, location, direction, resolveContext, inherited);
|
||||
PyResolveContext resolveContext) {
|
||||
final List<? extends RatedResolveResult> classMembers = super.resolveMember(name, location, direction, resolveContext);
|
||||
if (classMembers != null && !classMembers.isEmpty()) {
|
||||
return classMembers;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -805,8 +805,8 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
|
||||
final PyType type = context.getType(cls);
|
||||
if (type != null) {
|
||||
final List<? extends RatedResolveResult> 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();
|
||||
}
|
||||
|
||||
@@ -454,7 +454,7 @@ public class PyTargetExpressionImpl extends PyPresentableElementImpl<PyTargetExp
|
||||
final PyType type = TypeEvalContext.fastStubOnly(null).getType((PyClass)parent);
|
||||
if (type != null) {
|
||||
final List<? extends RatedResolveResult> results = type.resolveMember(name, null, AccessDirection.READ,
|
||||
PyResolveContext.noImplicits(), true);
|
||||
PyResolveContext.noImplicits());
|
||||
if (results != null && !results.isEmpty()) {
|
||||
return results.get(0).getElement();
|
||||
}
|
||||
|
||||
@@ -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<? extends RatedResolveResult> res = type.resolveMember(name, object, AccessDirection.of(myElement), myContext, true);
|
||||
List<? extends RatedResolveResult> 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<? extends RatedResolveResult> membersOfQualifier = qualifierType.resolveMember(referencedName, qualifier, ctx, myContext,
|
||||
true);
|
||||
final List<? extends RatedResolveResult> membersOfQualifier = qualifierType.resolveMember(referencedName, qualifier, ctx, myContext
|
||||
);
|
||||
if (membersOfQualifier == null) {
|
||||
return ret; // qualifier is positive that such name cannot exist in it
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -274,7 +274,7 @@ public class ResolveImportUtil {
|
||||
PyType refType = PyReferenceExpressionImpl.getReferenceTypeFromProviders(parent, TypeEvalContext.fast(), null);
|
||||
if (refType != null) {
|
||||
final List<? extends RatedResolveResult> result = refType.resolveMember(referencedName, null, AccessDirection.READ,
|
||||
PyResolveContext.defaultContext(), true);
|
||||
PyResolveContext.defaultContext());
|
||||
if (result != null && !result.isEmpty()) {
|
||||
return result.get(0).getElement();
|
||||
}
|
||||
|
||||
@@ -99,6 +99,16 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType {
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull final String name,
|
||||
@Nullable PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext) {
|
||||
return resolveMember(name, location, direction, resolveContext, true);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public List<? extends RatedResolveResult> 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<PyClass> 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<? extends RatedResolveResult> results = type.resolveMember(name, location, direction, resolveContext, false);
|
||||
if (type != null) {
|
||||
final List<? extends RatedResolveResult> 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<? extends RatedResolveResult> typeMembers = typeType.resolveMember(name, location, direction, resolveContext, true);
|
||||
List<? extends RatedResolveResult> typeMembers = typeType.resolveMember(name, location, direction, resolveContext);
|
||||
if (typeMembers != null && !typeMembers.isEmpty()) {
|
||||
return typeMembers;
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class PyFunctionType implements PyCallableType {
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull String name,
|
||||
@Nullable PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext, boolean inherited) {
|
||||
PyResolveContext resolveContext) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ public class PyGenericType implements PyType {
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull String name,
|
||||
@Nullable PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext, boolean inherited) {
|
||||
PyResolveContext resolveContext) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -38,11 +38,11 @@ public class PyImportedModuleType implements PyType {
|
||||
public List<? extends RatedResolveResult> 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<PsiElement> elements = Collections.singletonList(ResolveImportUtil.resolveChild(resolved, name, null, true, true));
|
||||
|
||||
@@ -62,7 +62,7 @@ public class PyModuleType implements PyType { // Modules don't descend from obje
|
||||
public List<? extends RatedResolveResult> 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) {
|
||||
|
||||
@@ -24,7 +24,7 @@ public class PyNoneType implements PyType { // TODO must extend ClassType. It's
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull final String name,
|
||||
PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext, boolean inherited) {
|
||||
PyResolveContext resolveContext) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@@ -464,8 +464,8 @@ public class PyTypeChecker {
|
||||
for (PyType member : unionType.getMembers()) {
|
||||
if (member != null) {
|
||||
final PyResolveContext resolveContext = PyResolveContext.noImplicits().withTypeEvalContext(context);
|
||||
final List<? extends RatedResolveResult> results = member.resolveMember(name, callee, AccessDirection.READ, resolveContext,
|
||||
true);
|
||||
final List<? extends RatedResolveResult> results = member.resolveMember(name, callee, AccessDirection.READ, resolveContext
|
||||
);
|
||||
if (results != null && !results.isEmpty()) {
|
||||
sameNameCount++;
|
||||
}
|
||||
|
||||
@@ -241,7 +241,7 @@ public class PyTypeParser {
|
||||
final String shortName = classRange.substring(qName);
|
||||
if (moduleType != null) {
|
||||
final PyResolveContext context = PyResolveContext.defaultContext();
|
||||
final List<? extends RatedResolveResult> results = moduleType.resolveMember(shortName, null, AccessDirection.READ, context, true);
|
||||
final List<? extends RatedResolveResult> results = moduleType.resolveMember(shortName, null, AccessDirection.READ, context);
|
||||
if (results != null && !results.isEmpty()) {
|
||||
final RatedResolveResult result = results.get(0);
|
||||
final PsiElement resolved = result.getElement();
|
||||
|
||||
@@ -23,7 +23,7 @@ public abstract class PyTypeReferenceImpl implements PyTypeReference {
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull String name,
|
||||
PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext, boolean inherited) {
|
||||
PyResolveContext resolveContext) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
|
||||
@@ -27,12 +27,12 @@ public class PyUnionType implements PyType {
|
||||
public List<? extends RatedResolveResult> resolveMember(@NotNull String name,
|
||||
PyExpression location,
|
||||
AccessDirection direction,
|
||||
PyResolveContext resolveContext, boolean inherited) {
|
||||
PyResolveContext resolveContext) {
|
||||
SmartList<RatedResolveResult> ret = new SmartList<RatedResolveResult>();
|
||||
boolean all_nulls = true;
|
||||
for (PyType member : myMembers) {
|
||||
if (member != null) {
|
||||
List<? extends RatedResolveResult> result = member.resolveMember(name, null, direction, resolveContext, inherited);
|
||||
List<? extends RatedResolveResult> result = member.resolveMember(name, null, direction, resolveContext);
|
||||
if (result != null) {
|
||||
all_nulls = false;
|
||||
ret.addAll(result);
|
||||
|
||||
@@ -96,6 +96,7 @@ public class PythonAllTestsSuite {
|
||||
PyCompletionPatternsTest.class,
|
||||
PyCompatibilityInspectionTest.class,
|
||||
PyUnresolvedReferencesInspectionTest.class,
|
||||
Py3UnresolvedReferencesInspectionTest.class,
|
||||
PyCallingNonCallableInspectionTest.class,
|
||||
PyUnboundLocalVariableInspectionTest.class,
|
||||
PyMethodOverridingInspectionTest.class,
|
||||
|
||||
Reference in New Issue
Block a user