mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-07 22:44:27 +08:00
Start working on generic managers, see #1413
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
from jedi.inference.base_value import ValueSet, Value, \
|
from jedi.cache import memoize_method
|
||||||
iterator_to_value_set, LazyValueWrapper, ValueWrapper
|
from jedi.inference.utils import to_list
|
||||||
|
from jedi.inference.base_value import ValueSet
|
||||||
from jedi.inference.value.iterable import SequenceLiteralValue
|
from jedi.inference.value.iterable import SequenceLiteralValue
|
||||||
from jedi.inference.helpers import is_string
|
from jedi.inference.helpers import is_string
|
||||||
|
|
||||||
@@ -12,16 +13,62 @@ def iter_over_arguments(maybe_tuple_value, defining_context):
|
|||||||
else:
|
else:
|
||||||
yield ValueSet([maybe_tuple_value])
|
yield ValueSet([maybe_tuple_value])
|
||||||
|
|
||||||
def resolve_forward_references(value_set):
|
for value_set in iterate():
|
||||||
|
yield ValueSet(_resolve_forward_references(defining_context, value_set))
|
||||||
|
|
||||||
|
|
||||||
|
def _resolve_forward_references(context, value_set):
|
||||||
for value in value_set:
|
for value in value_set:
|
||||||
if is_string(value):
|
if is_string(value):
|
||||||
from jedi.inference.gradual.annotation import _get_forward_reference_node
|
from jedi.inference.gradual.annotation import _get_forward_reference_node
|
||||||
node = _get_forward_reference_node(defining_context, value.get_safe_value())
|
node = _get_forward_reference_node(context, value.get_safe_value())
|
||||||
if node is not None:
|
if node is not None:
|
||||||
for c in defining_context.infer_node(node):
|
for c in context.infer_node(node):
|
||||||
yield c
|
yield c
|
||||||
else:
|
else:
|
||||||
yield value
|
yield value
|
||||||
|
|
||||||
for value_set in iterate():
|
|
||||||
yield ValueSet(resolve_forward_references(value_set))
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user