Fix some name inferance with stubs

This commit is contained in:
Dave Halter
2018-09-05 10:29:37 +02:00
parent 39162de2a8
commit fa16c9e59d
5 changed files with 21 additions and 7 deletions

View File

@@ -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.parser_utils import clean_scope_docstring, get_doc_with_call_signature
from jedi.common import BaseContextSet, BaseContext from jedi.common import BaseContextSet, BaseContext
from jedi.evaluate.helpers import SimpleGetItemNotFound, execute_evaluated from jedi.evaluate.helpers import SimpleGetItemNotFound, execute_evaluated
from jedi.evaluate.utils import safe_property
class Context(BaseContext): 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): def __init__(self, wrapped_context):
self._wrapped_context = 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): def __getattr__(self, name):
return getattr(self._wrapped_context, name) return getattr(self._wrapped_context, name)

View File

@@ -13,7 +13,7 @@ from jedi.evaluate.arguments import AnonymousArguments
from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter, \ from jedi.evaluate.filters import ParserTreeFilter, FunctionExecutionFilter, \
ContextName, AbstractNameDefinition, ParamName ContextName, AbstractNameDefinition, ParamName
from jedi.evaluate.base_context import ContextualizedNode, NO_CONTEXTS, \ from jedi.evaluate.base_context import ContextualizedNode, NO_CONTEXTS, \
ContextSet, TreeContext, ContextWrapper ContextSet, TreeContext, TreeContextWrapper
from jedi.evaluate.lazy_context import LazyKnownContexts, LazyKnownContext, \ from jedi.evaluate.lazy_context import LazyKnownContexts, LazyKnownContext, \
LazyTreeContext LazyTreeContext
from jedi.evaluate.context.typing import TypeVar from jedi.evaluate.context.typing import TypeVar
@@ -296,7 +296,7 @@ class FunctionExecutionContext(TreeContext):
return self.get_return_values() return self.get_return_values()
class OverloadedFunctionContext(ContextWrapper): class OverloadedFunctionContext(TreeContextWrapper):
def __init__(self, function, overloaded_functions): def __init__(self, function, overloaded_functions):
super(OverloadedFunctionContext, self).__init__(function) super(OverloadedFunctionContext, self).__init__(function)
self._overloaded_functions = overloaded_functions self._overloaded_functions = overloaded_functions

View File

@@ -21,7 +21,7 @@ from jedi.evaluate import compiled
from jedi.evaluate.context.instance import \ from jedi.evaluate.context.instance import \
AbstractInstanceContext, CompiledInstance, BoundMethod, InstanceArguments AbstractInstanceContext, CompiledInstance, BoundMethod, InstanceArguments
from jedi.evaluate.base_context import ContextualizedNode, \ from jedi.evaluate.base_context import ContextualizedNode, \
NO_CONTEXTS, ContextSet, ContextWrapper NO_CONTEXTS, ContextSet, TreeContextWrapper
from jedi.evaluate.context import ClassContext, ModuleContext, \ from jedi.evaluate.context import ClassContext, ModuleContext, \
FunctionExecutionContext FunctionExecutionContext
from jedi.evaluate.context import iterable from jedi.evaluate.context import iterable
@@ -398,6 +398,7 @@ class ItemGetterCallable(object):
# TODO we need to add the contextualized context. # TODO we need to add the contextualized context.
context_set |= item_context_set.get_item(lazy_contexts[0].infer(), None) context_set |= item_context_set.get_item(lazy_contexts[0].infer(), None)
else: else:
return NO_CONTEXTS
raise NotImplementedError raise NotImplementedError
return context_set return context_set

View File

@@ -8,7 +8,7 @@ from jedi.evaluate.cache import evaluator_function_cache
from jedi.cache import memoize_method from jedi.cache import memoize_method
from jedi.parser_utils import get_call_signature_for_any from jedi.parser_utils import get_call_signature_for_any
from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \ from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \
ContextWrapper TreeContextWrapper
from jedi.evaluate.filters import AbstractTreeName, ParserTreeFilter, \ from jedi.evaluate.filters import AbstractTreeName, ParserTreeFilter, \
TreeNameDefinition, NameWrapper, MergedFilter TreeNameDefinition, NameWrapper, MergedFilter
from jedi.evaluate.context import ModuleContext, FunctionContext, \ from jedi.evaluate.context import ModuleContext, FunctionContext, \
@@ -405,7 +405,7 @@ class StubOnlyModuleContext(ModuleContext):
yield f yield f
class StubContextWithCompiled(ContextWrapper): class StubContextWithCompiled(TreeContextWrapper):
def __init__(self, stub_context, compiled_context): def __init__(self, stub_context, compiled_context):
super(StubContextWithCompiled, self).__init__(stub_context) super(StubContextWithCompiled, self).__init__(stub_context)
self._compiled_context = compiled_context self._compiled_context = compiled_context

View File

@@ -1,7 +1,10 @@
import pytest import pytest
from jedi import settings from jedi import settings
from jedi.evaluate.filters import ContextName
from jedi.evaluate.compiled import CompiledContextName from jedi.evaluate.compiled import CompiledContextName
from jedi.plugins.typeshed import StubContextWithCompiled
from jedi.evaluate.context import FunctionContext
@pytest.fixture() @pytest.fixture()
@@ -11,7 +14,10 @@ def auto_import_json(monkeypatch):
def test_base_auto_import_modules(auto_import_json, Script): def test_base_auto_import_modules(auto_import_json, Script):
loads, = Script('import json; json.loads').goto_definitions() 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): def test_auto_import_modules_imports(auto_import_json, Script):