1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use std::collections::HashMap;
use def::Def;
use parse::{Block,SrcBlock};
use var::Var;
use fun::Fun;
impl Env {
pub fn def_contains(def: &Def, path: Option<Vec<&str>>, lookup: &str) -> bool {
if let Some(path) = path {
if let Some(ref def) = def.get(path[0]) {
return def.data.contains_key(lookup)
}
}
false
}
pub fn empty () -> Env {
Env { src: HashMap::new(), def: HashMap::new(), fun: HashMap::new() }
}
pub fn insert (&mut self, mut v: Vec<Block>) {
for b in v.drain(..) {
match b {
Block::Def(db) => {
self.def.insert(db.name.clone(), db);
},
Block::Src(sb) => {
self.src.insert(sb.name.clone(), sb);
},
}
}
}
pub fn insert_var (&mut self, block: &str, name: String, var: Var) -> Option<Var> {
if let Some(b) = self.def.get_mut(block) {
return b.data.insert(name, var)
}
None
}
}
pub struct Env {
pub def: Def,
pub src: HashMap<String, SrcBlock>,
pub fun: HashMap<String, Fun>,
}