11import ast
22
3+ from python_minifier .rename .mapper import add_parent
4+ from python_minifier .transforms .suite_transformer import SuiteTransformer
5+
36
47def find_doc (node ):
58
@@ -18,7 +21,7 @@ def _doc_in_module(module):
1821 except :
1922 return True
2023
21- class RemoveLiteralStatements (ast . NodeTransformer ):
24+ class RemoveLiteralStatements (SuiteTransformer ):
2225 """
2326 Remove literal expressions from the code
2427
@@ -30,90 +33,37 @@ def __call__(self, node):
3033 return node
3134 return self .visit (node )
3235
33- def visit_ClassDef (self , node ):
34- node .body = self .suite (node .body )
35- return node
36-
37- def visit_FunctionDef (self , node ):
38- node .body = self .suite (node .body )
39- return node
40-
41- def visit_AsyncFunctionDef (self , node ):
42- return self .visit_FunctionDef (node )
43-
44- def visit_For (self , node ):
45- node .body = self .suite (node .body )
46-
47- if node .orelse :
48- node .orelse = self .suite (node .orelse )
49-
50- return node
51-
52- def visit_AsyncFor (self , node ):
53- return self .visit_For (node )
54-
55- def visit_If (self , node ):
56- node .body = self .suite (node .body )
57- if node .orelse :
58- node .orelse = self .suite (node .orelse )
59-
60- return node
61-
62- def visit_Try (self , node ):
63- node .body = self .suite (node .body )
64-
65- if node .orelse :
66- node .orelse = self .suite (node .orelse )
67-
68- if node .finalbody :
69- node .finalbody = self .suite (node .finalbody )
70-
71- return node
72-
73- def visit_While (self , node ):
74- node .body = self .suite (node .body )
75-
76- if node .orelse :
77- node .orelse = self .suite (node .orelse )
78-
79- return node
80-
81- def visit_With (self , node ):
82- node .body = self .suite (node .body )
83- return node
84-
85- def visit_AsyncWith (self , node ):
86- return self .visit_With (node )
87-
8836 def visit_Module (self , node ):
8937 for binding in node .bindings :
9038 if binding .name == '__doc__' :
9139 node .body = [self .visit (a ) for a in node .body ]
9240 return node
9341
94- node .body = self .suite (node .body , module = True )
42+ node .body = self .suite (node .body , parent = node )
9543 return node
9644
9745 def is_literal_statement (self , node ):
9846 if not isinstance (node , ast .Expr ):
9947 return False
10048
10149 if (
102- isinstance (node .value , ast .Num )
103- or isinstance ( node .value , ast . Str )
50+ isinstance (node .value , ( ast .Num , ast . Str , ast . NameConstant ) )
51+ or node .value . __class__ . __name__ == 'Constant'
10452 or node .value .__class__ .__name__ == 'Bytes'
10553 ):
10654 return True
10755
10856 return False
10957
110- def suite (self , node_list , module = False ):
58+ def suite (self , node_list , parent ):
11159 without_literals = [self .visit (a ) for a in filter (lambda n : not self .is_literal_statement (n ), node_list )]
11260
11361 if len (without_literals ) == 0 :
114- if module :
62+ if isinstance ( parent , ast . Module ) :
11563 return []
11664 else :
117- return [ast .Expr (value = ast .Num (0 ))]
65+ expr = ast .Expr (value = ast .Num (0 ))
66+ add_parent (expr , parent = parent , namespace = parent .namespace )
67+ return [expr ]
11868
11969 return without_literals
0 commit comments