1
0
forked from VimPlug/jedi

Understanding implicit tuple returns (testlist)

This commit is contained in:
Dave Halter
2014-10-25 12:50:51 +02:00
parent 97a102bd24
commit 7532f52cdd
3 changed files with 11 additions and 7 deletions

View File

@@ -180,6 +180,7 @@ class Evaluator(object):
return types
def eval_element(self, element):
debug.dbg('eval_element %s', element)
if isinstance(element, (pr.Name, pr.Literal)) or pr.is_node(element, 'atom'):
return self._eval_atom(element)
elif element.type == python_symbols.power:
@@ -190,7 +191,7 @@ class Evaluator(object):
types = self._eval_trailer(types, trailer)
return types
elif pr.is_node(element, 'testlist_star_expr'):
elif pr.is_node(element, 'testlist_star_expr', 'testlist'):
# The implicit tuple in statements.
return [iterable.Array(self, element, pr.Array.TUPLE)]
else:

View File

@@ -137,13 +137,13 @@ class Array(use_metaclass(CachedMetaClass, IterableWrapper)):
return None # We don't know the length, because of appends.
@memoize_default(NO_DEFAULT)
def get_index_types(self, index=()):
def get_index_types(self, evaluator, index=()):
"""
Get the types of a specific index or all, if not given.
:param index: A subscriptlist node (or subnode).
"""
indexes = create_indexes_or_slices(self._evaluator, index)
indexes = create_indexes_or_slices(evaluator, index)
lookup_done = False
types = []
for index in indexes:
@@ -213,7 +213,7 @@ class Array(use_metaclass(CachedMetaClass, IterableWrapper)):
return self._items()
def _items(self):
if pr.is_node(self._array_node, 'testlist_comp') or pr.is_node(self._array_node, 'testlist_star_expr'):
if pr.is_node(self._array_node, 'testlist_comp', 'testlist_star_expr', 'testlist'):
return self._array_node.children[::2]
elif pr.is_node(self._array_node, 'dictorsetmaker'):
kv = []

View File

@@ -56,9 +56,12 @@ from jedi.parser.pytree import python_symbols, type_repr
SCOPE_CONTENTS = 'asserts', 'subscopes', 'imports', 'statements', 'returns'
def is_node(node, symbol_name):
return isinstance(node, Node) \
and getattr(python_symbols, symbol_name) == node.type
def is_node(node, *symbol_names):
if isinstance(node, Node):
for symbol_name in symbol_names:
if getattr(python_symbols, symbol_name) == node.type:
return True
return False
def filter_after_position(names, position):