Mercurial > python-compiler.rs
annotate src/ast_rewrite.rs @ 93:c06d12a81637
Better test failure. Use assert_diff! instead of assert_eq! so we can actually see what the differences are.
author | Bastien Orivel <eijebong@bananium.fr> |
---|---|
date | Tue, 14 Jun 2016 02:53:29 +0200 |
parents | 94ff501bf336 |
children |
rev | line source |
---|---|
0 | 1 use python_ast::{Module, Statement, Expr}; |
2 | |
3 trait Visitor<T> { | |
4 fn visit_module(&mut self, module: Module) -> T; | |
5 fn visit_statement(&mut self, statement: Statement) -> T; | |
6 fn visit_expr(&mut self, expr: Expr) -> T; | |
7 } | |
8 | |
9 struct Rewrite { | |
10 } | |
11 | |
12 impl Visitor<()> for Rewrite { | |
13 fn visit_module(&mut self, module: Module) -> () { | |
14 for statement in module.statements { | |
15 println!("{:?}", statement); | |
16 self.visit_statement(statement); | |
17 } | |
18 } | |
19 | |
20 fn visit_statement(&mut self, statement: Statement) -> () { | |
21 match statement { | |
22 Statement::FunctionDef(Expr::Name(name), arguments, body) => { | |
23 for expr in arguments { | |
24 self.visit_expr(expr); | |
25 } | |
26 for statement in body { | |
27 self.visit_statement(statement); | |
28 } | |
29 }, | |
30 Statement::FunctionDef(_, _, _) => { | |
31 println!("Statement:FunctionDef Error"); | |
32 panic!() | |
33 }, | |
34 Statement::If(test, body, orelse) => { | |
35 self.visit_expr(test); | |
36 for statement in body { | |
37 self.visit_statement(statement); | |
38 } | |
39 for statement in orelse { | |
40 self.visit_statement(statement); | |
41 } | |
42 }, | |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
43 Statement::While(test, body, orelse) => { |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
44 self.visit_expr(test); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
45 for statement in body { |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
46 self.visit_statement(statement); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
47 } |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
48 for statement in orelse { |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
49 self.visit_statement(statement); |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
50 } |
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
51 }, |
5
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
52 Statement::For(target, iter, body, orelse) => { |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
53 self.visit_expr(target); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
54 self.visit_expr(iter); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
55 for statement in body { |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
56 self.visit_statement(statement); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
57 } |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
58 for statement in orelse { |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
59 self.visit_statement(statement); |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
60 } |
ddf372373a77
Add ast.For, ast.UnaryOp, and Sub and Div to ast.BinOp.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
0
diff
changeset
|
61 }, |
0 | 62 Statement::Assign(targets, value) => { |
63 self.visit_expr(value); | |
64 for target in targets { | |
65 self.visit_expr(target); | |
66 } | |
67 }, | |
8
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
68 Statement::AugAssign(target, op, value) => { |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
69 self.visit_expr(value); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
70 self.visit_expr(target); |
94ff501bf336
Add ast.AugAssign.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
6
diff
changeset
|
71 }, |
0 | 72 Statement::Return(expr) => { |
73 self.visit_expr(expr); | |
74 }, | |
75 Statement::ImportFrom(module, names) => { | |
76 //self.visit_expr(module); | |
77 }, | |
78 Statement::Expr(expr) => { | |
79 self.visit_expr(expr); | |
80 }, | |
6
6f2bf13f4cb5
Add ast.While and ast.Break.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
5
diff
changeset
|
81 Statement::Break => {}, |
0 | 82 Statement::Error => { |
83 println!("Statement::Error"); | |
84 panic!() | |
85 }, | |
86 } | |
87 } | |
88 | |
89 fn visit_expr(&mut self, expr: Expr) -> () { | |
90 match expr { | |
91 Expr::BinOp(left, op, right) => { | |
92 self.visit_expr(*left); | |
93 self.visit_expr(*right); | |
94 }, | |
95 Expr::Compare(left, ops, comparators) => { | |
96 self.visit_expr(*left); | |
97 }, | |
98 Expr::Call(func, args) => { | |
99 let func = *func; | |
100 let func = match func { | |
101 Expr::Name(arg) => arg, | |
102 _ => panic!() | |
103 }; | |
104 for expr in args { | |
105 self.visit_expr(expr); | |
106 } | |
107 }, | |
108 Expr::Alias(_, _) => (), | |
109 Expr::Name(_) => (), | |
110 Expr::NameConstant(value) => (), | |
111 Expr::Str(_) => (), | |
112 Expr::Num(_) => (), | |
113 Expr::Error => { | |
114 println!("Expr::Error"); | |
115 panic!() | |
116 } | |
117 } | |
118 } | |
119 } | |
120 | |
121 #[allow(dead_code)] | |
122 pub fn rewrite_ast(ast: Module) { | |
123 let mut typing = Rewrite{}; | |
124 typing.visit_module(ast); | |
125 } |