From 466517f3a11f65638d975ca88c51674cef025c1f Mon Sep 17 00:00:00 2001 From: Don Kirkby Date: Sun, 16 Jul 2017 08:27:17 -0700 Subject: [PATCH] Close #128 by unpacking a generator during assignment. --- .pydevproject | 5 +++ plugin/.settings/org.eclipse.jdt.core.prefs | 1 + plugin/PySrc/code_tracer.py | 7 ++++ test/PySrc/tests/code_tracer_test.py | 36 +++++++++++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 .pydevproject diff --git a/.pydevproject b/.pydevproject new file mode 100644 index 00000000..40e9f40a --- /dev/null +++ b/.pydevproject @@ -0,0 +1,5 @@ + + +Default +python 2.7 + diff --git a/plugin/.settings/org.eclipse.jdt.core.prefs b/plugin/.settings/org.eclipse.jdt.core.prefs index 74245fdb..dbf8f88f 100644 --- a/plugin/.settings/org.eclipse.jdt.core.prefs +++ b/plugin/.settings/org.eclipse.jdt.core.prefs @@ -5,6 +5,7 @@ org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annota org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve org.eclipse.jdt.core.compiler.compliance=1.8 diff --git a/plugin/PySrc/code_tracer.py b/plugin/PySrc/code_tracer.py index 3e15575d..c87a4a92 100644 --- a/plugin/PySrc/code_tracer.py +++ b/plugin/PySrc/code_tracer.py @@ -312,6 +312,13 @@ def visit_Assign(self, node): new_nodes = [] format_string = self._wrap_assignment_targets( existing_node.targets) + if (len(existing_node.targets) == 1 and + isinstance(existing_node.targets[0], Tuple)): + existing_node.value = Call(func=Name(id='tuple', ctx=Load()), + args=[existing_node.value], + keywords=[], + starargs=None, + kwargs=None) existing_node.value = self._create_bare_context_call( 'set_assignment_value', [existing_node.value]) diff --git a/test/PySrc/tests/code_tracer_test.py b/test/PySrc/tests/code_tracer_test.py index 446e423e..4d9f6fae 100644 --- a/test/PySrc/tests/code_tracer_test.py +++ b/test/PySrc/tests/code_tracer_test.py @@ -1107,6 +1107,21 @@ def test_assign_tuple_list(self): # VERIFY self.assertReportEqual(expected_report, report) + def test_assign_generator_unpacked(self): + # SETUP + code = """\ +a, b = (3*i for i in range(2)) +""" + expected_report = """\ +(a, b) = (0, 3) """ + tracer = CodeTracer() + + # EXEC + report = tracer.trace_code(code) + + # VERIFY + self.assertReportEqual(expected_report, report) + def test_assign_assignment(self): # SETUP code = """\ @@ -1122,6 +1137,27 @@ def test_assign_assignment(self): # VERIFY self.assertReportEqual(expected_report, report) + def test_assign_generator_assignment(self): + """ Can't convert to tuple for more than one assignment. """ + # SETUP + code = """\ +a, b = c = (3*i for i in range(2)) +d = a, b +e = list(c) +""" + expected_report = """\ + +d = (0, 3) +e = [] +""" + tracer = CodeTracer() + + # EXEC + report = tracer.trace_code(code) + + # VERIFY + self.assertReportEqual(expected_report, report) + def test_assign_to_anonymous_attribute(self): # SETUP code = """\