Skip to content

Commit f94100d

Browse files
committed
sync with decompile3
1 parent 3ef4ab4 commit f94100d

File tree

3 files changed

+63
-47
lines changed

3 files changed

+63
-47
lines changed

uncompyle6/scanner.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -597,16 +597,6 @@ def setTokenClass(self, tokenClass: Token) -> Token:
597597
return self.Token
598598

599599

600-
def prefer_double_quote(string: str) -> str:
601-
"""
602-
Prefer a double quoted string over a
603-
single quoted string when possible
604-
"""
605-
if string.find("'") == -1:
606-
return f'"{string}"'
607-
return str(string)
608-
609-
610600
def get_scanner(version: Union[str, tuple], is_pypy=False, show_asm=None) -> Scanner:
611601
# If version is a string, turn that into the corresponding float.
612602
if isinstance(version, str):
@@ -659,6 +649,16 @@ def get_scanner(version: Union[str, tuple], is_pypy=False, show_asm=None) -> Sca
659649
return scanner
660650

661651

652+
def prefer_double_quote(string: str) -> str:
653+
"""
654+
Prefer a double quoted string over a
655+
single quoted string when possible
656+
"""
657+
if string.find("'") == -1:
658+
return f'"{string}"'
659+
return repr(string)
660+
661+
662662
if __name__ == "__main__":
663663
import inspect
664664

uncompyle6/semantics/consts.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Copyright (c) 2017-2023 by Rocky Bernstein
1+
# Copyright (c) 2017-2024 by Rocky Bernstein
22
#
33
# This program is free software: you can redistribute it and/or modify
44
# it under the terms of the GNU General Public License as published by
@@ -14,9 +14,11 @@
1414
# along with this program. If not, see <http://www.gnu.org/licenses/>.
1515
"""Constants and initial table values used in pysource.py and fragments.py"""
1616

17-
import re, sys
17+
import re
18+
import sys
19+
1820
from uncompyle6.parsers.treenode import SyntaxTree
19-
from uncompyle6.scanners.tok import Token, NoneToken
21+
from uncompyle6.scanners.tok import NoneToken, Token
2022

2123
minint = -sys.maxsize - 1
2224
maxint = sys.maxsize
@@ -46,6 +48,7 @@
4648
# call((.. op ..)).
4749

4850
NO_PARENTHESIS_EVER = 100
51+
PARENTHESIS_ALWAYS = -2
4952

5053
# fmt: off
5154
PRECEDENCE = {

uncompyle6/semantics/n_actions.py

Lines changed: 47 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,14 @@
1818

1919
from uncompyle6.parsers.treenode import SyntaxTree
2020
from uncompyle6.scanners.tok import Token
21-
from uncompyle6.semantics.consts import INDENT_PER_LEVEL, NONE, PRECEDENCE, minint
21+
from uncompyle6.semantics.consts import (
22+
INDENT_PER_LEVEL,
23+
NO_PARENTHESIS_EVER,
24+
NONE,
25+
PARENTHESIS_ALWAYS,
26+
PRECEDENCE,
27+
minint,
28+
)
2229
from uncompyle6.semantics.helper import find_code_node, flatten_list
2330
from uncompyle6.util import better_repr, get_code_name
2431

@@ -41,7 +48,7 @@ def __init__(self):
4148
self.prec = 1000
4249
self.in_format_string = False
4350

44-
def n_alias(self, node):
51+
def n_alias(self, node: SyntaxTree):
4552
if self.version <= (2, 1):
4653
if len(node) == 2:
4754
store = node[1]
@@ -66,7 +73,7 @@ def n_alias(self, node):
6673

6774
n_alias37 = n_alias
6875

69-
def n_assign(self, node):
76+
def n_assign(self, node: SyntaxTree):
7077
# A horrible hack for Python 3.0 .. 3.2
7178
if (3, 0) <= self.version <= (3, 2) and len(node) == 2:
7279
if (
@@ -77,19 +84,19 @@ def n_assign(self, node):
7784
self.prune()
7885
self.default(node)
7986

80-
def n_assign2(self, node):
87+
def n_assign2(self, node: SyntaxTree):
8188
for n in node[-2:]:
8289
if n[0] == "unpack":
8390
n[0].kind = "unpack_w_parens"
8491
self.default(node)
8592

86-
def n_assign3(self, node):
93+
def n_assign3(self, node: SyntaxTree):
8794
for n in node[-3:]:
8895
if n[0] == "unpack":
8996
n[0].kind = "unpack_w_parens"
9097
self.default(node)
9198

92-
def n_attribute(self, node):
99+
def n_attribute(self, node: SyntaxTree):
93100
if node[0] == "LOAD_CONST" or node[0] == "expr" and node[0][0] == "LOAD_CONST":
94101
# FIXME: I didn't record which constants parenthesis is
95102
# necessary. However, I suspect that we could further
@@ -99,7 +106,7 @@ def n_attribute(self, node):
99106
node.kind = "attribute_w_parens"
100107
self.default(node)
101108

102-
def n_bin_op(self, node):
109+
def n_bin_op(self, node: SyntaxTree):
103110
"""bin_op (formerly "binary_expr") is the Python AST BinOp"""
104111
self.preorder(node[0])
105112
self.write(" ")
@@ -111,9 +118,9 @@ def n_bin_op(self, node):
111118
self.prec += 1
112119
self.prune()
113120

114-
def n_build_slice2(self, node):
121+
def n_build_slice2(self, node: SyntaxTree):
115122
p = self.prec
116-
self.prec = 100
123+
self.prec = NO_PARENTHESIS_EVER
117124
if not node[0].isNone():
118125
self.preorder(node[0])
119126
self.write(":")
@@ -122,9 +129,9 @@ def n_build_slice2(self, node):
122129
self.prec = p
123130
self.prune() # stop recursing
124131

125-
def n_build_slice3(self, node):
132+
def n_build_slice3(self, node: SyntaxTree):
126133
p = self.prec
127-
self.prec = 100
134+
self.prec = NO_PARENTHESIS_EVER
128135
if not node[0].isNone():
129136
self.preorder(node[0])
130137
self.write(":")
@@ -136,7 +143,7 @@ def n_build_slice3(self, node):
136143
self.prec = p
137144
self.prune() # stop recursing
138145

139-
def n_classdef(self, node):
146+
def n_classdef(self, node: SyntaxTree):
140147
if self.version >= (3, 6):
141148
self.n_classdef36(node)
142149
elif self.version >= (3, 0):
@@ -199,7 +206,7 @@ def n_classdef(self, node):
199206

200207
n_classdefdeco2 = n_classdef
201208

202-
def n_const_list(self, node):
209+
def n_const_list(self, node: SyntaxTree):
203210
"""
204211
prettyprint a constant dict, list, set or tuple.
205212
"""
@@ -293,7 +300,7 @@ def n_const_list(self, node):
293300
self.prune()
294301
return
295302

296-
def n_delete_subscript(self, node):
303+
def n_delete_subscript(self, node: SyntaxTree):
297304
if node[-2][0] == "build_list" and node[-2][0][-1].kind.startswith(
298305
"BUILD_TUPLE"
299306
):
@@ -303,7 +310,7 @@ def n_delete_subscript(self, node):
303310

304311
n_store_subscript = n_subscript = n_delete_subscript
305312

306-
def n_dict(self, node):
313+
def n_dict(self, node: SyntaxTree):
307314
"""
308315
Prettyprint a dict.
309316
'dict' is something like k = {'a': 1, 'b': 42}"
@@ -315,7 +322,7 @@ def n_dict(self, node):
315322
return
316323

317324
p = self.prec
318-
self.prec = 100
325+
self.prec = PRECEDENCE["dict"]
319326

320327
self.indent_more(INDENT_PER_LEVEL)
321328
sep = INDENT_PER_LEVEL[:-1]
@@ -327,24 +334,24 @@ def n_dict(self, node):
327334
if node[0].kind.startswith("kvlist"):
328335
# Python 3.5+ style key/value list in dict
329336
kv_node = node[0]
330-
l = list(kv_node)
331-
length = len(l)
337+
ll = list(kv_node)
338+
length = len(ll)
332339
if kv_node[-1].kind.startswith("BUILD_MAP"):
333340
length -= 1
334341
i = 0
335342

336343
# Respect line breaks from source
337344
while i < length:
338345
self.write(sep)
339-
name = self.traverse(l[i], indent="")
346+
name = self.traverse(ll[i], indent="")
340347
if i > 0:
341348
line_number = self.indent_if_source_nl(
342349
line_number, self.indent + INDENT_PER_LEVEL[:-1]
343350
)
344351
line_number = self.line_number
345352
self.write(name, ": ")
346353
value = self.traverse(
347-
l[i + 1], indent=self.indent + (len(name) + 2) * " "
354+
ll[i + 1], indent=self.indent + (len(name) + 2) * " "
348355
)
349356
self.write(value)
350357
sep = ", "
@@ -357,15 +364,15 @@ def n_dict(self, node):
357364
elif len(node) > 1 and node[1].kind.startswith("kvlist"):
358365
# Python 3.0..3.4 style key/value list in dict
359366
kv_node = node[1]
360-
l = list(kv_node)
361-
if len(l) > 0 and l[0].kind == "kv3":
367+
ll = list(kv_node)
368+
if len(ll) > 0 and ll[0].kind == "kv3":
362369
# Python 3.2 does this
363370
kv_node = node[1][0]
364-
l = list(kv_node)
371+
ll = list(kv_node)
365372
i = 0
366-
while i < len(l):
373+
while i < len(ll):
367374
self.write(sep)
368-
name = self.traverse(l[i + 1], indent="")
375+
name = self.traverse(ll[i + 1], indent="")
369376
if i > 0:
370377
line_number = self.indent_if_source_nl(
371378
line_number, self.indent + INDENT_PER_LEVEL[:-1]
@@ -374,7 +381,7 @@ def n_dict(self, node):
374381
line_number = self.line_number
375382
self.write(name, ": ")
376383
value = self.traverse(
377-
l[i], indent=self.indent + (len(name) + 2) * " "
384+
ll[i], indent=self.indent + (len(name) + 2) * " "
378385
)
379386
self.write(value)
380387
sep = ", "
@@ -592,7 +599,7 @@ def n_docstring(self, node):
592599
self.println(lines[-1], quote)
593600
self.prune()
594601

595-
def n_elifelsestmtr(self, node):
602+
def n_elifelsestmtr(self, node: SyntaxTree):
596603
if node[2] == "COME_FROM":
597604
return_stmts_node = node[3]
598605
node.kind = "elifelsestmtr2"
@@ -623,7 +630,7 @@ def n_elifelsestmtr(self, node):
623630
self.indent_less()
624631
self.prune()
625632

626-
def n_except_cond2(self, node):
633+
def n_except_cond2(self, node: SyntaxTree):
627634
if node[-1] == "come_from_opt":
628635
unpack_node = -3
629636
else:
@@ -637,7 +644,7 @@ def n_except_cond2(self, node):
637644
# FIXME: figure out how to get this into customization
638645
# put so that we can get access via super from
639646
# the fragments routine.
640-
def n_exec_stmt(self, node):
647+
def n_exec_stmt(self, node: SyntaxTree):
641648
"""
642649
exec_stmt ::= expr exprlist DUP_TOP EXEC_STMT
643650
exec_stmt ::= expr exprlist EXEC_STMT
@@ -669,7 +676,9 @@ def n_expr(self, node):
669676
# hasattr(self, 'current_line_number')):
670677
# self.source_linemap[self.current_line_number] = n.linestart
671678

672-
self.prec = PRECEDENCE.get(n.kind, -2)
679+
if n.kind != "expr":
680+
self.prec = PRECEDENCE.get(n.kind, PARENTHESIS_ALWAYS)
681+
673682
if n == "LOAD_CONST" and repr(n.pattr)[0] == "-":
674683
self.prec = 6
675684

@@ -726,7 +735,7 @@ def n_generator_exp(self, node):
726735
self.write(")")
727736
self.prune()
728737

729-
n_generator_exp_async = n_generator_exp
738+
n_genexpr_func = n_generator_exp_async = n_generator_exp
730739

731740
def n_ifelsestmtr(self, node):
732741
if node[2] == "COME_FROM":
@@ -806,7 +815,7 @@ def n_lambda_body(self, node):
806815
self.make_function(node, is_lambda=True, code_node=node[-2])
807816
self.prune() # stop recursing
808817

809-
def n_list(self, node):
818+
def n_list(self, node: SyntaxTree):
810819
"""
811820
prettyprint a dict, list, set or tuple.
812821
"""
@@ -837,13 +846,16 @@ def n_list(self, node):
837846
if lastnodetype.startswith("BUILD_LIST"):
838847
self.write("[")
839848
endchar = "]"
849+
840850
elif lastnodetype.startswith("BUILD_MAP_UNPACK"):
841851
self.write("{*")
842852
endchar = "}"
853+
843854
elif lastnodetype.startswith("BUILD_SET"):
844855
self.write("{")
845856
endchar = "}"
846-
elif lastnodetype.startswith("BUILD_TUPLE"):
857+
858+
elif lastnodetype.startswith("BUILD_TUPLE") or node == "tuple":
847859
# Tuples can appear places that can NOT
848860
# have parenthesis around them, like array
849861
# subscripts. We check for that by seeing
@@ -864,6 +876,7 @@ def n_list(self, node):
864876
elif lastnodetype.startswith("ROT_TWO"):
865877
self.write("(")
866878
endchar = ")"
879+
867880
else:
868881
raise TypeError(
869882
"Internal Error: n_build_list expects list, tuple, set, or unpack"
@@ -902,7 +915,7 @@ def n_list(self, node):
902915
self.prune()
903916
return
904917

905-
n_set = n_tuple = n_build_set = n_list
918+
n_set = n_build_set = n_tuple = n_list
906919

907920
def n_list_comp(self, node):
908921
"""List comprehensions"""

0 commit comments

Comments
 (0)