From 7683c05de32591866781719b3a87505f47b5b897 Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Fri, 24 Jan 2020 22:08:16 +0100 Subject: [PATCH] Fix value/context mixup in mixed, fixes #1479 --- jedi/inference/compiled/mixed.py | 7 ++++--- test/test_inference/test_mixed.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/jedi/inference/compiled/mixed.py b/jedi/inference/compiled/mixed.py index 695ce068..f435e887 100644 --- a/jedi/inference/compiled/mixed.py +++ b/jedi/inference/compiled/mixed.py @@ -292,15 +292,16 @@ def _create(inference_state, access_handle, parent_context, *args): # TODO this __name__ is probably wrong. name = compiled_object.get_root_context().py__name__() string_names = tuple(name.split('.')) - module_context = ModuleValue( + module_value = ModuleValue( inference_state, module_node, file_io=file_io, string_names=string_names, code_lines=code_lines, is_package=compiled_object.is_package(), - ).as_context() + ) if name is not None: - inference_state.module_cache.add(string_names, ValueSet([module_context])) + inference_state.module_cache.add(string_names, ValueSet([module_value])) + module_context = module_value.as_context() else: if parent_context.tree_node.get_root_node() != module_node: # This happens e.g. when __module__ is wrong, or when using diff --git a/test/test_inference/test_mixed.py b/test/test_inference/test_mixed.py index daca6501..cf223899 100644 --- a/test/test_inference/test_mixed.py +++ b/test/test_inference/test_mixed.py @@ -5,6 +5,7 @@ if sys.version_info > (3, 5): import pytest import jedi +from jedi.inference.value import ModuleValue def interpreter(code, namespace, *args, **kwargs): @@ -40,3 +41,13 @@ def test_generics(): s = StackWrapper() print(interpreter('s.stack.pop().', locals()).complete()) + + +def test_mixed_module_cache(): + """Caused by #1479""" + interpreter = jedi.Interpreter('jedi', [{'jedi': jedi}]) + d, = interpreter.infer() + assert d.name == 'jedi' + inference_state = interpreter._inference_state + jedi_module, = inference_state.module_cache.get(('jedi',)) + assert isinstance(jedi_module, ModuleValue)