From 1fce0b45f4920d5cf509aa2d4df674d5d6f84e83 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Thu, 30 Aug 2018 00:52:22 +0200 Subject: [PATCH] Fix subscriptlist unpacking in Generics --- jedi/evaluate/context/klass.py | 3 +++ jedi/evaluate/context/typing.py | 18 ++++++++++++++---- jedi/evaluate/syntax_tree.py | 4 +++- test/completion/pep0484_typing.py | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/jedi/evaluate/context/klass.py b/jedi/evaluate/context/klass.py index 9f7ee1ca..d479c7bd 100644 --- a/jedi/evaluate/context/klass.py +++ b/jedi/evaluate/context/klass.py @@ -220,6 +220,9 @@ class ClassContext(use_metaclass(CachedMetaClass, TreeContext)): def name(self): return ContextName(self, self.tree_node.name) + def py__name__(self): + return self.name.string_name + def py__getitem__(self, index_context_set, contextualized_node): from jedi.evaluate.context.typing import TypingClassMixin, AnnotatedClass for cls in self.py__mro__(): diff --git a/jedi/evaluate/context/typing.py b/jedi/evaluate/context/typing.py index e81aa02b..7a60a771 100644 --- a/jedi/evaluate/context/typing.py +++ b/jedi/evaluate/context/typing.py @@ -481,12 +481,22 @@ class _AbstractAnnotatedClass(ClassContext): if node.type == 'atom_expr': trailer = node.children[1] if trailer.type == 'trailer' and trailer.children[0] == '[': - type_var_set = self.parent_context.eval_node(trailer.children[1]) - for type_var in type_var_set: - if isinstance(type_var, TypeVar) and type_var not in found: - found.append(type_var) + for subscript_node in self._unpack_subscriptlist(trailer.children[1]): + type_var_set = self.parent_context.eval_node(subscript_node) + for type_var in type_var_set: + if isinstance(type_var, TypeVar) and type_var not in found: + found.append(type_var) return found + def _unpack_subscriptlist(self, subscriptlist): + if subscriptlist.type == 'subscriptlist': + for subscript in subscriptlist.children[::2]: + if subscript.type != 'subscript': + yield subscript + else: + if subscriptlist.type != 'subscript': + yield subscriptlist + def get_given_types(self): raise NotImplementedError diff --git a/jedi/evaluate/syntax_tree.py b/jedi/evaluate/syntax_tree.py index 76aa5e13..9e5cec41 100644 --- a/jedi/evaluate/syntax_tree.py +++ b/jedi/evaluate/syntax_tree.py @@ -503,7 +503,9 @@ def _eval_comparison_part(evaluator, context, left, operator, right): analysis.add(context, 'type-error-operation', operator, message % (left, right)) - return ContextSet(left, right) + result = ContextSet(left, right) + debug.dbg('Used operator %s resulting in %s', result) + return result def _remove_statements(evaluator, context, stmt, name): diff --git a/test/completion/pep0484_typing.py b/test/completion/pep0484_typing.py index 7309ded4..8b059f8c 100644 --- a/test/completion/pep0484_typing.py +++ b/test/completion/pep0484_typing.py @@ -209,7 +209,7 @@ def optional(p): as being of that type. Jedi doesn't do anything with the extra into that it can be None as well """ - #? int() + #? int() None p class ForwardReference: