From ced1a83f5b8388d1ffbca763549c761c2292e957 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Thu, 23 May 2013 23:08:28 +0200 Subject: [PATCH 1/3] Add a failing test: "a = b = 1"-style assignment --- test/completion/arrays.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/completion/arrays.py b/test/completion/arrays.py index 5ab96cae..ca020169 100644 --- a/test/completion/arrays.py +++ b/test/completion/arrays.py @@ -94,6 +94,16 @@ a4 b4 +# ----------------- +# multiple assignments +# ----------------- +a = b = 1 +#? int() +a +#? int() +b + + # ----------------- # unnessecary braces # ----------------- From b896f352adee99d84a6b4b58738bc94aae1d39d1 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Thu, 23 May 2013 23:23:03 +0200 Subject: [PATCH 2/3] Support "a = b = 1"-style assignment --- jedi/evaluate.py | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/jedi/evaluate.py b/jedi/evaluate.py index 38e0c86b..b1e8bbe8 100644 --- a/jedi/evaluate.py +++ b/jedi/evaluate.py @@ -554,16 +554,33 @@ def assign_tuples(tup, results, seek_name): 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 + # LHS of tuples can be nested, so resolve it recursively + result += find_assignments(command, r, seek_name) return result +def find_assignments(lhs, results, seek_name): + """ + Check if `seek_name` is in the left hand side `lhs` of assignment. + + `lhs` can simply be a variable (`pr.Call`) or a tuple/list (`pr.Array`) + representing the following cases:: + + a = 1 # lhs is pr.Call + (a, b) = 2 # lhs is pr.Array + + :type lhs: pr.Call + :type results: list + :type seek_name: str + """ + if isinstance(lhs, pr.Array): + return assign_tuples(lhs, results, seek_name) + elif lhs.name.names[-1] == seek_name: + return results + else: + return [] + + @recursion.RecursionDecorator @cache.memoize_default(default=()) def follow_statement(stmt, seek_name=None): @@ -587,7 +604,7 @@ def follow_statement(stmt, seek_name=None): if len(stmt.get_set_vars()) > 1 and seek_name and stmt.assignment_details: new_result = [] for ass_commands, op in stmt.assignment_details: - new_result += assign_tuples(ass_commands[0], result, seek_name) + new_result += find_assignments(ass_commands[0], result, seek_name) result = new_result return set(result) From 45bddec83a713712d2fd4395ef57586522e86204 Mon Sep 17 00:00:00 2001 From: Takafumi Arakaki Date: Thu, 23 May 2013 23:41:41 +0200 Subject: [PATCH 3/3] Add more complex assignment tests --- test/completion/arrays.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/completion/arrays.py b/test/completion/arrays.py index ca020169..3e22e933 100644 --- a/test/completion/arrays.py +++ b/test/completion/arrays.py @@ -103,6 +103,18 @@ a #? int() b +(a, b) = (c, (e, f)) = ('2', (3, 4)) +#? str() +a +#? tuple() +b +#? str() +c +#? int() +e +#? int() +f + # ----------------- # unnessecary braces