Use inspection session type eval context

This commit is contained in:
Andrey Vlasovskikh
2013-05-08 19:20:34 +04:00
parent 4f0702e71d
commit e6e730d2a1
@@ -640,7 +640,7 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
}
if (qtype instanceof PyClassTypeImpl) {
PyClass cls = ((PyClassType)qtype).getPyClass();
if (overridesGetAttr(cls)) {
if (overridesGetAttr(cls, myTypeEvalContext)) {
return true;
}
if (cls.findProperty(refText) != null) {
@@ -799,13 +799,11 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
}
@Nullable
private static PsiElement resolveClassMember(@NotNull PyClass cls, @NotNull String name) {
final TypeEvalContext context = TypeEvalContext.fastStubOnly(null);
private static PsiElement resolveClassMember(@NotNull PyClass cls, @NotNull String name, @NotNull TypeEvalContext context) {
final PyType type = context.getType(cls);
if (type != null) {
final List<? extends RatedResolveResult> results = type.resolveMember(name, null, AccessDirection.READ,
PyResolveContext.noImplicits().withTypeEvalContext(context)
);
final PyResolveContext resolveContext = PyResolveContext.noImplicits().withTypeEvalContext(context);
final List<? extends RatedResolveResult> results = type.resolveMember(name, null, AccessDirection.READ, resolveContext);
if (results != null && !results.isEmpty()) {
return results.get(0).getElement();
}
@@ -813,12 +811,12 @@ public class PyUnresolvedReferencesInspection extends PyInspection {
return null;
}
private static boolean overridesGetAttr(@NotNull PyClass cls) {
PsiElement method = resolveClassMember(cls, PyNames.GETATTR);
private static boolean overridesGetAttr(@NotNull PyClass cls, @NotNull TypeEvalContext context) {
PsiElement method = resolveClassMember(cls, PyNames.GETATTR, context);
if (method != null) {
return true;
}
method = resolveClassMember(cls, PyNames.GETATTRIBUTE);
method = resolveClassMember(cls, PyNames.GETATTRIBUTE, context);
if (method != null && !PyBuiltinCache.getInstance(cls).hasInBuiltins(method)) {
return true;
}