mirror of
https://github.com/davidhalter/jedi.git
synced 2025-12-08 14:54:47 +08:00
fix indexing issues for multiple index options
This commit is contained in:
@@ -83,6 +83,7 @@ from jedi.evaluate import stdlib
|
|||||||
from jedi.evaluate import finder
|
from jedi.evaluate import finder
|
||||||
from jedi.evaluate import compiled
|
from jedi.evaluate import compiled
|
||||||
from jedi.evaluate import precedence
|
from jedi.evaluate import precedence
|
||||||
|
from jedi.evaluate.helpers import FakeStatement
|
||||||
|
|
||||||
|
|
||||||
class Evaluator(object):
|
class Evaluator(object):
|
||||||
@@ -124,6 +125,8 @@ class Evaluator(object):
|
|||||||
"""
|
"""
|
||||||
debug.dbg('eval_statement %s (%s)', stmt, seek_name)
|
debug.dbg('eval_statement %s (%s)', stmt, seek_name)
|
||||||
expression_list = stmt.expression_list()
|
expression_list = stmt.expression_list()
|
||||||
|
if isinstance(stmt, FakeStatement):
|
||||||
|
return expression_list # Already contains the results.
|
||||||
|
|
||||||
result = self.eval_expression_list(expression_list)
|
result = self.eval_expression_list(expression_list)
|
||||||
|
|
||||||
|
|||||||
@@ -180,10 +180,11 @@ class FakeArray(pr.Array):
|
|||||||
|
|
||||||
|
|
||||||
class FakeStatement(pr.Statement):
|
class FakeStatement(pr.Statement):
|
||||||
def __init__(self, expression_list, start_pos=(0, 0)):
|
def __init__(self, expression_list, start_pos=(0, 0), parent=None):
|
||||||
p = start_pos
|
p = start_pos
|
||||||
super(FakeStatement, self).__init__(FakeSubModule, expression_list, p, p)
|
super(FakeStatement, self).__init__(FakeSubModule, expression_list, p, p)
|
||||||
self.set_expression_list(expression_list)
|
self.set_expression_list(expression_list)
|
||||||
|
self.parent = parent
|
||||||
|
|
||||||
|
|
||||||
class FakeImport(pr.Import):
|
class FakeImport(pr.Import):
|
||||||
|
|||||||
@@ -127,16 +127,16 @@ class Array(use_metaclass(CachedMetaClass, pr.Base)):
|
|||||||
if [index for index in indexes if isinstance(index, Slice)]:
|
if [index for index in indexes if isinstance(index, Slice)]:
|
||||||
return [self]
|
return [self]
|
||||||
|
|
||||||
if len(indexes) == 1:
|
lookup_done = False
|
||||||
# This is indexing only one element, with a fixed index number,
|
types = []
|
||||||
# otherwise it just ignores the index (e.g. [1+1]).
|
for index in indexes:
|
||||||
index = indexes[0]
|
|
||||||
if isinstance(index, compiled.CompiledObject) \
|
if isinstance(index, compiled.CompiledObject) \
|
||||||
and isinstance(index.obj, (int, str, unicode)):
|
and isinstance(index.obj, (int, str, unicode)):
|
||||||
with common.ignored(KeyError, IndexError, TypeError):
|
with common.ignored(KeyError, IndexError, TypeError):
|
||||||
return self.get_exact_index_types(index.obj)
|
types += self.get_exact_index_types(index.obj)
|
||||||
|
lookup_done = True
|
||||||
|
|
||||||
return self.values()
|
return types if lookup_done else self.values()
|
||||||
|
|
||||||
@memoize_default(NO_DEFAULT)
|
@memoize_default(NO_DEFAULT)
|
||||||
def values(self):
|
def values(self):
|
||||||
|
|||||||
@@ -179,8 +179,9 @@ class Instance(use_metaclass(CachedMetaClass, Executable)):
|
|||||||
# TODO support slices in a more general way.
|
# TODO support slices in a more general way.
|
||||||
indexes = []
|
indexes = []
|
||||||
|
|
||||||
|
index = helpers.FakeStatement(indexes, parent=compiled.builtin)
|
||||||
try:
|
try:
|
||||||
return self.execute_subscope_by_name('__getitem__', indexes)
|
return self.execute_subscope_by_name('__getitem__', [index])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
debug.warning('No __getitem__, cannot access the array.')
|
debug.warning('No __getitem__, cannot access the array.')
|
||||||
return []
|
return []
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ def builtins_reversed(evaluator, obj, params):
|
|||||||
# would fail in certain cases like `reversed(x).__iter__` if we
|
# would fail in certain cases like `reversed(x).__iter__` if we
|
||||||
# just returned the result directly.
|
# just returned the result directly.
|
||||||
stmts = [FakeStatement([r]) for r in rev]
|
stmts = [FakeStatement([r]) for r in rev]
|
||||||
objects = (FakeArray(stmts, objects[0].parent),)
|
objects = (iterable.Array(evaluator, FakeArray(stmts, objects[0].parent)),)
|
||||||
return [er.Instance(evaluator, obj, objects)]
|
return [er.Instance(evaluator, obj, objects)]
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -276,6 +276,17 @@ class GetItem():
|
|||||||
#? str()
|
#? str()
|
||||||
GetItem("")[1]
|
GetItem("")[1]
|
||||||
|
|
||||||
|
class GetItemWithList():
|
||||||
|
def __getitem__(self, index):
|
||||||
|
return [1, 1.0, 's'][index]
|
||||||
|
|
||||||
|
#? float()
|
||||||
|
GetItemWithList()[1]
|
||||||
|
|
||||||
|
for i in 0, 2:
|
||||||
|
#? int() str()
|
||||||
|
GetItemWithList()[i]
|
||||||
|
|
||||||
# -----------------
|
# -----------------
|
||||||
# conversions
|
# conversions
|
||||||
# -----------------
|
# -----------------
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ sorted(arr)[0]
|
|||||||
|
|
||||||
#? str()
|
#? str()
|
||||||
next(reversed(arr))
|
next(reversed(arr))
|
||||||
|
next(reversed(arr))
|
||||||
|
|
||||||
# should not fail if there's no return value.
|
# should not fail if there's no return value.
|
||||||
def yielder():
|
def yielder():
|
||||||
|
|||||||
Reference in New Issue
Block a user