view 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
line wrap: on
line source

use python_ast::{Module, Statement, Expr};

use std::collections::HashMap;

#[derive(Debug)]
struct Block {
    statements: Vec<(Statement, Option<Box<Block>>)>,
    bindings: Vec<String>
}

#[derive(Debug)]
pub struct Scoping {
    modules: HashMap<String, Block>
}

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 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));
}

#[allow(dead_code)]
pub fn scope_ast(modules: Vec<Module>) -> Scoping {
    let mut scoping = Scoping{modules: HashMap::new()};
    for module in modules {
        let mut block = Block{statements: vec!(), bindings: vec!()};
        for statement in module.statements {
            scope_statement(statement, &mut block);
        }
        scoping.modules.insert(module.name, block);
    }
    scoping
}