diff 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
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/src/ast_rewrite.rs
@@ -0,0 +1,101 @@
+use python_ast::{Module, Statement, Expr};
+
+trait Visitor<T> {
+    fn visit_module(&mut self, module: Module) -> T;
+    fn visit_statement(&mut self, statement: Statement) -> T;
+    fn visit_expr(&mut self, expr: Expr) -> T;
+}
+
+struct Rewrite {
+}
+
+impl Visitor<()> for Rewrite {
+    fn visit_module(&mut self, module: Module) -> () {
+        for statement in module.statements {
+            println!("{:?}", statement);
+            self.visit_statement(statement);
+        }
+    }
+
+    fn visit_statement(&mut self, statement: Statement) -> () {
+        match statement {
+            Statement::FunctionDef(Expr::Name(name), arguments, body) => {
+                for expr in arguments {
+                    self.visit_expr(expr);
+                }
+                for statement in body {
+                    self.visit_statement(statement);
+                }
+            },
+            Statement::FunctionDef(_, _, _) => {
+                println!("Statement:FunctionDef Error");
+                panic!()
+            },
+            Statement::If(test, body, orelse) => {
+                self.visit_expr(test);
+                for statement in body {
+                    self.visit_statement(statement);
+                }
+                for statement in orelse {
+                    self.visit_statement(statement);
+                }
+            },
+            Statement::Assign(targets, value) => {
+                self.visit_expr(value);
+                for target in targets {
+                    self.visit_expr(target);
+                }
+            },
+            Statement::Return(expr) => {
+                self.visit_expr(expr);
+            },
+            Statement::ImportFrom(module, names) => {
+                //self.visit_expr(module);
+            },
+            Statement::Expr(expr) => {
+                self.visit_expr(expr);
+            },
+            Statement::Error => {
+                println!("Statement::Error");
+                panic!()
+            },
+        }
+    }
+
+    fn visit_expr(&mut self, expr: Expr) -> () {
+        match expr {
+            Expr::BinOp(left, op, right) => {
+                self.visit_expr(*left);
+                self.visit_expr(*right);
+            },
+            Expr::Compare(left, ops, comparators) => {
+                self.visit_expr(*left);
+            },
+            Expr::Call(func, args) => {
+                let func = *func;
+                let func = match func {
+                    Expr::Name(arg) => arg,
+                    _ => panic!()
+                };
+                for expr in args {
+                    self.visit_expr(expr);
+                }
+            },
+            Expr::Alias(_, _) => (),
+            Expr::Name(_) => (),
+            Expr::NameConstant(value) => (),
+            Expr::Str(_) => (),
+            Expr::Num(_) => (),
+            Expr::Error => {
+                println!("Expr::Error");
+                panic!()
+            }
+        }
+    }
+}
+
+#[allow(dead_code)]
+pub fn rewrite_ast(ast: Module) {
+    let mut typing = Rewrite{};
+    typing.visit_module(ast);
+}