11import sys , itertools
2+ import _ast
23
34def to_tuple (t ):
45 if t is None or isinstance (t , (basestring , int , long , complex )):
56 return t
67 elif isinstance (t , list ):
78 return [to_tuple (e ) for e in t ]
89 result = [t .__class__ .__name__ ]
10+ if hasattr (t , 'lineno' ) and hasattr (t , 'col_offset' ):
11+ result .append ((t .lineno , t .col_offset ))
912 if t ._fields is None :
1013 return tuple (result )
1114 for f in t ._fields :
@@ -106,7 +109,10 @@ def to_tuple(t):
106109 # List
107110 "[1,2,3]" ,
108111 # Tuple
109- "1,2,3"
112+ "1,2,3" ,
113+ # Combination
114+ "a.b.c.d(a.b[1:2])" ,
115+
110116]
111117
112118# TODO: expr_context, slice, boolop, operator, unaryop, cmpop, comprehension
@@ -121,58 +127,77 @@ def to_tuple(t):
121127 print "run_tests()"
122128 raise SystemExit
123129
130+ def test_order (ast_node , parent_pos ):
131+
132+ if not isinstance (ast_node , _ast .AST ) or ast_node ._fields == None :
133+ return
134+ if isinstance (ast_node , (_ast .expr , _ast .stmt )):
135+ node_pos = (ast_node .lineno , ast_node .col_offset )
136+ assert node_pos >= parent_pos , (node_pos , parent_pos )
137+ parent_pos = (ast_node .lineno , ast_node .col_offset )
138+ for name in ast_node ._fields :
139+ value = getattr (ast_node , name )
140+ if isinstance (value , list ):
141+ for child in value :
142+ test_order (child , parent_pos )
143+ elif value != None :
144+ test_order (value , parent_pos )
145+
124146def run_tests ():
125147 for input , output , kind in ((exec_tests , exec_results , "exec" ),
126148 (single_tests , single_results , "single" ),
127149 (eval_tests , eval_results , "eval" )):
128150 for i , o in itertools .izip (input , output ):
129- assert to_tuple (compile (i , "?" , kind , 0x400 )) == o
151+ ast_tree = compile (i , "?" , kind , 0x400 )
152+ assert to_tuple (ast_tree ) == o
153+ test_order (ast_tree , (0 , 0 ))
130154
131155#### EVERYTHING BELOW IS GENERATED #####
132156exec_results = [
133- ('Module' , [('FunctionDef' , 'f' , ('arguments' , [], None , None , []), [('Pass' ,)], [])]),
134- ('Module' , [('ClassDef' , 'C' , [], [('Pass' ,)])]),
135- ('Module' , [('FunctionDef' , 'f' , ('arguments' , [], None , None , []), [('Return' , ('Num' , 1 ))], [])]),
136- ('Module' , [('Delete' , [('Name' , 'v' , ('Del' ,))])]),
137- ('Module' , [('Assign' , [('Name' , 'v' , ('Store' ,))], ('Num' , 1 ))]),
138- ('Module' , [('AugAssign' , ('Name' , 'v' , ('Load' ,)), ('Add' ,), ('Num' , 1 ))]),
139- ('Module' , [('Print' , ('Name' , 'f' , ('Load' ,)), [('Num' , 1 )], False )]),
140- ('Module' , [('For' , ('Name' , 'v' , ('Store' ,)), ('Name' , 'v' , ('Load' ,)), [('Pass' ,)], [])]),
141- ('Module' , [('While' , ('Name' , 'v' , ('Load' ,)), [('Pass' ,)], [])]),
142- ('Module' , [('If' , ('Name' , 'v' , ('Load' ,)), [('Pass' ,)], [])]),
143- ('Module' , [('Raise' , ('Name' , 'Exception' , ('Load' ,)), ('Str' , 'string' ), None )]),
144- ('Module' , [('TryExcept' , [('Pass' ,) ], [('excepthandler' , ('Name' , 'Exception' , ('Load' ,)), None , [('Pass' ,)])], [])]),
145- ('Module' , [('TryFinally' , [('Pass' ,) ], [('Pass' ,)])]),
146- ('Module' , [('Assert' , ('Name' , 'v' , ('Load' ,)), None )]),
147- ('Module' , [('Import' , [('alias' , 'sys' , None )])]),
148- ('Module' , [('ImportFrom' , 'sys' , [('alias' , 'v' , None )], 0 )]),
149- ('Module' , [('Exec' , ('Str' , 'v' ), None , None )]),
150- ('Module' , [('Global' , ['v' ])]),
151- ('Module' , [('Expr' , ('Num' , 1 ))]),
152- ('Module' , [('Pass' ,)]),
153- ('Module' , [('Break' ,)]),
154- ('Module' , [('Continue' ,)]),
157+ ('Module' , [('FunctionDef' , ( 1 , 0 ), 'f' , ('arguments' , [], None , None , []), [('Pass' , ( 1 , 9 ) )], [])]),
158+ ('Module' , [('ClassDef' , ( 1 , 0 ), 'C' , [], [('Pass' , ( 1 , 8 ) )])]),
159+ ('Module' , [('FunctionDef' , ( 1 , 0 ), 'f' , ('arguments' , [], None , None , []), [('Return' , (1 , 8 ), ( 'Num' , ( 1 , 15 ) , 1 ))], [])]),
160+ ('Module' , [('Delete' , ( 1 , 0 ), [('Name' , ( 1 , 4 ) , 'v' , ('Del' ,))])]),
161+ ('Module' , [('Assign' , ( 1 , 0 ), [('Name' , ( 1 , 0 ), 'v' , ('Store' ,))], ('Num' , ( 1 , 4 ) , 1 ))]),
162+ ('Module' , [('AugAssign' , (1 , 0 ), ( 'Name' , ( 1 , 0 ), 'v' , ('Load' ,)), ('Add' ,), ('Num' , ( 1 , 5 ) , 1 ))]),
163+ ('Module' , [('Print' , (1 , 0 ), ( 'Name' , ( 1 , 8 ), 'f' , ('Load' ,)), [('Num' , ( 1 , 11 ) , 1 )], False )]),
164+ ('Module' , [('For' , (1 , 0 ), ( 'Name' , ( 1 , 4 ), 'v' , ('Store' ,)), ('Name' , ( 1 , 9 ), 'v' , ('Load' ,)), [('Pass' , ( 1 , 11 ) )], [])]),
165+ ('Module' , [('While' , (1 , 0 ), ( 'Name' , ( 1 , 6 ), 'v' , ('Load' ,)), [('Pass' , ( 1 , 8 ) )], [])]),
166+ ('Module' , [('If' , (1 , 0 ), ( 'Name' , ( 1 , 3 ), 'v' , ('Load' ,)), [('Pass' , ( 1 , 5 ) )], [])]),
167+ ('Module' , [('Raise' , (1 , 0 ), ( 'Name' , ( 1 , 6 ), 'Exception' , ('Load' ,)), ('Str' , ( 1 , 17 ) , 'string' ), None )]),
168+ ('Module' , [('TryExcept' , ( 1 , 0 ), [('Pass' , ( 2 , 2 )) ], [('excepthandler' , ('Name' , ( 3 , 7 ), 'Exception' , ('Load' ,)), None , [('Pass' , ( 4 , 2 ) )])], [])]),
169+ ('Module' , [('TryFinally' , ( 1 , 0 ), [('Pass' , ( 2 , 2 )) ], [('Pass' , ( 4 , 2 ) )])]),
170+ ('Module' , [('Assert' , (1 , 0 ), ( 'Name' , ( 1 , 7 ) , 'v' , ('Load' ,)), None )]),
171+ ('Module' , [('Import' , ( 1 , 0 ), [('alias' , 'sys' , None )])]),
172+ ('Module' , [('ImportFrom' , ( 1 , 0 ), 'sys' , [('alias' , 'v' , None )], 0 )]),
173+ ('Module' , [('Exec' , (1 , 0 ), ( 'Str' , ( 1 , 5 ) , 'v' ), None , None )]),
174+ ('Module' , [('Global' , ( 1 , 0 ), ['v' ])]),
175+ ('Module' , [('Expr' , (1 , 0 ), ( 'Num' , ( 1 , 0 ) , 1 ))]),
176+ ('Module' , [('Pass' , ( 1 , 0 ) )]),
177+ ('Module' , [('Break' , ( 1 , 0 ) )]),
178+ ('Module' , [('Continue' , ( 1 , 0 ) )]),
155179]
156180single_results = [
157- ('Interactive' , [('Expr' , ('BinOp' , ('Num' , 1 ), ('Add' ,), ('Num' , 2 )))]),
181+ ('Interactive' , [('Expr' , (1 , 0 ), ( 'BinOp' , (1 , 0 ), ( 'Num' , ( 1 , 0 ), 1 ), ('Add' ,), ('Num' , ( 1 , 2 ) , 2 )))]),
158182]
159183eval_results = [
160- ('Expression' , ('BoolOp' , ('And' ,), [('Name' , 'a' , ('Load' ,)), ('Name' , 'b' , ('Load' ,))])),
161- ('Expression' , ('BinOp' , ('Name' , 'a' , ('Load' ,)), ('Add' ,), ('Name' , 'b' , ('Load' ,)))),
162- ('Expression' , ('UnaryOp' , ('Not' ,), ('Name' , 'v' , ('Load' ,)))),
163- ('Expression' , ('Lambda' , ('arguments' , [], None , None , []), ('Name' , 'None' , ('Load' ,)))),
164- ('Expression' , ('Dict' , [('Num' , 1 )], [('Num' , 2 )])),
165- ('Expression' , ('ListComp' , ('Name' , 'a' , ('Load' ,)), [('comprehension' , ('Name' , 'b' , ('Store' ,)), ('Name' , 'c' , ('Load' ,)), [('Name' , 'd' , ('Load' ,))])])),
166- ('Expression' , ('GeneratorExp' , ('Name' , 'a' , ('Load' ,)), [('comprehension' , ('Name' , 'b' , ('Store' ,)), ('Name' , 'c' , ('Load' ,)), [('Name' , 'd' , ('Load' ,))])])),
167- ('Expression' , ('Compare' , ('Num' , 1 ), [('Lt' ,), ('Lt' ,)], [('Num' , 2 ), ('Num' , 3 )])),
168- ('Expression' , ('Call' , ('Name' , 'f' , ('Load' ,)), [('Num' , 1 ), ('Num' , 2 )], [('keyword' , 'c' , ('Num' , 3 ))], ('Name' , 'd' , ('Load' ,)), ('Name' , 'e' , ('Load' ,)))),
169- ('Expression' , ('Repr' , ('Name' , 'v' , ('Load' ,)))),
170- ('Expression' , ('Num' , 10L )),
171- ('Expression' , ('Str' , 'string' )),
172- ('Expression' , ('Attribute' , ('Name' , 'a' , ('Load' ,)), 'b' , ('Load' ,))),
173- ('Expression' , ('Subscript' , ('Name' , 'a' , ('Load' ,)), ('Slice' , ('Name' , 'b' , ('Load' ,)), ('Name' , 'c' , ('Load' ,)), None ), ('Load' ,))),
174- ('Expression' , ('Name' , 'v' , ('Load' ,))),
175- ('Expression' , ('List' , [('Num' , 1 ), ('Num' , 2 ), ('Num' , 3 )], ('Load' ,))),
176- ('Expression' , ('Tuple' , [('Num' , 1 ), ('Num' , 2 ), ('Num' , 3 )], ('Load' ,))),
184+ ('Expression' , ('BoolOp' , (1 , 0 ), ('And' ,), [('Name' , (1 , 0 ), 'a' , ('Load' ,)), ('Name' , (1 , 6 ), 'b' , ('Load' ,))])),
185+ ('Expression' , ('BinOp' , (1 , 0 ), ('Name' , (1 , 0 ), 'a' , ('Load' ,)), ('Add' ,), ('Name' , (1 , 4 ), 'b' , ('Load' ,)))),
186+ ('Expression' , ('UnaryOp' , (1 , 0 ), ('Not' ,), ('Name' , (1 , 4 ), 'v' , ('Load' ,)))),
187+ ('Expression' , ('Lambda' , (1 , 0 ), ('arguments' , [], None , None , []), ('Name' , (1 , 7 ), 'None' , ('Load' ,)))),
188+ ('Expression' , ('Dict' , (1 , 0 ), [('Num' , (1 , 2 ), 1 )], [('Num' , (1 , 4 ), 2 )])),
189+ ('Expression' , ('ListComp' , (1 , 1 ), ('Name' , (1 , 1 ), 'a' , ('Load' ,)), [('comprehension' , ('Name' , (1 , 7 ), 'b' , ('Store' ,)), ('Name' , (1 , 12 ), 'c' , ('Load' ,)), [('Name' , (1 , 17 ), 'd' , ('Load' ,))])])),
190+ ('Expression' , ('GeneratorExp' , (1 , 1 ), ('Name' , (1 , 1 ), 'a' , ('Load' ,)), [('comprehension' , ('Name' , (1 , 7 ), 'b' , ('Store' ,)), ('Name' , (1 , 12 ), 'c' , ('Load' ,)), [('Name' , (1 , 17 ), 'd' , ('Load' ,))])])),
191+ ('Expression' , ('Compare' , (1 , 0 ), ('Num' , (1 , 0 ), 1 ), [('Lt' ,), ('Lt' ,)], [('Num' , (1 , 4 ), 2 ), ('Num' , (1 , 8 ), 3 )])),
192+ ('Expression' , ('Call' , (1 , 0 ), ('Name' , (1 , 0 ), 'f' , ('Load' ,)), [('Num' , (1 , 2 ), 1 ), ('Num' , (1 , 4 ), 2 )], [('keyword' , 'c' , ('Num' , (1 , 8 ), 3 ))], ('Name' , (1 , 11 ), 'd' , ('Load' ,)), ('Name' , (1 , 15 ), 'e' , ('Load' ,)))),
193+ ('Expression' , ('Repr' , (1 , 0 ), ('Name' , (1 , 1 ), 'v' , ('Load' ,)))),
194+ ('Expression' , ('Num' , (1 , 0 ), 10L )),
195+ ('Expression' , ('Str' , (1 , 0 ), 'string' )),
196+ ('Expression' , ('Attribute' , (1 , 0 ), ('Name' , (1 , 0 ), 'a' , ('Load' ,)), 'b' , ('Load' ,))),
197+ ('Expression' , ('Subscript' , (1 , 0 ), ('Name' , (1 , 0 ), 'a' , ('Load' ,)), ('Slice' , ('Name' , (1 , 2 ), 'b' , ('Load' ,)), ('Name' , (1 , 4 ), 'c' , ('Load' ,)), None ), ('Load' ,))),
198+ ('Expression' , ('Name' , (1 , 0 ), 'v' , ('Load' ,))),
199+ ('Expression' , ('List' , (1 , 0 ), [('Num' , (1 , 1 ), 1 ), ('Num' , (1 , 3 ), 2 ), ('Num' , (1 , 5 ), 3 )], ('Load' ,))),
200+ ('Expression' , ('Tuple' , (1 , 0 ), [('Num' , (1 , 0 ), 1 ), ('Num' , (1 , 2 ), 2 ), ('Num' , (1 , 4 ), 3 )], ('Load' ,))),
201+ ('Expression' , ('Call' , (1 , 0 ), ('Attribute' , (1 , 0 ), ('Attribute' , (1 , 0 ), ('Attribute' , (1 , 0 ), ('Name' , (1 , 0 ), 'a' , ('Load' ,)), 'b' , ('Load' ,)), 'c' , ('Load' ,)), 'd' , ('Load' ,)), [('Subscript' , (1 , 8 ), ('Attribute' , (1 , 8 ), ('Name' , (1 , 8 ), 'a' , ('Load' ,)), 'b' , ('Load' ,)), ('Slice' , ('Num' , (1 , 12 ), 1 ), ('Num' , (1 , 14 ), 2 ), None ), ('Load' ,))], [], None , None )),
177202]
178203run_tests ()
0 commit comments