From 94a97ff8e8fa2b61c5a5180169c36b657df9462e Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Mon, 30 Dec 2019 22:59:01 +0100 Subject: [PATCH] Fix remaining issues with dict completions --- jedi/api/completion.py | 5 ++++- jedi/inference/value/instance.py | 17 ++++++++++++++++- test/test_api/test_completion.py | 13 +++++++++++-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/jedi/api/completion.py b/jedi/api/completion.py index 08f0893c..e155cc1a 100644 --- a/jedi/api/completion.py +++ b/jedi/api/completion.py @@ -101,7 +101,10 @@ class Completion: self._fuzzy = fuzzy def complete(self, fuzzy): - leaf = self._module_node.get_leaf_for_position(self._original_position, include_prefixes=True) + leaf = self._module_node.get_leaf_for_position( + self._original_position, + include_prefixes=True + ) string, start_leaf, quote = _extract_string_while_in_string(leaf, self._original_position) prefixed_completions = complete_dict( diff --git a/jedi/inference/value/instance.py b/jedi/inference/value/instance.py index 6fe5cd36..48eaa43b 100644 --- a/jedi/inference/value/instance.py +++ b/jedi/inference/value/instance.py @@ -355,7 +355,22 @@ class TreeInstance(_BaseTreeInstance): return self._get_annotated_class_object() or self.class_value def get_key_values(self): - return NO_VALUES + values = NO_VALUES + if self.array_type == 'dict': + for i, (key, instance) in enumerate(self._arguments.unpack()): + if key is None and i == 0: + values |= ValueSet.from_sets( + v.get_key_values() + for v in instance.infer() + if v.array_type == 'dict' + ) + if key: + values |= ValueSet([compiled.create_simple_object( + self.inference_state, + key, + )]) + + return values def py__simple_getitem__(self, index): if self.array_type == 'dict': diff --git a/test/test_api/test_completion.py b/test/test_api/test_completion.py index 49408fe7..23ab7496 100644 --- a/test/test_api/test_completion.py +++ b/test/test_api/test_completion.py @@ -308,8 +308,16 @@ _dict_keys_completion_tests = [ ('mixed[', 6, [r"'a\\sdf'", '1', '1.1', 'None', "b'foo'", Ellipsis]), ('mixed[1', 7, ['', '.1']), - #('casted["f', 9, ['3"', 'bar"', 'oo"']), - #('casted_mod["f', 13, ['3"', 'bar"', 'oo"', 'uuu"', 'ull"']), + ('casted["f', 9, ['3"', 'bar"', 'oo"']), + ('casted["f"', 9, ['3', 'bar', 'oo']), + ('casted["f3', 10, ['"']), + ('casted["f3"', 10, ['']), + ('casted_mod["f', 13, ['3"', 'bar"', 'oo"', 'ull"', 'uuu"']), + + ('keywords["', None, ['a"']), + ('keywords[Non', None, ['e']), + ('keywords[Fa', None, ['lse']), + ('keywords[str', None, ['', 's']), ] @@ -326,6 +334,7 @@ def test_dict_keys_completions(Script, added_code, column, expected, skip_pre_py casted_mod = dict(casted) casted_mod["fuuu"] = 8 casted_mod["full"] = 8 + keywords = {None: 1, False: 2, "a": 3} ''') line = None if isinstance(column, tuple):