From 7eb9210b0c55f9fd82ef1a44d9d9f4a251b9832c Mon Sep 17 00:00:00 2001 From: rocky Date: Thu, 13 Oct 2016 06:37:53 -0400 Subject: [PATCH] Start to track line breaks on lists --- test/bytecode_3.4/08_source_linebreaks.pyc | Bin 0 -> 415 bytes .../stmts/08_source_linebreaks.py | 14 ++++ uncompyle6/semantics/pysource.py | 79 +++++++++++++----- 3 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 test/bytecode_3.4/08_source_linebreaks.pyc create mode 100644 test/simple_source/stmts/08_source_linebreaks.py diff --git a/test/bytecode_3.4/08_source_linebreaks.pyc b/test/bytecode_3.4/08_source_linebreaks.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aedff6fdacafc1ca0dbc89cd3cc3b2768e30ae7d GIT binary patch literal 415 zcmYk&%}T>S5C`!8ZjvTV(@(8deS#ubPsM|XzJM16A(xVNRvSz|$fls+&8P82e282< z<>CW)sWZic3-g=(7?@$dqh|Oy+dkYV;0ym&kN4Lc_KitB5I_oJIs!SIT#&~}gKC_7 zP=ImFC3VCKa?MvEr~$*r2-F0%Ky6S5)CKiGd!T(#A9MgZ1P$=mL#$yO7{F+}Ybb7W zH$1+N>+|$!o^ccv&xts+MUoejEM1!0I511vZA+C@nx9KGtvt?^Be+6M@P$CA3!%^u zBB3d?gtpKTx`O;fwdFN*V|TSKY^h#iXPV@tx6adL@qv86B|CmjZMs-zW@1;Hd}cKDiuUc3MR literal 0 HcmV?d00001 diff --git a/test/simple_source/stmts/08_source_linebreaks.py b/test/simple_source/stmts/08_source_linebreaks.py new file mode 100644 index 00000000..b24d8333 --- /dev/null +++ b/test/simple_source/stmts/08_source_linebreaks.py @@ -0,0 +1,14 @@ +# Show off indentation based on source code indentation +# New lines are influenced by source-code new lines +opts = {'highlight': + True, + 'start_line': + -1, + 'end_line': + None, 'a': 1, 'b': 2, +} +x = 5 +bar = (1,2,3,4,x,6,7,8,9, + 10,11,12,13,14,15,16, + 17,18) +print(opts, bar) diff --git a/uncompyle6/semantics/pysource.py b/uncompyle6/semantics/pysource.py index b3a9b244..5cb3b603 100644 --- a/uncompyle6/semantics/pysource.py +++ b/uncompyle6/semantics/pysource.py @@ -1626,7 +1626,6 @@ class SourceWalker(GenericASTTraversal, object): self.prec = 100 self.indentMore(INDENT_PER_LEVEL) - line_seperator = ',\n' + self.indent sep = INDENT_PER_LEVEL[:-1] self.write('{') line_number = self.line_number @@ -1643,16 +1642,15 @@ class SourceWalker(GenericASTTraversal, object): name = self.traverse(l[i], indent='') if i > 0: if (line_number != self.line_number): - self.write("\n" + self.indent + " ") + self.write("\n" + self.indent + INDENT_PER_LEVEL[:-1]) pass - pass line_number = self.line_number self.write(name, ': ') value = self.traverse(l[i+1], indent=self.indent+(len(name)+2)*' ') self.write(value) sep = "," if line_number != self.line_number: - sep += "\n" + self.indent + " " + sep += "\n" + self.indent + INDENT_PER_LEVEL[:-1] line_number = self.line_number i += 2 pass @@ -1671,7 +1669,7 @@ class SourceWalker(GenericASTTraversal, object): name = self.traverse(l[i+1], indent='') if i > 0: if (line_number != self.line_number): - self.write("\n" + self.indent + " ") + self.write("\n" + self.indent + INDENT_PER_LEVEL[:-1]) pass pass line_number = self.line_number @@ -1680,7 +1678,7 @@ class SourceWalker(GenericASTTraversal, object): self.write(value) sep = "," if line_number != self.line_number: - sep += "\n" + self.indent + " " + sep += "\n" + self.indent + INDENT_PER_LEVEL[:-1] line_number = self.line_number else: sep += " " @@ -1693,22 +1691,57 @@ class SourceWalker(GenericASTTraversal, object): assert node[-1].type.startswith('kvlist') kv_node = node[-1] # goto kvlist + first_time = True for kv in kv_node: assert kv in ('kv', 'kv2', 'kv3') # kv ::= DUP_TOP expr ROT_TWO expr STORE_SUBSCR # kv2 ::= DUP_TOP expr expr ROT_THREE STORE_SUBSCR # kv3 ::= expr expr STORE_MAP + + # FIXME: DRY this and the above if kv == 'kv': + self.write(sep) name = self.traverse(kv[-2], indent='') + if first_time: + if (line_number != self.line_number): + self.write("\n" + self.indent + " ") + pass + first_time = False + pass + line_number = self.line_number + self.write(name, ': ') value = self.traverse(kv[1], indent=self.indent+(len(name)+2)*' ') elif kv == 'kv2': + self.write(sep) name = self.traverse(kv[1], indent='') + if first_time: + if (line_number != self.line_number): + self.write("\n" + self.indent + " ") + pass + first_time = False + pass + line_number = self.line_number + self.write(name, ': ') value = self.traverse(kv[-3], indent=self.indent+(len(name)+2)*' ') elif kv == 'kv3': + self.write(sep) name = self.traverse(kv[-2], indent='') + if first_time: + if (line_number != self.line_number): + self.write("\n" + self.indent + " ") + pass + first_time = False + pass + line_number = self.line_number + self.write(name, ': ') + line_number = self.line_number value = self.traverse(kv[0], indent=self.indent+(len(name)+2)*' ') - self.write(sep, name, ': ', value) - sep = line_seperator + pass + self.write(value) + sep = "," + if line_number != self.line_number: + sep += "\n" + self.indent + " " + line_number = self.line_number if sep.startswith(",\n"): self.write(sep[1:]) self.write('}') @@ -1755,24 +1788,22 @@ class SourceWalker(GenericASTTraversal, object): flat_elems.append(elem) self.indentMore(INDENT_PER_LEVEL) - if lastnode.attr > 3: - line_separator = ',\n' + self.indent - else: - line_separator = ', ' - sep = INDENT_PER_LEVEL[:-1] + sep = '' - # FIXME: - # if flat_elems > some_number, then group - # do automatic wrapping for elem in flat_elems: if elem == 'ROT_THREE': continue assert elem == 'expr' + line_number = self.line_number value = self.traverse(elem) - self.write(sep, value) - sep = line_separator + if line_number != self.line_number: + sep += '\n' + self.indent + INDENT_PER_LEVEL[:-1] + else: + if sep != '': sep += ' ' if have_star: sep += '*' + self.write(sep, value) + sep = ',' if lastnode.attr == 1 and lastnodetype.startswith('BUILD_TUPLE'): self.write(',') self.write(endchar) @@ -1859,9 +1890,15 @@ class SourceWalker(GenericASTTraversal, object): raise if typ == '%': self.write('%') - elif typ == '+': self.indentMore() - elif typ == '-': self.indentLess() - elif typ == '|': self.write(self.indent) + elif typ == '+': + self.line_number += 1 + self.indentMore() + elif typ == '-': + self.line_number += 1 + self.indentLess() + elif typ == '|': + self.line_number += 1 + self.write(self.indent) # Used mostly on the LHS of an assignment # BUILD_TUPLE_n is pretty printed and may take care of other uses. elif typ == ',':