From 4fca7bd22d530402019d359f61908edf0b62efca Mon Sep 17 00:00:00 2001 From: Dave Halter Date: Sun, 8 Dec 2019 20:35:00 +0100 Subject: [PATCH] Start working on generic managers, see #1413 --- jedi/inference/gradual/generics.py | 75 ++++++++++++++++++++++++------ 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/jedi/inference/gradual/generics.py b/jedi/inference/gradual/generics.py index 07d47274..2d71bc86 100644 --- a/jedi/inference/gradual/generics.py +++ b/jedi/inference/gradual/generics.py @@ -1,5 +1,6 @@ -from jedi.inference.base_value import ValueSet, Value, \ - iterator_to_value_set, LazyValueWrapper, ValueWrapper +from jedi.cache import memoize_method +from jedi.inference.utils import to_list +from jedi.inference.base_value import ValueSet from jedi.inference.value.iterable import SequenceLiteralValue from jedi.inference.helpers import is_string @@ -12,16 +13,62 @@ def iter_over_arguments(maybe_tuple_value, defining_context): else: yield ValueSet([maybe_tuple_value]) - def resolve_forward_references(value_set): - for value in value_set: - if is_string(value): - from jedi.inference.gradual.annotation import _get_forward_reference_node - node = _get_forward_reference_node(defining_context, value.get_safe_value()) - if node is not None: - for c in defining_context.infer_node(node): - yield c - else: - yield value - for value_set in iterate(): - yield ValueSet(resolve_forward_references(value_set)) + yield ValueSet(_resolve_forward_references(defining_context, value_set)) + + +def _resolve_forward_references(context, value_set): + for value in value_set: + if is_string(value): + from jedi.inference.gradual.annotation import _get_forward_reference_node + node = _get_forward_reference_node(context, value.get_safe_value()) + if node is not None: + for c in context.infer_node(node): + yield c + else: + yield value + + +class LazyGenericManager(object): + def __init__(self, context_of_index, index_value): + self._context_of_index = context_of_index + self._index_value = index_value + + @memoize_method + def __getitem__(self, index): + return self._list()[index]() + + def __len__(self): + return len(self._list()) + + @memoize_method + @to_list + def _list(self): + if isinstance(self._index_value, SequenceLiteralValue): + for lazy_value in self._index_value.py__iter__(contextualized_node=None): + yield lambda: _resolve_forward_references( + self._context_of_index, + lazy_value.infer() + ) + else: + yield lambda: ValueSet([ + _resolve_forward_references(self._context_of_index, self._index_value) + ]) + + def __iter__(self): + return iter(self._iterate()) + + +class ListGenericManager(object): + def __init__(self, lst): + self._lst = lst + + def __getitem__(self, index): + return self._lst[index] + + def __len__(self): + return len(self._lst) + + def __iter__(self): + for value_set in self._lst: + yield lambda: value_set