Fix some issues around stub methods

This commit is contained in:
Dave Halter
2018-11-21 23:47:40 +01:00
parent cb3cd3022d
commit 1948f23fb3
2 changed files with 35 additions and 14 deletions

View File

@@ -1,5 +1,6 @@
from jedi.evaluate.context.module import ModuleContext from jedi.evaluate.context.module import ModuleContext
from jedi.evaluate.context.klass import ClassContext from jedi.evaluate.context.klass import ClassContext
from jedi.evaluate.context.function import FunctionContext, FunctionExecutionContext from jedi.evaluate.context.function import FunctionContext, \
MethodContext, FunctionExecutionContext
from jedi.evaluate.context.instance import AnonymousInstance, BoundMethod, \ from jedi.evaluate.context.instance import AnonymousInstance, BoundMethod, \
CompiledInstance, AbstractInstanceContext, TreeInstance CompiledInstance, AbstractInstanceContext, TreeInstance

View File

@@ -11,14 +11,14 @@ from jedi.evaluate.base_context import ContextSet, iterator_to_context_set, \
from jedi.evaluate.filters import ParserTreeFilter, \ from jedi.evaluate.filters import ParserTreeFilter, \
NameWrapper, AbstractFilter, TreeNameDefinition NameWrapper, AbstractFilter, TreeNameDefinition
from jedi.evaluate.context import ModuleContext, FunctionContext, \ from jedi.evaluate.context import ModuleContext, FunctionContext, \
ClassContext MethodContext, ClassContext
from jedi.evaluate.context.function import FunctionMixin from jedi.evaluate.context.function import FunctionMixin
from jedi.evaluate.context.klass import ClassMixin from jedi.evaluate.context.klass import ClassMixin
from jedi.evaluate.context.typing import TypingModuleFilterWrapper, \ from jedi.evaluate.context.typing import TypingModuleFilterWrapper, \
TypingModuleName TypingModuleName
from jedi.evaluate.compiled.context import CompiledName, CompiledObject from jedi.evaluate.compiled.context import CompiledName, CompiledObject
from jedi.evaluate.utils import to_list from jedi.evaluate.signature import TreeSignature
from jedi.evaluate.utils import to_list, safe_property
_jedi_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) _jedi_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
_TYPESHED_PATH = os.path.join(_jedi_path, 'third_party', 'typeshed') _TYPESHED_PATH = os.path.join(_jedi_path, 'third_party', 'typeshed')
@@ -197,7 +197,12 @@ class NameWithStubMixin(object):
for stub_context in stub_contexts: for stub_context in stub_contexts:
if isinstance(stub_context, FunctionContext) \ if isinstance(stub_context, FunctionContext) \
and isinstance(actual_context, FunctionContext): and isinstance(actual_context, FunctionContext):
yield StubFunctionContext.create_cached( if isinstance(actual_context, MethodContext):
assert isinstance(stub_context, MethodContext)
cls = StubMethodContext
else:
cls = StubFunctionContext
yield cls.create_cached(
actual_context.evaluator, actual_context.evaluator,
self.parent_context, self.parent_context,
actual_context, actual_context,
@@ -403,19 +408,23 @@ class StubModuleContext(_MixedStubContextMixin, _StubContextFilterMixin, ModuleC
class StubClassContext(_StubContextFilterMixin, ClassMixin, ContextWrapper): class StubClassContext(_StubContextFilterMixin, ClassMixin, ContextWrapper):
def __init__(self, parent_context, cls, stub_context): def __init__(self, parent_context, actual_context, stub_context):
super(StubClassContext, self).__init__(cls) super(StubClassContext, self).__init__(actual_context)
self.parent_context = parent_context self.parent_context = parent_context
self.stub_context = stub_context self.stub_context = stub_context
def __getattribute__(self, name): def __getattribute__(self, name):
if name in ('py__getitem__', 'py__simple_getitem__', 'py__bases__', if name in ('py__getitem__', 'py__simple_getitem__', 'py__bases__',
'execute_annotation', 'list_type_vars', 'define_generics', 'execute_annotation', 'list_type_vars', 'get_signatures'):
'get_signatures'):
# getitem is always done in the stub class. # getitem is always done in the stub class.
return getattr(self.stub_context, name) return getattr(self.stub_context, name)
return super(StubClassContext, self).__getattribute__(name) return super(StubClassContext, self).__getattribute__(name)
def define_generics(self, type_var_dict):
if not type_var_dict:
return self
return self.stub_context.define_generics(type_var_dict)
class StubFunctionContext(FunctionMixin, ContextWrapper): class StubFunctionContext(FunctionMixin, ContextWrapper):
def __init__(self, parent_context, actual_context, stub_context): def __init__(self, parent_context, actual_context, stub_context):
@@ -426,11 +435,22 @@ class StubFunctionContext(FunctionMixin, ContextWrapper):
def get_function_execution(self, arguments=None): def get_function_execution(self, arguments=None):
return self.stub_context.get_function_execution(arguments) return self.stub_context.get_function_execution(arguments)
def __getattribute__(self, name): def get_signatures(self):
if name == 'get_signatures': return self.stub_context.get_signatures()
# getitem is always done in the stub class.
return getattr(self.stub_context, name)
return super(StubFunctionContext, self).__getattribute__(name) class StubMethodContext(StubFunctionContext):
"""
Both of the stub context and the actual context are a stub method.
"""
@safe_property
def class_context(self):
return StubClassContext.create_cached(
self.evaluator,
self.parent_context,
actual_context=self._wrapped_context.class_context,
stub_context=self.stub_context.class_context
)
class _StubOnlyContextMixin(object): class _StubOnlyContextMixin(object):