# HG changeset patch # User Emmanuel Gil Peyrot # Date 1464665682 -3600 # Node ID 94ff501bf3364279b1d1f312aa0c068974849640 # Parent 680d15073f550f3c7066ec21c1779db83e7be3bb Add ast.AugAssign. diff --git a/src/ast_convert.rs b/src/ast_convert.rs --- 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(); diff --git a/src/ast_dump.rs b/src/ast_dump.rs --- 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!(); diff --git a/src/ast_rewrite.rs b/src/ast_rewrite.rs --- 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); }, diff --git a/src/ast_type.rs b/src/ast_type.rs --- a/src/ast_type.rs +++ b/src/ast_type.rs @@ -125,6 +125,11 @@ impl Visitor 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) }, diff --git a/src/python_ast.rs b/src/python_ast.rs --- a/src/python_ast.rs +++ b/src/python_ast.rs @@ -13,6 +13,7 @@ pub enum Statement { For(Expr, Expr, Vec, Vec), While(Expr, Vec, Vec), Assign(Vec, Expr), + AugAssign(Expr, BinOp, Expr), Return(Expr), ImportFrom(String, Vec), Expr(Expr),