implement slicing for __getitem__ with interpreter

This commit is contained in:
Dave Halter
2014-04-04 15:09:25 +02:00
parent 09854ae6ca
commit 79e2ec85cc
3 changed files with 39 additions and 18 deletions

View File

@@ -99,15 +99,15 @@ class CompiledObject(Base):
self.obj.__getitem__ self.obj.__getitem__
result = [] result = []
from jedi.evaluate import iterable
for typ in index_types: for typ in index_types:
if isinstance(typ, iterable.Slice): index = None
result.append(self)
else:
try: try:
new = self.obj[typ.obj] index = typ.obj
new = self.obj[index]
except (KeyError, IndexError, TypeError, AttributeError): except (KeyError, IndexError, TypeError, AttributeError):
pass # just try, we don't care if it fails. # Just try, we don't care if it fails, except for slices.
if isinstance(index, slice):
result.append(self)
else: else:
result.append(CompiledObject(new)) result.append(CompiledObject(new))
if not result: if not result:

View File

@@ -425,17 +425,30 @@ class Slice(object):
self._stop = stop self._stop = stop
self._step = step self._step = step
def start(self): @property
return self._result(self._start) def obj(self):
"""
Imitate CompiledObject.obj behavior and return a ``builtin.slice()``
object.
"""
def get(element):
if element is None:
return None
def stop(self): result = self._evaluator.process_precedence_element(element)
return self._result(self._stop) if len(result) != 1:
# We want slices to be clear defined with just one type.
# Otherwise we will return an empty slice object.
raise IndexError
try:
return result[0].obj
except AttributeError:
return None
def step(self): try:
return self._result(self._step) return slice(get(self._start), get(self._stop), get(self._step))
except IndexError:
def _result(self, element): return slice(None, None, None)
return self._evaluator.process_precedence_element(element)
def create_indexes_or_slices(evaluator, index_array): def create_indexes_or_slices(evaluator, index_array):

View File

@@ -63,3 +63,11 @@ class TestInterpreterAPI(TestCase):
self.check_interpreter_complete('array[2].upper', self.check_interpreter_complete('array[2].upper',
locals(), locals(),
['upper']) ['upper'])
def test_slice(self):
class Foo():
bar = []
baz = 'xbarx'
self.check_interpreter_complete('getattr(Foo, baz[1:-1]).append',
locals(),
['append'])