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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }