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

View File

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

View File

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