1
0
forked from VimPlug/jedi

Rewrite BuiltinOverwrite with ContextWrappers

This commit is contained in:
Dave Halter
2019-05-28 09:48:54 +02:00
parent 946869ab23
commit b39928188f
3 changed files with 24 additions and 29 deletions

View File

@@ -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.

View File

@@ -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):

View File

@@ -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