From ae1b7f7d17ed77706bd8a428c6ae0f8aa77509eb Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Fri, 26 Feb 2016 17:22:18 +0300 Subject: [PATCH] Implement todos in PyClassTypeImpl and PyJavaClassType which are connected with members and ancestors --- .../python/psi/impl/PyJavaClassType.java | 40 +++++++++++++++++-- .../python/psi/types/PyClassTypeImpl.java | 4 +- 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/python/pluginJava/com/jetbrains/python/psi/impl/PyJavaClassType.java b/python/pluginJava/com/jetbrains/python/psi/impl/PyJavaClassType.java index 670764bdf46a..ef2526744022 100644 --- a/python/pluginJava/com/jetbrains/python/psi/impl/PyJavaClassType.java +++ b/python/pluginJava/com/jetbrains/python/psi/impl/PyJavaClassType.java @@ -151,7 +151,23 @@ public class PyJavaClassType implements PyClassLikeType { @Override public void visitMembers(@NotNull final Processor processor, final boolean inherited, @NotNull TypeEvalContext context) { - // TODO: Implement + for (PsiMethod method : myClass.getAllMethods()) { + processor.process(method); + } + + for (PsiField field : myClass.getAllFields()) { + processor.process(field); + } + + if (!inherited) { + return; + } + + for (PyClassLikeType type : getAncestorTypes(context)) { + if (type != null) { + type.visitMembers(processor, false, context); + } + } } @NotNull @@ -181,8 +197,26 @@ public class PyJavaClassType implements PyClassLikeType { @NotNull @Override public List getAncestorTypes(@NotNull final TypeEvalContext context) { - // TODO: Implement - return Collections.emptyList(); + final List result = new ArrayList<>(); + + final Deque deque = new LinkedList<>(); + final Set visited = new HashSet<>(); + + deque.addAll(Arrays.asList(myClass.getSupers())); + + while (!deque.isEmpty()) { + final PsiClass current = deque.pollFirst(); + + if (current == null || !visited.add(current)) { + continue; + } + + result.add(new PyJavaClassType(current, myDefinition)); + + deque.addAll(Arrays.asList(current.getSupers())); + } + + return result; } @Override diff --git a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java index cf9546276d06..0ebe4ffea75f 100644 --- a/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java +++ b/python/src/com/jetbrains/python/psi/types/PyClassTypeImpl.java @@ -526,7 +526,9 @@ public class PyClassTypeImpl extends UserDataHolderBase implements PyClassType { myClass.visitMethods(new MyProcessorWrapper(processor), false, context); myClass.visitClassAttributes(new MyProcessorWrapper(processor), false, context); - // TODO: accept instance attributes as well + for (PyTargetExpression expression : myClass.getInstanceAttributes()) { + processor.process(expression); + } if (!inherited) { return;