forked from VimPlug/jedi
Rewrite BuiltinOverwrite with ContextWrappers
This commit is contained in:
@@ -23,7 +23,6 @@ It is important to note that:
|
|||||||
from jedi import debug
|
from jedi import debug
|
||||||
from jedi import settings
|
from jedi import settings
|
||||||
from jedi._compatibility import force_unicode, is_py3
|
from jedi._compatibility import force_unicode, is_py3
|
||||||
from jedi.cache import memoize_method
|
|
||||||
from jedi.evaluate import compiled
|
from jedi.evaluate import compiled
|
||||||
from jedi.evaluate import analysis
|
from jedi.evaluate import analysis
|
||||||
from jedi.evaluate import recursion
|
from jedi.evaluate import recursion
|
||||||
@@ -35,7 +34,7 @@ from jedi.evaluate.helpers import get_int_or_none, is_string, \
|
|||||||
from jedi.evaluate.utils import safe_property, to_list
|
from jedi.evaluate.utils import safe_property, to_list
|
||||||
from jedi.evaluate.cache import evaluator_method_cache
|
from jedi.evaluate.cache import evaluator_method_cache
|
||||||
from jedi.evaluate.helpers import execute_evaluated
|
from jedi.evaluate.helpers import execute_evaluated
|
||||||
from jedi.evaluate.filters import ParserTreeFilter, BuiltinOverwrite, \
|
from jedi.evaluate.filters import ParserTreeFilter, LazyAttributeOverwrite, \
|
||||||
publish_method
|
publish_method
|
||||||
from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS, \
|
from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS, \
|
||||||
TreeContext, ContextualizedNode, iterate_contexts, HelperContextMixin
|
TreeContext, ContextualizedNode, iterate_contexts, HelperContextMixin
|
||||||
@@ -47,11 +46,10 @@ class IterableMixin(object):
|
|||||||
return ContextSet([compiled.builtin_from_name(self.evaluator, u'None')])
|
return ContextSet([compiled.builtin_from_name(self.evaluator, u'None')])
|
||||||
|
|
||||||
|
|
||||||
class GeneratorBase(BuiltinOverwrite, IterableMixin):
|
class GeneratorBase(LazyAttributeOverwrite, IterableMixin):
|
||||||
array_type = None
|
array_type = None
|
||||||
|
|
||||||
@memoize_method
|
def _get_wrapped_context(self):
|
||||||
def get_object(self):
|
|
||||||
generator, = self.evaluator.typing_module \
|
generator, = self.evaluator.typing_module \
|
||||||
.py__getattribute__('Generator') \
|
.py__getattribute__('Generator') \
|
||||||
.execute_annotation()
|
.execute_annotation()
|
||||||
@@ -196,7 +194,7 @@ class _DictMixin(object):
|
|||||||
return tuple(c_set.py__class__() for c_set in self.get_mapping_item_contexts())
|
return tuple(c_set.py__class__() for c_set in self.get_mapping_item_contexts())
|
||||||
|
|
||||||
|
|
||||||
class Sequence(BuiltinOverwrite, IterableMixin):
|
class Sequence(LazyAttributeOverwrite, IterableMixin):
|
||||||
api_type = u'instance'
|
api_type = u'instance'
|
||||||
|
|
||||||
@property
|
@property
|
||||||
@@ -206,12 +204,11 @@ class Sequence(BuiltinOverwrite, IterableMixin):
|
|||||||
def _get_generics(self):
|
def _get_generics(self):
|
||||||
return (self.merge_types_of_iterate().py__class__(),)
|
return (self.merge_types_of_iterate().py__class__(),)
|
||||||
|
|
||||||
@memoize_method
|
def _get_wrapped_context(self):
|
||||||
def get_object(self):
|
|
||||||
from jedi.evaluate.gradual.typing import GenericClass
|
from jedi.evaluate.gradual.typing import GenericClass
|
||||||
klass = compiled.builtin_from_name(self.evaluator, self.array_type)
|
klass = compiled.builtin_from_name(self.evaluator, self.array_type)
|
||||||
# TODO is this execute annotation wrong? it returns a context set?!
|
c, = GenericClass(klass, self._get_generics()).execute_annotation()
|
||||||
return GenericClass(klass, self._get_generics()).execute_annotation()
|
return c
|
||||||
|
|
||||||
def py__bool__(self):
|
def py__bool__(self):
|
||||||
return None # We don't know the length, because of appends.
|
return None # We don't know the length, because of appends.
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ from parso.tree import search_ancestor
|
|||||||
|
|
||||||
from jedi._compatibility import use_metaclass
|
from jedi._compatibility import use_metaclass
|
||||||
from jedi.evaluate import flow_analysis
|
from jedi.evaluate import flow_analysis
|
||||||
from jedi.evaluate.base_context import ContextSet, Context
|
from jedi.evaluate.base_context import ContextSet, Context, ContextWrapper, \
|
||||||
|
LazyContextWrapper
|
||||||
from jedi.parser_utils import get_parent_scope
|
from jedi.parser_utils import get_parent_scope
|
||||||
from jedi.evaluate.utils import to_list
|
from jedi.evaluate.utils import to_list
|
||||||
from jedi.evaluate.cache import evaluator_function_cache
|
from jedi.evaluate.cache import evaluator_function_cache
|
||||||
@@ -309,23 +310,23 @@ class _OverwriteMeta(type):
|
|||||||
cls.overwritten_methods = base_dct
|
cls.overwritten_methods = base_dct
|
||||||
|
|
||||||
|
|
||||||
class AbstractObjectOverwrite(use_metaclass(_OverwriteMeta, object)):
|
class _AttributeOverwriteMixin(object):
|
||||||
def get_object(self):
|
|
||||||
raise NotImplementedError
|
|
||||||
|
|
||||||
def get_filters(self, search_global=False, *args, **kwargs):
|
def get_filters(self, search_global=False, *args, **kwargs):
|
||||||
yield SpecialMethodFilter(self, self.overwritten_methods, self.get_object())
|
yield SpecialMethodFilter(self, self.overwritten_methods, self._wrapped_context)
|
||||||
|
|
||||||
for filter in self.get_object().get_filters(search_global):
|
for filter in self._wrapped_context.get_filters(search_global):
|
||||||
yield filter
|
yield filter
|
||||||
|
|
||||||
|
|
||||||
class BuiltinOverwrite(Context, AbstractObjectOverwrite):
|
class LazyAttributeOverwrite(use_metaclass(_OverwriteMeta, _AttributeOverwriteMixin,
|
||||||
|
LazyContextWrapper)):
|
||||||
def __init__(self, evaluator):
|
def __init__(self, evaluator):
|
||||||
super(BuiltinOverwrite, self).__init__(evaluator, evaluator.builtins_module)
|
self.evaluator = evaluator
|
||||||
|
|
||||||
def py__class__(self):
|
|
||||||
return self.get_object().py__class__()
|
class AttributeOverwrite(use_metaclass(_OverwriteMeta, _AttributeOverwriteMixin,
|
||||||
|
ContextWrapper)):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
def publish_method(method_name, python_version_match=None):
|
def publish_method(method_name, python_version_match=None):
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ from jedi.evaluate.context import iterable
|
|||||||
from jedi.evaluate.lazy_context import LazyTreeContext, LazyKnownContext, \
|
from jedi.evaluate.lazy_context import LazyTreeContext, LazyKnownContext, \
|
||||||
LazyKnownContexts
|
LazyKnownContexts
|
||||||
from jedi.evaluate.syntax_tree import is_string
|
from jedi.evaluate.syntax_tree import is_string
|
||||||
from jedi.evaluate.filters import AbstractObjectOverwrite, publish_method
|
from jedi.evaluate.filters import AttributeOverwrite, publish_method
|
||||||
|
|
||||||
|
|
||||||
# Copied from Python 3.6's stdlib.
|
# Copied from Python 3.6's stdlib.
|
||||||
@@ -246,14 +246,11 @@ def builtins_super(types, objects, context):
|
|||||||
return NO_CONTEXTS
|
return NO_CONTEXTS
|
||||||
|
|
||||||
|
|
||||||
class ReversedObject(AbstractObjectOverwrite, ContextWrapper):
|
class ReversedObject(AttributeOverwrite):
|
||||||
def __init__(self, reversed_obj, iter_list):
|
def __init__(self, reversed_obj, iter_list):
|
||||||
super(ReversedObject, self).__init__(reversed_obj)
|
super(ReversedObject, self).__init__(reversed_obj)
|
||||||
self._iter_list = iter_list
|
self._iter_list = iter_list
|
||||||
|
|
||||||
def get_object(self):
|
|
||||||
return self._wrapped_context
|
|
||||||
|
|
||||||
@publish_method('__iter__')
|
@publish_method('__iter__')
|
||||||
def py__iter__(self, contextualized_node=None):
|
def py__iter__(self, contextualized_node=None):
|
||||||
return self._iter_list
|
return self._iter_list
|
||||||
@@ -328,7 +325,7 @@ def builtins_isinstance(objects, types, arguments, evaluator):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class StaticMethodObject(AbstractObjectOverwrite, ContextWrapper):
|
class StaticMethodObject(AttributeOverwrite, ContextWrapper):
|
||||||
def get_object(self):
|
def get_object(self):
|
||||||
return self._wrapped_context
|
return self._wrapped_context
|
||||||
|
|
||||||
@@ -341,7 +338,7 @@ def builtins_staticmethod(functions):
|
|||||||
return ContextSet(StaticMethodObject(f) for f in functions)
|
return ContextSet(StaticMethodObject(f) for f in functions)
|
||||||
|
|
||||||
|
|
||||||
class ClassMethodObject(AbstractObjectOverwrite, ContextWrapper):
|
class ClassMethodObject(AttributeOverwrite, ContextWrapper):
|
||||||
def __init__(self, class_method_obj, function):
|
def __init__(self, class_method_obj, function):
|
||||||
super(ClassMethodObject, self).__init__(class_method_obj)
|
super(ClassMethodObject, self).__init__(class_method_obj)
|
||||||
self._function = function
|
self._function = function
|
||||||
@@ -356,7 +353,7 @@ class ClassMethodObject(AbstractObjectOverwrite, ContextWrapper):
|
|||||||
])
|
])
|
||||||
|
|
||||||
|
|
||||||
class ClassMethodGet(AbstractObjectOverwrite, ContextWrapper):
|
class ClassMethodGet(AttributeOverwrite, ContextWrapper):
|
||||||
def __init__(self, get_method, klass, function):
|
def __init__(self, get_method, klass, function):
|
||||||
super(ClassMethodGet, self).__init__(get_method)
|
super(ClassMethodGet, self).__init__(get_method)
|
||||||
self._class = klass
|
self._class = klass
|
||||||
|
|||||||
Reference in New Issue
Block a user