From 4e93fb344bcd80eb78e215d1c5ee1c48215619fd Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 27 Dec 2015 23:53:56 +0100 Subject: [PATCH] Dict.values is working now on dict literals. --- jedi/evaluate/compiled/fake/builtins.pym | 3 +++ jedi/evaluate/iterable.py | 30 +++++++++++++++++------- test/completion/types.py | 7 ++++++ 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/jedi/evaluate/compiled/fake/builtins.pym b/jedi/evaluate/compiled/fake/builtins.pym index 44f33f7c..1d5314bd 100644 --- a/jedi/evaluate/compiled/fake/builtins.pym +++ b/jedi/evaluate/compiled/fake/builtins.pym @@ -202,6 +202,9 @@ class dict(): except KeyError: return d + def values(self): + return self.__elements.values() + def setdefault(self, k, d): # TODO maybe also return the content return d diff --git a/jedi/evaluate/iterable.py b/jedi/evaluate/iterable.py index 180c5afc..c7e6e054 100644 --- a/jedi/evaluate/iterable.py +++ b/jedi/evaluate/iterable.py @@ -36,17 +36,23 @@ class IterableWrapper(tree.Base): return False @memoize_default() - def _get_names_dict(self, obj): + def _get_names_dict(self, names_dict): + try: + builtin_methods = self._builtin_methods + except AttributeError: + return names_dict + dct = {} - for names in obj.names_dict.values(): + for names in names_dict.values(): for name in names: name_str = name.value try: - method = self._builtin_methods[name_str, self.type] - parent = BuiltinMethod(self, method, name.parent) - dct[name_str] = [helpers.FakeName(name.name, parent, is_definition=True)] + method = builtin_methods[name_str, self.type] except KeyError: - dct[name.value] = [name] + dct[name_str] = [name] + else: + parent = BuiltinMethod(self, method, name.parent) + dct[name_str] = [helpers.FakeName(name_str, parent, is_definition=True)] return dct @@ -96,7 +102,7 @@ class GeneratorMixin(object): @memoize_default() def names_dicts(self, search_global=False): # is always False gen_obj = compiled.get_special_object(self._evaluator, 'GENERATOR_OBJECT') - yield self._get_names_dict(gen_obj) + yield self._get_names_dict(gen_obj.names_dict) def py__bool__(self): return True @@ -206,7 +212,9 @@ class ArrayMixin(object): scope = compiled.builtin_from_name(self._evaluator, self.type) # builtins only have one class -> [0] scopes = self._evaluator.execute_evaluated(scope, self) - return list(scopes)[0].names_dicts(search_global) + names_dicts = list(scopes)[0].names_dicts(search_global) + yield names_dicts[0] + yield self._get_names_dict(names_dicts[1]) def py__bool__(self): return None # We don't know the length, because of appends. @@ -246,6 +254,7 @@ class GeneratorComprehension(Comprehension, GeneratorMixin): pass +@has_builtin_methods class Array(IterableWrapper, ArrayMixin): mapping = {'(': 'tuple', '[': 'list', @@ -268,11 +277,14 @@ class Array(IterableWrapper, ArrayMixin): def name(self): return helpers.FakeName(self.type, parent=self) - #@register_builtin_method('values', type='dict'): @memoize_default() def dict_values(self): return unite(self._evaluator.eval_element(v) for v in self._values()) + @register_builtin_method('values', type='dict') + def py_values(self): + return set([FakeSequence(self._evaluator, [AlreadyEvaluated(self.dict_values())], 'tuple')]) + def py__getitem__(self, index): """Here the index is an int/str. Raises IndexError/KeyError.""" if self.type == 'dict': diff --git a/test/completion/types.py b/test/completion/types.py index 8bca1942..b38f8db4 100644 --- a/test/completion/types.py +++ b/test/completion/types.py @@ -79,6 +79,13 @@ dic2.popitem #? int() dic2['asdf'] +d = {'a': 3, 1.0: list} + +#? int() list +d.values()[0] +##? int() list +dict(d).values()[0] + # ----------------- # set # -----------------