18
18
19
19
from uncompyle6 .parsers .treenode import SyntaxTree
20
20
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
+ )
22
29
from uncompyle6 .semantics .helper import find_code_node , flatten_list
23
30
from uncompyle6 .util import better_repr , get_code_name
24
31
@@ -41,7 +48,7 @@ def __init__(self):
41
48
self .prec = 1000
42
49
self .in_format_string = False
43
50
44
- def n_alias (self , node ):
51
+ def n_alias (self , node : SyntaxTree ):
45
52
if self .version <= (2 , 1 ):
46
53
if len (node ) == 2 :
47
54
store = node [1 ]
@@ -66,7 +73,7 @@ def n_alias(self, node):
66
73
67
74
n_alias37 = n_alias
68
75
69
- def n_assign (self , node ):
76
+ def n_assign (self , node : SyntaxTree ):
70
77
# A horrible hack for Python 3.0 .. 3.2
71
78
if (3 , 0 ) <= self .version <= (3 , 2 ) and len (node ) == 2 :
72
79
if (
@@ -77,19 +84,19 @@ def n_assign(self, node):
77
84
self .prune ()
78
85
self .default (node )
79
86
80
- def n_assign2 (self , node ):
87
+ def n_assign2 (self , node : SyntaxTree ):
81
88
for n in node [- 2 :]:
82
89
if n [0 ] == "unpack" :
83
90
n [0 ].kind = "unpack_w_parens"
84
91
self .default (node )
85
92
86
- def n_assign3 (self , node ):
93
+ def n_assign3 (self , node : SyntaxTree ):
87
94
for n in node [- 3 :]:
88
95
if n [0 ] == "unpack" :
89
96
n [0 ].kind = "unpack_w_parens"
90
97
self .default (node )
91
98
92
- def n_attribute (self , node ):
99
+ def n_attribute (self , node : SyntaxTree ):
93
100
if node [0 ] == "LOAD_CONST" or node [0 ] == "expr" and node [0 ][0 ] == "LOAD_CONST" :
94
101
# FIXME: I didn't record which constants parenthesis is
95
102
# necessary. However, I suspect that we could further
@@ -99,7 +106,7 @@ def n_attribute(self, node):
99
106
node .kind = "attribute_w_parens"
100
107
self .default (node )
101
108
102
- def n_bin_op (self , node ):
109
+ def n_bin_op (self , node : SyntaxTree ):
103
110
"""bin_op (formerly "binary_expr") is the Python AST BinOp"""
104
111
self .preorder (node [0 ])
105
112
self .write (" " )
@@ -111,9 +118,9 @@ def n_bin_op(self, node):
111
118
self .prec += 1
112
119
self .prune ()
113
120
114
- def n_build_slice2 (self , node ):
121
+ def n_build_slice2 (self , node : SyntaxTree ):
115
122
p = self .prec
116
- self .prec = 100
123
+ self .prec = NO_PARENTHESIS_EVER
117
124
if not node [0 ].isNone ():
118
125
self .preorder (node [0 ])
119
126
self .write (":" )
@@ -122,9 +129,9 @@ def n_build_slice2(self, node):
122
129
self .prec = p
123
130
self .prune () # stop recursing
124
131
125
- def n_build_slice3 (self , node ):
132
+ def n_build_slice3 (self , node : SyntaxTree ):
126
133
p = self .prec
127
- self .prec = 100
134
+ self .prec = NO_PARENTHESIS_EVER
128
135
if not node [0 ].isNone ():
129
136
self .preorder (node [0 ])
130
137
self .write (":" )
@@ -136,7 +143,7 @@ def n_build_slice3(self, node):
136
143
self .prec = p
137
144
self .prune () # stop recursing
138
145
139
- def n_classdef (self , node ):
146
+ def n_classdef (self , node : SyntaxTree ):
140
147
if self .version >= (3 , 6 ):
141
148
self .n_classdef36 (node )
142
149
elif self .version >= (3 , 0 ):
@@ -199,7 +206,7 @@ def n_classdef(self, node):
199
206
200
207
n_classdefdeco2 = n_classdef
201
208
202
- def n_const_list (self , node ):
209
+ def n_const_list (self , node : SyntaxTree ):
203
210
"""
204
211
prettyprint a constant dict, list, set or tuple.
205
212
"""
@@ -293,7 +300,7 @@ def n_const_list(self, node):
293
300
self .prune ()
294
301
return
295
302
296
- def n_delete_subscript (self , node ):
303
+ def n_delete_subscript (self , node : SyntaxTree ):
297
304
if node [- 2 ][0 ] == "build_list" and node [- 2 ][0 ][- 1 ].kind .startswith (
298
305
"BUILD_TUPLE"
299
306
):
@@ -303,7 +310,7 @@ def n_delete_subscript(self, node):
303
310
304
311
n_store_subscript = n_subscript = n_delete_subscript
305
312
306
- def n_dict (self , node ):
313
+ def n_dict (self , node : SyntaxTree ):
307
314
"""
308
315
Prettyprint a dict.
309
316
'dict' is something like k = {'a': 1, 'b': 42}"
@@ -315,7 +322,7 @@ def n_dict(self, node):
315
322
return
316
323
317
324
p = self .prec
318
- self .prec = 100
325
+ self .prec = PRECEDENCE [ "dict" ]
319
326
320
327
self .indent_more (INDENT_PER_LEVEL )
321
328
sep = INDENT_PER_LEVEL [:- 1 ]
@@ -327,24 +334,24 @@ def n_dict(self, node):
327
334
if node [0 ].kind .startswith ("kvlist" ):
328
335
# Python 3.5+ style key/value list in dict
329
336
kv_node = node [0 ]
330
- l = list (kv_node )
331
- length = len (l )
337
+ ll = list (kv_node )
338
+ length = len (ll )
332
339
if kv_node [- 1 ].kind .startswith ("BUILD_MAP" ):
333
340
length -= 1
334
341
i = 0
335
342
336
343
# Respect line breaks from source
337
344
while i < length :
338
345
self .write (sep )
339
- name = self .traverse (l [i ], indent = "" )
346
+ name = self .traverse (ll [i ], indent = "" )
340
347
if i > 0 :
341
348
line_number = self .indent_if_source_nl (
342
349
line_number , self .indent + INDENT_PER_LEVEL [:- 1 ]
343
350
)
344
351
line_number = self .line_number
345
352
self .write (name , ": " )
346
353
value = self .traverse (
347
- l [i + 1 ], indent = self .indent + (len (name ) + 2 ) * " "
354
+ ll [i + 1 ], indent = self .indent + (len (name ) + 2 ) * " "
348
355
)
349
356
self .write (value )
350
357
sep = ", "
@@ -357,15 +364,15 @@ def n_dict(self, node):
357
364
elif len (node ) > 1 and node [1 ].kind .startswith ("kvlist" ):
358
365
# Python 3.0..3.4 style key/value list in dict
359
366
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" :
362
369
# Python 3.2 does this
363
370
kv_node = node [1 ][0 ]
364
- l = list (kv_node )
371
+ ll = list (kv_node )
365
372
i = 0
366
- while i < len (l ):
373
+ while i < len (ll ):
367
374
self .write (sep )
368
- name = self .traverse (l [i + 1 ], indent = "" )
375
+ name = self .traverse (ll [i + 1 ], indent = "" )
369
376
if i > 0 :
370
377
line_number = self .indent_if_source_nl (
371
378
line_number , self .indent + INDENT_PER_LEVEL [:- 1 ]
@@ -374,7 +381,7 @@ def n_dict(self, node):
374
381
line_number = self .line_number
375
382
self .write (name , ": " )
376
383
value = self .traverse (
377
- l [i ], indent = self .indent + (len (name ) + 2 ) * " "
384
+ ll [i ], indent = self .indent + (len (name ) + 2 ) * " "
378
385
)
379
386
self .write (value )
380
387
sep = ", "
@@ -592,7 +599,7 @@ def n_docstring(self, node):
592
599
self .println (lines [- 1 ], quote )
593
600
self .prune ()
594
601
595
- def n_elifelsestmtr (self , node ):
602
+ def n_elifelsestmtr (self , node : SyntaxTree ):
596
603
if node [2 ] == "COME_FROM" :
597
604
return_stmts_node = node [3 ]
598
605
node .kind = "elifelsestmtr2"
@@ -623,7 +630,7 @@ def n_elifelsestmtr(self, node):
623
630
self .indent_less ()
624
631
self .prune ()
625
632
626
- def n_except_cond2 (self , node ):
633
+ def n_except_cond2 (self , node : SyntaxTree ):
627
634
if node [- 1 ] == "come_from_opt" :
628
635
unpack_node = - 3
629
636
else :
@@ -637,7 +644,7 @@ def n_except_cond2(self, node):
637
644
# FIXME: figure out how to get this into customization
638
645
# put so that we can get access via super from
639
646
# the fragments routine.
640
- def n_exec_stmt (self , node ):
647
+ def n_exec_stmt (self , node : SyntaxTree ):
641
648
"""
642
649
exec_stmt ::= expr exprlist DUP_TOP EXEC_STMT
643
650
exec_stmt ::= expr exprlist EXEC_STMT
@@ -669,7 +676,9 @@ def n_expr(self, node):
669
676
# hasattr(self, 'current_line_number')):
670
677
# self.source_linemap[self.current_line_number] = n.linestart
671
678
672
- self .prec = PRECEDENCE .get (n .kind , - 2 )
679
+ if n .kind != "expr" :
680
+ self .prec = PRECEDENCE .get (n .kind , PARENTHESIS_ALWAYS )
681
+
673
682
if n == "LOAD_CONST" and repr (n .pattr )[0 ] == "-" :
674
683
self .prec = 6
675
684
@@ -726,7 +735,7 @@ def n_generator_exp(self, node):
726
735
self .write (")" )
727
736
self .prune ()
728
737
729
- n_generator_exp_async = n_generator_exp
738
+ n_genexpr_func = n_generator_exp_async = n_generator_exp
730
739
731
740
def n_ifelsestmtr (self , node ):
732
741
if node [2 ] == "COME_FROM" :
@@ -806,7 +815,7 @@ def n_lambda_body(self, node):
806
815
self .make_function (node , is_lambda = True , code_node = node [- 2 ])
807
816
self .prune () # stop recursing
808
817
809
- def n_list (self , node ):
818
+ def n_list (self , node : SyntaxTree ):
810
819
"""
811
820
prettyprint a dict, list, set or tuple.
812
821
"""
@@ -837,13 +846,16 @@ def n_list(self, node):
837
846
if lastnodetype .startswith ("BUILD_LIST" ):
838
847
self .write ("[" )
839
848
endchar = "]"
849
+
840
850
elif lastnodetype .startswith ("BUILD_MAP_UNPACK" ):
841
851
self .write ("{*" )
842
852
endchar = "}"
853
+
843
854
elif lastnodetype .startswith ("BUILD_SET" ):
844
855
self .write ("{" )
845
856
endchar = "}"
846
- elif lastnodetype .startswith ("BUILD_TUPLE" ):
857
+
858
+ elif lastnodetype .startswith ("BUILD_TUPLE" ) or node == "tuple" :
847
859
# Tuples can appear places that can NOT
848
860
# have parenthesis around them, like array
849
861
# subscripts. We check for that by seeing
@@ -864,6 +876,7 @@ def n_list(self, node):
864
876
elif lastnodetype .startswith ("ROT_TWO" ):
865
877
self .write ("(" )
866
878
endchar = ")"
879
+
867
880
else :
868
881
raise TypeError (
869
882
"Internal Error: n_build_list expects list, tuple, set, or unpack"
@@ -902,7 +915,7 @@ def n_list(self, node):
902
915
self .prune ()
903
916
return
904
917
905
- n_set = n_tuple = n_build_set = n_list
918
+ n_set = n_build_set = n_tuple = n_list
906
919
907
920
def n_list_comp (self , node ):
908
921
"""List comprehensions"""
0 commit comments