changeset 8:94ff501bf336

Add ast.AugAssign.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Tue, 31 May 2016 04:34:42 +0100
parents 680d15073f55
children fa7e285f88e7
files src/ast_convert.rs src/ast_dump.rs src/ast_rewrite.rs src/ast_type.rs src/python_ast.rs
diffstat 5 files changed, 22 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/ast_convert.rs
+++ b/src/ast_convert.rs
@@ -255,6 +255,7 @@ fn parse_statement(py: Python, ast: PyOb
     let function_def_type = ast_module.get(py, "FunctionDef").unwrap();
     let global_type = ast_module.get(py, "Global").unwrap();
     let assign_type = ast_module.get(py, "Assign").unwrap();
+    let aug_assign_type = ast_module.get(py, "AugAssign").unwrap();
     let return_type = ast_module.get(py, "Return").unwrap();
     let import_from_type = ast_module.get(py, "ImportFrom").unwrap();
     let if_type = ast_module.get(py, "If").unwrap();
@@ -418,6 +419,16 @@ fn parse_statement(py: Python, ast: PyOb
         let value = parse_expr(py, value);
 
         Statement::Assign(arguments, value)
+    } else if is_instance(&ast, &aug_assign_type) {
+        let target = ast.getattr(py, "target").unwrap();
+        let op = ast.getattr(py, "op").unwrap();
+        let value = ast.getattr(py, "value").unwrap();
+
+        let target = parse_expr(py, target);
+        let op = parse_binop(py, op);
+        let value = parse_expr(py, value);
+
+        Statement::AugAssign(target, op, value)
     } else if is_instance(&ast, &import_from_type) {
         let module = ast.getattr(py, "module").unwrap();
         let names = ast.getattr(py, "names").unwrap();
--- a/src/ast_dump.rs
+++ b/src/ast_dump.rs
@@ -175,6 +175,7 @@ impl Statement {
                 }
                 exprs.join(", ")
             }, value.to_string()),
+            Statement::AugAssign(target, op, value) => format!("{}{} {}= {}", make_indent(indent), target.to_string(), op.to_string(), value.to_string()),
             Statement::Return(expr) => format!("{}return {}", make_indent(indent), expr.to_string()),
             Statement::ImportFrom(module, names) => format!("{}from {} import {}", make_indent(indent), module.to_string(), {
                 let mut exprs = vec!();
--- a/src/ast_rewrite.rs
+++ b/src/ast_rewrite.rs
@@ -65,6 +65,10 @@ impl Visitor<()> for Rewrite {
                     self.visit_expr(target);
                 }
             },
+            Statement::AugAssign(target, op, value) => {
+                self.visit_expr(value);
+                self.visit_expr(target);
+            },
             Statement::Return(expr) => {
                 self.visit_expr(expr);
             },
--- a/src/ast_type.rs
+++ b/src/ast_type.rs
@@ -125,6 +125,11 @@ impl Visitor<Type> for Typing {
                 println!("{:?}", self.environment.clone());
                 Type::Bottom
             },
+            Statement::AugAssign(target, op, value) => {
+                let value = self.visit_expr(value);
+                let target = self.visit_expr(target);
+                Type::Bottom
+            },
             Statement::Return(expr) => {
                 self.visit_expr(expr)
             },
--- a/src/python_ast.rs
+++ b/src/python_ast.rs
@@ -13,6 +13,7 @@ pub enum Statement {
     For(Expr, Expr, Vec<Statement>, Vec<Statement>),
     While(Expr, Vec<Statement>, Vec<Statement>),
     Assign(Vec<Expr>, Expr),
+    AugAssign(Expr, BinOp, Expr),
     Return(Expr),
     ImportFrom(String, Vec<Expr>),
     Expr(Expr),