Mercurial > python-compiler.rs
annotate src/ast_scope.rs @ 11:5c169d5807b5
Remove dead code.
author | Emmanuel Gil Peyrot <linkmauve@linkmauve.fr> |
---|---|
date | Thu, 02 Jun 2016 01:22:28 +0100 |
parents | 3bf4903d1d2c |
children | 0e96c5bc401d |
rev | line source |
---|---|
9
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
1 use python_ast::{Module, Statement, Expr}; |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
2 |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
3 use std::collections::HashMap; |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
4 |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
5 #[derive(Debug)] |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
6 struct Block { |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
7 statements: Vec<(Statement, Option<Box<Block>>)>, |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
8 bindings: Vec<String> |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
9 } |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
10 |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
11 #[derive(Debug)] |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
12 pub struct Scoping { |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
13 modules: HashMap<String, Block> |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
14 } |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
15 |
10
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
16 fn scope_expr(expr: Expr, block: &mut Block) { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
17 println!("{:?}", expr); |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
18 } |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
19 |
9
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
20 fn scope_statement(statement: Statement, block: &mut Block) { |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
21 let new_block = match statement.clone() { |
10
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
22 Statement::Assign(targets, value) => { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
23 //scope_expr(value, &mut block); |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
24 for target in targets { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
25 match target { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
26 Expr::Name(name) => block.bindings.push(name), |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
27 _ => () // No new binding. |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
28 } |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
29 } |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
30 None |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
31 }, |
9
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
32 Statement::FunctionDef(name, args, statements) => { |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
33 block.bindings.push(name.clone()); |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
34 let mut function_block = Block{statements: vec!(), bindings: args.clone()}; |
10
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
35 for statement in statements { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
36 scope_statement(statement, &mut function_block); |
9
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
37 } |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
38 Some(Box::new(function_block)) |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
39 }, |
10
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
40 Statement::ImportFrom(module, names) => { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
41 for name in names { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
42 let name = match name { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
43 Expr::Alias(name, asname) => (name, asname), |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
44 _ => panic!() |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
45 }; |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
46 let nameas = name.1; |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
47 let name = name.0; |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
48 match nameas { |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
49 Some(name) => block.bindings.push(name), |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
50 None => block.bindings.push(name) |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
51 } |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
52 } |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
53 None |
3bf4903d1d2c
Add Assign and ImportFrom bindings.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
9
diff
changeset
|
54 }, |
9
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
55 _ => None |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
56 }; |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
57 block.statements.push((statement, new_block)); |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
58 } |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
59 |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
60 #[allow(dead_code)] |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
61 pub fn scope_ast(modules: Vec<Module>) -> Scoping { |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
62 let mut scoping = Scoping{modules: HashMap::new()}; |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
63 for module in modules { |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
64 let mut block = Block{statements: vec!(), bindings: vec!()}; |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
65 for statement in module.statements { |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
66 scope_statement(statement, &mut block); |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
67 } |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
68 scoping.modules.insert(module.name, block); |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
69 } |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
70 scoping |
fa7e285f88e7
Add a scoping pass, associating each module/statement with a block.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
71 } |