diff --git a/jedi/api/__init__.py b/jedi/api/__init__.py index 0dfa2c1f..8a239051 100644 --- a/jedi/api/__init__.py +++ b/jedi/api/__init__.py @@ -38,7 +38,7 @@ from jedi.evaluate.syntax_tree import tree_name_to_contexts from jedi.evaluate.context import ModuleContext from jedi.evaluate.base_context import ContextSet from jedi.evaluate.context.iterable import unpack_tuple_to_dict -from jedi.evaluate.gradual.stub_context import try_stubs_to_actual_context_set, \ +from jedi.evaluate.gradual.conversion import try_stubs_to_actual_context_set, \ try_stub_to_actual_names from jedi.evaluate.gradual.utils import load_proper_stub_module diff --git a/jedi/api/classes.py b/jedi/api/classes.py index 6310ff7c..513bfbf7 100644 --- a/jedi/api/classes.py +++ b/jedi/api/classes.py @@ -16,7 +16,7 @@ from jedi.evaluate.imports import ImportName from jedi.evaluate.names import ParamName from jedi.evaluate.context import FunctionExecutionContext, MethodContext from jedi.evaluate.gradual.typeshed import StubModuleContext -from jedi.evaluate.gradual.stub_context import name_to_stub, stub_to_actual_context_set +from jedi.evaluate.gradual.conversion import name_to_stub, stub_to_actual_context_set from jedi.api.keywords import KeywordName diff --git a/jedi/evaluate/__init__.py b/jedi/evaluate/__init__.py index 508f35b3..e7aa53da 100644 --- a/jedi/evaluate/__init__.py +++ b/jedi/evaluate/__init__.py @@ -84,7 +84,7 @@ from jedi.evaluate.context import ClassContext, FunctionContext, \ from jedi.evaluate.context.iterable import CompForContext from jedi.evaluate.syntax_tree import eval_trailer, eval_expr_stmt, \ eval_node, check_tuple_assignments -from jedi.evaluate.gradual.stub_context import try_stub_to_actual_names, \ +from jedi.evaluate.gradual.conversion import try_stub_to_actual_names, \ stub_to_actual_context_set diff --git a/jedi/evaluate/gradual/conversion.py b/jedi/evaluate/gradual/conversion.py new file mode 100644 index 00000000..5e7fc32f --- /dev/null +++ b/jedi/evaluate/gradual/conversion.py @@ -0,0 +1,93 @@ +from jedi.evaluate.base_context import ContextSet, \ + NO_CONTEXTS +from jedi.evaluate.utils import to_list +from jedi.evaluate.gradual.stub_context import StubModuleContext + + +def stub_to_actual_context_set(stub_context, ignore_compiled=False): + stub_module = stub_context.get_root_context() + if not stub_module.is_stub(): + return ContextSet([stub_context]) + + qualified_names = stub_context.get_qualified_names() + return _infer_from_stub(stub_module, qualified_names, ignore_compiled) + + +def _infer_from_stub(stub_module, qualified_names, ignore_compiled): + if qualified_names is None: + return NO_CONTEXTS + + assert isinstance(stub_module, StubModuleContext), stub_module + non_stubs = stub_module.non_stub_context_set + if ignore_compiled: + non_stubs = non_stubs.filter(lambda c: not c.is_compiled()) + for name in qualified_names: + non_stubs = non_stubs.py__getattribute__(name) + return non_stubs + + +def try_stubs_to_actual_context_set(stub_contexts, prefer_stub_to_compiled=False): + return ContextSet.from_sets( + stub_to_actual_context_set(stub_context, ignore_compiled=prefer_stub_to_compiled) + or ContextSet([stub_context]) + for stub_context in stub_contexts + ) + + +@to_list +def try_stub_to_actual_names(names, prefer_stub_to_compiled=False): + for name in names: + module = name.get_root_context() + if not module.is_stub(): + yield name + continue + + name_list = name.get_qualified_names() + if name_list is None: + contexts = NO_CONTEXTS + else: + contexts = _infer_from_stub( + module, + name_list[:-1], + ignore_compiled=prefer_stub_to_compiled, + ) + if contexts: + if name_list: + for new_name in contexts.py__getattribute__(name_list[-1], is_goto=True): + yield new_name + else: + for c in contexts: + yield c.name + else: + yield name + + +def _load_stub_module(module): + if module.is_stub(): + return module + from jedi.evaluate.gradual.typeshed import _try_to_load_stub + return _try_to_load_stub( + module.evaluator, + ContextSet([module]), + parent_module_context=None, + import_names=module.string_names + ) + + +def name_to_stub(name): + return ContextSet.from_sets(to_stub(c) for c in name.infer()) + + +def to_stub(context): + if context.is_stub(): + return ContextSet([context]) + + qualified_names = context.get_qualified_names() + stub_module = _load_stub_module(context.get_root_context()) + if stub_module is None or qualified_names is None: + return NO_CONTEXTS + + stub_contexts = ContextSet([stub_module]) + for name in qualified_names: + stub_contexts = stub_contexts.py__getattribute__(name) + return stub_contexts diff --git a/jedi/evaluate/gradual/stub_context.py b/jedi/evaluate/gradual/stub_context.py index 82231c9e..5db0b192 100644 --- a/jedi/evaluate/gradual/stub_context.py +++ b/jedi/evaluate/gradual/stub_context.py @@ -1,12 +1,10 @@ import os -from jedi.evaluate.base_context import ContextWrapper, ContextSet, \ - NO_CONTEXTS +from jedi.evaluate.base_context import ContextWrapper from jedi.evaluate.context.klass import ClassMixin, ClassContext from jedi.evaluate.context.module import ModuleContext from jedi.evaluate.filters import ParserTreeFilter, \ TreeNameDefinition -from jedi.evaluate.utils import to_list from jedi.evaluate.gradual.typing import TypingModuleFilterWrapper @@ -128,92 +126,3 @@ class StubFilter(ParserTreeFilter): class VersionInfo(ContextWrapper): pass - - -def stub_to_actual_context_set(stub_context, ignore_compiled=False): - stub_module = stub_context.get_root_context() - if not stub_module.is_stub(): - return ContextSet([stub_context]) - - qualified_names = stub_context.get_qualified_names() - return _infer_from_stub(stub_module, qualified_names, ignore_compiled) - - -def _infer_from_stub(stub_module, qualified_names, ignore_compiled): - if qualified_names is None: - return NO_CONTEXTS - - assert isinstance(stub_module, StubModuleContext), stub_module - non_stubs = stub_module.non_stub_context_set - if ignore_compiled: - non_stubs = non_stubs.filter(lambda c: not c.is_compiled()) - for name in qualified_names: - non_stubs = non_stubs.py__getattribute__(name) - return non_stubs - - -def try_stubs_to_actual_context_set(stub_contexts, prefer_stub_to_compiled=False): - return ContextSet.from_sets( - stub_to_actual_context_set(stub_context, ignore_compiled=prefer_stub_to_compiled) - or ContextSet([stub_context]) - for stub_context in stub_contexts - ) - - -@to_list -def try_stub_to_actual_names(names, prefer_stub_to_compiled=False): - for name in names: - module = name.get_root_context() - if not module.is_stub(): - yield name - continue - - name_list = name.get_qualified_names() - if name_list is None: - contexts = NO_CONTEXTS - else: - contexts = _infer_from_stub( - module, - name_list[:-1], - ignore_compiled=prefer_stub_to_compiled, - ) - if contexts: - if name_list: - for new_name in contexts.py__getattribute__(name_list[-1], is_goto=True): - yield new_name - else: - for c in contexts: - yield c.name - else: - yield name - - -def _load_stub_module(module): - if module.is_stub(): - return module - from jedi.evaluate.gradual.typeshed import _try_to_load_stub - return _try_to_load_stub( - module.evaluator, - ContextSet([module]), - parent_module_context=None, - import_names=module.string_names - ) - - -def name_to_stub(name): - return ContextSet.from_sets(to_stub(c) for c in name.infer()) - - -def to_stub(context): - if context.is_stub(): - return ContextSet([context]) - - qualified_names = context.get_qualified_names() - stub_module = _load_stub_module(context.get_root_context()) - if stub_module is None or qualified_names is None: - return NO_CONTEXTS - - stub_contexts = ContextSet([stub_module]) - for name in qualified_names: - stub_contexts = stub_contexts.py__getattribute__(name) - return stub_contexts diff --git a/jedi/evaluate/names.py b/jedi/evaluate/names.py index 1226bb23..7fe6c165 100644 --- a/jedi/evaluate/names.py +++ b/jedi/evaluate/names.py @@ -93,7 +93,7 @@ class ContextName(ContextNameMixin, AbstractTreeName): self._context = context def goto(self): - from jedi.evaluate.gradual.stub_context import try_stub_to_actual_names + from jedi.evaluate.gradual.conversion import try_stub_to_actual_names return try_stub_to_actual_names([self._context.name]) diff --git a/test/test_evaluate/test_compiled.py b/test/test_evaluate/test_compiled.py index 0930c989..b80b9add 100644 --- a/test/test_evaluate/test_compiled.py +++ b/test/test_evaluate/test_compiled.py @@ -4,7 +4,7 @@ import pytest from jedi.evaluate import compiled from jedi.evaluate.helpers import execute_evaluated -from jedi.evaluate.gradual.stub_context import stub_to_actual_context_set +from jedi.evaluate.gradual.conversion import stub_to_actual_context_set def test_simple(evaluator, environment): diff --git a/test/test_evaluate/test_imports.py b/test/test_evaluate/test_imports.py index d0b65031..eead0d49 100644 --- a/test/test_evaluate/test_imports.py +++ b/test/test_evaluate/test_imports.py @@ -12,7 +12,7 @@ from jedi._compatibility import find_module_py33, find_module from jedi.evaluate import compiled from jedi.evaluate import imports from jedi.api.project import Project -from jedi.evaluate.gradual.stub_context import stub_to_actual_context_set +from jedi.evaluate.gradual.conversion import stub_to_actual_context_set from ..helpers import cwd_at, get_example_dir, test_dir, root_dir THIS_DIR = os.path.dirname(__file__)