diff --git a/jedi/evaluate/base_context.py b/jedi/evaluate/base_context.py index aa9af86d..c7869f1e 100644 --- a/jedi/evaluate/base_context.py +++ b/jedi/evaluate/base_context.py @@ -13,6 +13,7 @@ from jedi._compatibility import Python3Method, zip_longest, unicode from jedi.parser_utils import clean_scope_docstring, get_doc_with_call_signature from jedi.common import BaseContextSet, BaseContext from jedi.evaluate.helpers import SimpleGetItemNotFound, execute_evaluated +from jedi.evaluate.utils import safe_property class Context(BaseContext): @@ -122,9 +123,15 @@ def iterate_contexts(contexts, contextualized_node=None, is_async=False): ) -class ContextWrapper(object): +class TreeContextWrapper(object): def __init__(self, wrapped_context): self._wrapped_context = wrapped_context + assert wrapped_context.tree_node + + @safe_property + def name(self): + from jedi.evaluate.filters import ContextName + return ContextName(self, self._wrapped_context.name.tree_name) def __getattr__(self, name): return getattr(self._wrapped_context, name) diff --git a/jedi/evaluate/context/function.py b/jedi/evaluate/context/function.py index 8978a869..f51a80e6 100644 --- a/jedi/evaluate/context/function.py +++ b/jedi/evaluate/context/function.py @@ -13,7 +13,7 @@ from jedi.evaluate.arguments import AnonymousArguments from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter, \ ContextName, AbstractNameDefinition, ParamName from jedi.evaluate.base_context import ContextualizedNode, NO_CONTEXTS, \ - ContextSet, TreeContext, ContextWrapper + ContextSet, TreeContext, TreeContextWrapper from jedi.evaluate.lazy_context import LazyKnownContexts, LazyKnownContext, \ LazyTreeContext from jedi.evaluate.context.typing import TypeVar @@ -296,7 +296,7 @@ class FunctionExecutionContext(TreeContext): return self.get_return_values() -class OverloadedFunctionContext(ContextWrapper): +class OverloadedFunctionContext(TreeContextWrapper): def __init__(self, function, overloaded_functions): super(OverloadedFunctionContext, self).__init__(function) self._overloaded_functions = overloaded_functions diff --git a/jedi/plugins/stdlib.py b/jedi/plugins/stdlib.py index 764b7980..5da99a48 100644 --- a/jedi/plugins/stdlib.py +++ b/jedi/plugins/stdlib.py @@ -21,7 +21,7 @@ from jedi.evaluate import compiled from jedi.evaluate.context.instance import \ AbstractInstanceContext, CompiledInstance, BoundMethod, InstanceArguments from jedi.evaluate.base_context import ContextualizedNode, \ - NO_CONTEXTS, ContextSet, ContextWrapper + NO_CONTEXTS, ContextSet, TreeContextWrapper from jedi.evaluate.context import ClassContext, ModuleContext, \ FunctionExecutionContext from jedi.evaluate.context import iterable @@ -398,6 +398,7 @@ class ItemGetterCallable(object): # TODO we need to add the contextualized context. context_set |= item_context_set.get_item(lazy_contexts[0].infer(), None) else: + return NO_CONTEXTS raise NotImplementedError return context_set diff --git a/jedi/plugins/typeshed.py b/jedi/plugins/typeshed.py index 41dcd34d..43880530 100644 --- a/jedi/plugins/typeshed.py +++ b/jedi/plugins/typeshed.py @@ -8,7 +8,7 @@ from jedi.evaluate.cache import evaluator_function_cache from jedi.cache import memoize_method from jedi.parser_utils import get_call_signature_for_any from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \ - ContextWrapper + TreeContextWrapper from jedi.evaluate.filters import AbstractTreeName, ParserTreeFilter, \ TreeNameDefinition, NameWrapper, MergedFilter from jedi.evaluate.context import ModuleContext, FunctionContext, \ @@ -405,7 +405,7 @@ class StubOnlyModuleContext(ModuleContext): yield f -class StubContextWithCompiled(ContextWrapper): +class StubContextWithCompiled(TreeContextWrapper): def __init__(self, stub_context, compiled_context): super(StubContextWithCompiled, self).__init__(stub_context) self._compiled_context = compiled_context diff --git a/test/test_settings.py b/test/test_settings.py index 4958ca45..2990061d 100644 --- a/test/test_settings.py +++ b/test/test_settings.py @@ -1,7 +1,10 @@ import pytest from jedi import settings +from jedi.evaluate.filters import ContextName from jedi.evaluate.compiled import CompiledContextName +from jedi.plugins.typeshed import StubContextWithCompiled +from jedi.evaluate.context import FunctionContext @pytest.fixture() @@ -11,7 +14,10 @@ def auto_import_json(monkeypatch): def test_base_auto_import_modules(auto_import_json, Script): loads, = Script('import json; json.loads').goto_definitions() - assert isinstance(loads._name, CompiledContextName) + assert isinstance(loads._name, ContextName) + context, = loads._name.infer() + assert isinstance(context, StubContextWithCompiled) + assert isinstance(context._wrapped_context, FunctionContext) def test_auto_import_modules_imports(auto_import_json, Script):