changeset 10:3bf4903d1d2c

Add Assign and ImportFrom bindings.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Thu, 02 Jun 2016 01:00:29 +0100
parents fa7e285f88e7
children 5c169d5807b5
files example/blocks.py src/ast_scope.rs
diffstat 2 files changed, 32 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/example/blocks.py
+++ b/example/blocks.py
@@ -1,5 +1,6 @@
 def a(b):
     def c():
         return b
+    b = 2
     return c()
 print(a(1))
--- a/src/ast_scope.rs
+++ b/src/ast_scope.rs
@@ -98,16 +98,45 @@ pub fn scope_ast(ast: Module) -> Scoping
 }
 */
 
+fn scope_expr(expr: Expr, block: &mut Block) {
+    println!("{:?}", expr);
+}
+
 fn scope_statement(statement: Statement, block: &mut Block) {
     let new_block = match statement.clone() {
+        Statement::Assign(targets, value) => {
+            //scope_expr(value, &mut block);
+            for target in targets {
+                match target {
+                    Expr::Name(name) => block.bindings.push(name),
+                    _ => ()  // No new binding.
+                }
+            }
+            None
+        },
         Statement::FunctionDef(name, args, statements) => {
             block.bindings.push(name.clone());
             let mut function_block = Block{statements: vec!(), bindings: args.clone()};
-            for other_statement in statements {
-                scope_statement(other_statement, &mut function_block);
+            for statement in statements {
+                scope_statement(statement, &mut function_block);
             }
             Some(Box::new(function_block))
         },
+        Statement::ImportFrom(module, names) => {
+            for name in names {
+                let name = match name {
+                    Expr::Alias(name, asname) => (name, asname),
+                    _ => panic!()
+                };
+                let nameas = name.1;
+                let name = name.0;
+                match nameas {
+                    Some(name) => block.bindings.push(name),
+                    None => block.bindings.push(name)
+                }
+            }
+            None
+        },
         _ => None
     };
     block.statements.push((statement, new_block));