From ebab3b5c1ea1a11a78192e66f7a2fe5416d14b20 Mon Sep 17 00:00:00 2001 From: Andrey Vlasovskikh Date: Wed, 17 Apr 2013 17:22:56 +0400 Subject: [PATCH] Fixed Jython resolve test for Java superclasses --- .../python/psi/impl/PyJavaClassType.java | 11 +++++++ .../python/psi/types/PyClassLikeType.java | 6 ++++ .../python/psi/impl/PyClassImpl.java | 30 +++++++++--------- .../python/psi/types/PyClassTypeImpl.java | 31 +++++++++---------- 4 files changed, 45 insertions(+), 33 deletions(-) diff --git a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java index 368f4de8d95e..75fa31e3f3fe 100644 --- a/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java +++ b/python/pluginSrc/com/jetbrains/python/psi/impl/PyJavaClassType.java @@ -15,6 +15,7 @@ import com.jetbrains.python.psi.types.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.ArrayList; import java.util.List; /** @@ -101,6 +102,16 @@ public class PyJavaClassType implements PyClassLikeType { return myClass.getQualifiedName(); } + @NotNull + @Override + public List getSuperClassTypes(@NotNull TypeEvalContext context) { + final List result = new ArrayList(); + for (PsiClass cls : myClass.getSupers()) { + result.add(new PyJavaClassType(cls, myDefinition)); + } + return result; + } + @Override public boolean isValid() { return myClass.isValid(); 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 02afcc190a37..0cd121491809 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,7 +1,10 @@ package com.jetbrains.python.psi.types; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author vlan */ @@ -13,5 +16,8 @@ public interface PyClassLikeType extends PyCallableType { @Nullable String getClassQName(); + @NotNull + List getSuperClassTypes(@NotNull TypeEvalContext context); + boolean isValid(); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java index 40e489083e66..1fac9318508b 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyClassImpl.java @@ -1128,25 +1128,23 @@ public class PyClassImpl extends PyPresentableElementImpl implement @Override public List getAncestorTypes(@NotNull TypeEvalContext context) { final List results = new ArrayList(); - final List toProcess = new ArrayList(); + final List toProcess = new ArrayList(); final Set seen = new HashSet(); - final Set visited = new HashSet(); - toProcess.add(this); + final Set visited = new HashSet(); + final PyType thisType = context.getType(this); + if (thisType instanceof PyClassLikeType) { + toProcess.add((PyClassLikeType)thisType); + } while (!toProcess.isEmpty()) { - final PyClass cls = toProcess.remove(0); - visited.add(cls); - final List types = cls.getSuperClassTypes(context); - for (PyClassLikeType type : types) { - if (type == null || !seen.contains(type)) { - results.add(type); - seen.add(type); + final PyClassLikeType currentType = toProcess.remove(0); + visited.add(currentType); + for (PyClassLikeType superType : currentType.getSuperClassTypes(context)) { + if (superType == null || !seen.contains(superType)) { + results.add(superType); + seen.add(superType); } - if (type instanceof PyClassType) { - // TODO: process PyClassType instead of PyClass - final PyClass superClass = ((PyClassType)type).getPyClass(); - if (!visited.contains(superClass)) { - toProcess.add(superClass); - } + if (superType != null && !visited.contains(superType)) { + toProcess.add(superType); } } } diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index a2e66f1bd85a..a93cc4fb3257 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -20,7 +20,6 @@ import com.jetbrains.python.PyNames; import com.jetbrains.python.codeInsight.PyDynamicMember; import com.jetbrains.python.psi.*; import com.jetbrains.python.psi.impl.PyBuiltinCache; -import com.jetbrains.python.psi.impl.PyTypeProvider; import com.jetbrains.python.psi.impl.ResolveResultList; import com.jetbrains.python.psi.resolve.*; import com.jetbrains.python.psi.stubs.PyClassNameIndex; @@ -93,6 +92,12 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { return myClass.getQualifiedName(); } + @NotNull + @Override + public List getSuperClassTypes(@NotNull TypeEvalContext context) { + return myClass.getSuperClassTypes(context); + } + @Nullable public List resolveMember(@NotNull final String name, @Nullable PyExpression location, @@ -165,28 +170,21 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { return ResolveResultList.to(classMember); } - for (PyClassRef superClass : myClass.iterateAncestors()) { - final PyClass pyClass = superClass.getPyClass(); - final PsiElement element = superClass.getElement(); - final PyClassType type = superClass.getType(); - if (pyClass != null) { - PsiElement superMember = resolveClassMember(pyClass, myIsDefinition, name, null); + for (PyClassLikeType type : myClass.getAncestorTypes(resolveContext.getTypeEvalContext())) { + if (type instanceof PyClassType) { + PsiElement superMember = resolveClassMember(((PyClassType)type).getPyClass(), myIsDefinition, name, null); if (superMember != null) { return ResolveResultList.to(superMember); } } - else if (element != null) { - for (PyTypeProvider typeProvider : Extensions.getExtensions(PyTypeProvider.EP_NAME)) { - final PyType refType = typeProvider.getReferenceType(element, resolveContext.getTypeEvalContext(), myClass); - if (refType != null) { - return refType.resolveMember(name, location, direction, resolveContext); - } + if (type != null) { + final List results = type.resolveMember(name, location, direction, resolveContext); + if (results != null && !results.isEmpty()) { + return results; } } - else if (type != null) { - return type.resolveMember(name, location, direction, resolveContext); - } } + if (isDefinition() && myClass.isNewStyleClass()) { PyClassType typeType = getMetaclassType(); if (typeType != null) { @@ -214,7 +212,6 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { } } - return Collections.emptyList(); }