comparison src/ast_rewrite.rs @ 0:211b0df72e64

Hello world!
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sun, 29 May 2016 19:15:02 +0100
parents
children ddf372373a77
comparison
equal deleted inserted replaced
-1:000000000000 0:211b0df72e64
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 },
43 Statement::Assign(targets, value) => {
44 self.visit_expr(value);
45 for target in targets {
46 self.visit_expr(target);
47 }
48 },
49 Statement::Return(expr) => {
50 self.visit_expr(expr);
51 },
52 Statement::ImportFrom(module, names) => {
53 //self.visit_expr(module);
54 },
55 Statement::Expr(expr) => {
56 self.visit_expr(expr);
57 },
58 Statement::Error => {
59 println!("Statement::Error");
60 panic!()
61 },
62 }
63 }
64
65 fn visit_expr(&mut self, expr: Expr) -> () {
66 match expr {
67 Expr::BinOp(left, op, right) => {
68 self.visit_expr(*left);
69 self.visit_expr(*right);
70 },
71 Expr::Compare(left, ops, comparators) => {
72 self.visit_expr(*left);
73 },
74 Expr::Call(func, args) => {
75 let func = *func;
76 let func = match func {
77 Expr::Name(arg) => arg,
78 _ => panic!()
79 };
80 for expr in args {
81 self.visit_expr(expr);
82 }
83 },
84 Expr::Alias(_, _) => (),
85 Expr::Name(_) => (),
86 Expr::NameConstant(value) => (),
87 Expr::Str(_) => (),
88 Expr::Num(_) => (),
89 Expr::Error => {
90 println!("Expr::Error");
91 panic!()
92 }
93 }
94 }
95 }
96
97 #[allow(dead_code)]
98 pub fn rewrite_ast(ast: Module) {
99 let mut typing = Rewrite{};
100 typing.visit_module(ast);
101 }