From a5e9977e94b8a3102d703f1f4e1dfde593e383ec Mon Sep 17 00:00:00 2001 From: David Halter Date: Fri, 8 Feb 2013 18:46:56 +0100 Subject: [PATCH] fix first tuple assignments --- jedi/dynamic.py | 2 +- jedi/evaluate.py | 59 ++++++++++++++++----------------- jedi/evaluate_representation.py | 4 +-- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/jedi/dynamic.py b/jedi/dynamic.py index cb8e8fcf..aecd18f6 100644 --- a/jedi/dynamic.py +++ b/jedi/dynamic.py @@ -418,7 +418,7 @@ def related_names(definitions, search_name, mods): else: calls = _scan_array(stmt.get_commands(), search_name) for d in stmt.assignment_details: - calls += _scan_array(d[1], search_name) + calls += _scan_array(d[0], search_name) for call in calls: names += check_call(call) return names diff --git a/jedi/evaluate.py b/jedi/evaluate.py index b178e15a..f7f4b218 100644 --- a/jedi/evaluate.py +++ b/jedi/evaluate.py @@ -483,41 +483,38 @@ def assign_tuples(tup, results, seek_name): def eval_results(index): types = [] for r in results: - if hasattr(r, "get_exact_index_types"): - try: - types += r.get_exact_index_types(index) - except IndexError: - pass - else: + try: + func = r.get_exact_index_types + except AttributeError: debug.warning("invalid tuple lookup %s of result %s in %s" % (tup, results, seek_name)) - + else: + try: + types += func(index) + except IndexError: + pass return types result = [] - if tup.type == pr.Array.NOARRAY: - # Here we have unnessecary braces, which we just remove. - arr = tup.get_only_subelement() - if type(arr) == pr.Call: - if arr.name.names[-1] == seek_name: - result = results - else: - result = assign_tuples(arr, results, seek_name) - else: - for i, t in enumerate(tup): - # Used in assignments. There is just one call and no other things, - # therefore we can just assume, that the first part is important. - if len(t) != 1: - raise AttributeError('Array length should be 1') - t = t[0] + for i, stmt in enumerate(tup): + # Used in assignments. There is just one call and no other things, + # therefore we can just assume, that the first part is important. + command = stmt.get_commands()[0] - # Check the left part, if there are still tuples in it or a Call. - if isinstance(t, pr.Array): - # These are "sub"-tuples. - result += assign_tuples(t, eval_results(i), seek_name) - else: - if t.name.names[-1] == seek_name: - result += eval_results(i) + if tup.type == pr.Array.NOARRAY: + + # unnessecary braces -> just remove. + r = results + else: + r = eval_results(i) + + # are there still tuples or is it just a Call. + if isinstance(command, pr.Array): + # These are "sub"-tuples. + result += assign_tuples(command, r, seek_name) + else: + if command.name.names[-1] == seek_name: + result += r return result @@ -549,8 +546,8 @@ def follow_statement(stmt, seek_name=None): print(seek_name, stmt, stmt.assignment_details) if len(stmt.get_set_vars()) > 1 and seek_name and stmt.assignment_details: new_result = [] - for set_vars, op in stmt.assignment_details: - new_result += assign_tuples(set_vars, result, seek_name) + for ass_commands, op in stmt.assignment_details: + new_result += assign_tuples(ass_commands[0], result, seek_name) result = new_result return set(result) diff --git a/jedi/evaluate_representation.py b/jedi/evaluate_representation.py index 6541be72..1d627b53 100644 --- a/jedi/evaluate_representation.py +++ b/jedi/evaluate_representation.py @@ -630,10 +630,10 @@ class Execution(Executable): # Normal arguments (including key arguments). else: if stmt.assignment_detail: - tok, key_arr = stmt.assignment_detail[0] + key_arr, op = stmt.assignment_detail[0] # named parameter if key_arr and isinstance(key_arr[0], pr.Call): - yield tok[0].name, stmt + yield op[0].name, stmt else: yield None, stmt