From b39928188ff62ceec4b295ba0a7c936d0092f8bc Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Tue, 28 May 2019 09:48:54 +0200 Subject: [PATCH] Rewrite BuiltinOverwrite with ContextWrappers --- jedi/evaluate/context/iterable.py | 17 +++++++---------- jedi/evaluate/filters.py | 23 ++++++++++++----------- jedi/plugins/stdlib.py | 13 +++++-------- 3 files changed, 24 insertions(+), 29 deletions(-) diff --git a/jedi/evaluate/context/iterable.py b/jedi/evaluate/context/iterable.py index e81dad15..62306a26 100644 --- a/jedi/evaluate/context/iterable.py +++ b/jedi/evaluate/context/iterable.py @@ -23,7 +23,6 @@ It is important to note that: from jedi import debug from jedi import settings from jedi._compatibility import force_unicode, is_py3 -from jedi.cache import memoize_method from jedi.evaluate import compiled from jedi.evaluate import analysis 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.cache import evaluator_method_cache from jedi.evaluate.helpers import execute_evaluated -from jedi.evaluate.filters import ParserTreeFilter, BuiltinOverwrite, \ +from jedi.evaluate.filters import ParserTreeFilter, LazyAttributeOverwrite, \ publish_method from jedi.evaluate.base_context import ContextSet, NO_CONTEXTS, \ TreeContext, ContextualizedNode, iterate_contexts, HelperContextMixin @@ -47,11 +46,10 @@ class IterableMixin(object): return ContextSet([compiled.builtin_from_name(self.evaluator, u'None')]) -class GeneratorBase(BuiltinOverwrite, IterableMixin): +class GeneratorBase(LazyAttributeOverwrite, IterableMixin): array_type = None - @memoize_method - def get_object(self): + def _get_wrapped_context(self): generator, = self.evaluator.typing_module \ .py__getattribute__('Generator') \ .execute_annotation() @@ -196,7 +194,7 @@ class _DictMixin(object): 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' @property @@ -206,12 +204,11 @@ class Sequence(BuiltinOverwrite, IterableMixin): def _get_generics(self): return (self.merge_types_of_iterate().py__class__(),) - @memoize_method - def get_object(self): + def _get_wrapped_context(self): from jedi.evaluate.gradual.typing import GenericClass klass = compiled.builtin_from_name(self.evaluator, self.array_type) - # TODO is this execute annotation wrong? it returns a context set?! - return GenericClass(klass, self._get_generics()).execute_annotation() + c, = GenericClass(klass, self._get_generics()).execute_annotation() + return c def py__bool__(self): return None # We don't know the length, because of appends. diff --git a/jedi/evaluate/filters.py b/jedi/evaluate/filters.py index 4009279e..c7f94dcb 100644 --- a/jedi/evaluate/filters.py +++ b/jedi/evaluate/filters.py @@ -8,7 +8,8 @@ from parso.tree import search_ancestor from jedi._compatibility import use_metaclass 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.evaluate.utils import to_list from jedi.evaluate.cache import evaluator_function_cache @@ -309,23 +310,23 @@ class _OverwriteMeta(type): cls.overwritten_methods = base_dct -class AbstractObjectOverwrite(use_metaclass(_OverwriteMeta, object)): - def get_object(self): - raise NotImplementedError - +class _AttributeOverwriteMixin(object): 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 -class BuiltinOverwrite(Context, AbstractObjectOverwrite): +class LazyAttributeOverwrite(use_metaclass(_OverwriteMeta, _AttributeOverwriteMixin, + LazyContextWrapper)): 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): diff --git a/jedi/plugins/stdlib.py b/jedi/plugins/stdlib.py index 4eaac6fd..1b5d6ecd 100644 --- a/jedi/plugins/stdlib.py +++ b/jedi/plugins/stdlib.py @@ -28,7 +28,7 @@ from jedi.evaluate.context import iterable from jedi.evaluate.lazy_context import LazyTreeContext, LazyKnownContext, \ LazyKnownContexts 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. @@ -246,14 +246,11 @@ def builtins_super(types, objects, context): return NO_CONTEXTS -class ReversedObject(AbstractObjectOverwrite, ContextWrapper): +class ReversedObject(AttributeOverwrite): def __init__(self, reversed_obj, iter_list): super(ReversedObject, self).__init__(reversed_obj) self._iter_list = iter_list - def get_object(self): - return self._wrapped_context - @publish_method('__iter__') def py__iter__(self, contextualized_node=None): 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): return self._wrapped_context @@ -341,7 +338,7 @@ def builtins_staticmethod(functions): return ContextSet(StaticMethodObject(f) for f in functions) -class ClassMethodObject(AbstractObjectOverwrite, ContextWrapper): +class ClassMethodObject(AttributeOverwrite, ContextWrapper): def __init__(self, class_method_obj, function): super(ClassMethodObject, self).__init__(class_method_obj) 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): super(ClassMethodGet, self).__init__(get_method) self._class = klass