Mercurial > python-compiler.rs
annotate src/python_symtable.rs @ 94:e0368bea06a6
Refactor tests a little bit so it's easier to add more.
author | Bastien Orivel <eijebong@bananium.fr> |
---|---|
date | Tue, 14 Jun 2016 18:39:48 +0200 |
parents | 4e62a8927dcc |
children |
rev | line source |
---|---|
90
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
1 use cpython::{Python, PyObject, PyErr, NoArgs}; |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
2 use cpython::ObjectProtocol; //for call method |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
3 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
4 #[derive(Clone, Debug, PartialEq, Eq, Hash)] |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
5 pub enum Type { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
6 Module, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
7 Class, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
8 Function |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
9 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
10 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
11 #[derive(Clone, Debug, PartialEq, Eq, Hash)] |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
12 pub struct SymbolTable { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
13 pub type_: Type, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
14 pub id: usize, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
15 pub name: String, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
16 pub lineno: usize, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
17 pub optimized: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
18 pub nested: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
19 pub has_exec: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
20 pub identifiers: Vec<String>, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
21 pub symbols: Vec<Symbol>, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
22 pub children: Vec<SymbolTable> |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
23 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
24 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
25 impl SymbolTable { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
26 fn lookup(self, name: String) -> Option<Symbol> { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
27 for symbol in self.symbols { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
28 if symbol.name == name { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
29 return Some(symbol); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
30 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
31 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
32 None |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
33 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
34 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
35 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
36 #[derive(Clone, Debug, PartialEq, Eq, Hash)] |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
37 pub struct Symbol { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
38 pub name: String, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
39 pub referenced: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
40 pub imported: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
41 pub parameter: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
42 pub global: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
43 pub declared_global: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
44 pub local: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
45 pub free: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
46 pub assigned: bool, |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
47 pub namespaces: Vec<SymbolTable> |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
48 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
49 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
50 fn parse_symbol(py: Python, symbol: PyObject) -> Symbol { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
51 let get_name = symbol.getattr(py, "get_name").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
52 let name = get_name.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
53 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
54 let is_referenced = symbol.getattr(py, "is_referenced").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
55 let referenced = is_referenced.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
56 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
57 let is_imported = symbol.getattr(py, "is_imported").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
58 let imported = is_imported.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
59 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
60 let is_parameter = symbol.getattr(py, "is_parameter").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
61 let parameter = is_parameter.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
62 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
63 let is_global = symbol.getattr(py, "is_global").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
64 let global = is_global.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
65 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
66 let is_declared_global = symbol.getattr(py, "is_declared_global").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
67 let declared_global = is_declared_global.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
68 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
69 let is_local = symbol.getattr(py, "is_local").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
70 let local = is_local.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
71 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
72 let is_free = symbol.getattr(py, "is_free").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
73 let free = is_free.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
74 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
75 let is_assigned = symbol.getattr(py, "is_assigned").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
76 let assigned = is_assigned.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
77 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
78 let is_namespace = symbol.getattr(py, "is_namespace").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
79 let namespace = is_namespace.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
80 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
81 let namespaces = if namespace { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
82 let get_namespaces = symbol.getattr(py, "get_namespaces").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
83 let namespaces = get_namespaces.call(py, NoArgs, None).unwrap().iter(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
84 let mut new_namespaces = vec!(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
85 for namespace in namespaces { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
86 let namespace = namespace.unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
87 let symtable = parse_symtable(py, namespace); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
88 new_namespaces.push(symtable); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
89 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
90 new_namespaces |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
91 } else { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
92 vec!() |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
93 }; |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
94 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
95 Symbol{name: name, referenced: referenced, imported: imported, parameter: parameter, global: global, declared_global: declared_global, local: local, free: free, assigned: assigned, namespaces: namespaces} |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
96 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
97 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
98 fn parse_symtable(py: Python, symtable: PyObject) -> SymbolTable { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
99 let get_type = symtable.getattr(py, "get_type").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
100 let type_: String = get_type.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
101 let type_ = if type_ == "module" { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
102 Type::Module |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
103 } else if type_ == "class" { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
104 Type::Class |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
105 } else if type_ == "function" { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
106 Type::Function |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
107 } else { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
108 unreachable!(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
109 }; |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
110 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
111 let get_id = symtable.getattr(py, "get_id").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
112 let id = get_id.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
113 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
114 let get_name = symtable.getattr(py, "get_name").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
115 let name = get_name.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
116 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
117 let get_lineno = symtable.getattr(py, "get_lineno").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
118 let lineno = get_lineno.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
119 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
120 let is_optimized = symtable.getattr(py, "is_optimized").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
121 let optimized = is_optimized.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
122 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
123 let is_nested = symtable.getattr(py, "is_nested").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
124 let nested = is_nested.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
125 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
126 let has_children = symtable.getattr(py, "has_children").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
127 let has_children = has_children.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
128 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
129 let has_exec = symtable.getattr(py, "has_exec").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
130 let has_exec = has_exec.call(py, NoArgs, None).unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
131 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
132 let identifiers = { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
133 let get_identifiers = symtable.getattr(py, "get_identifiers").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
134 let identifiers = get_identifiers.call(py, NoArgs, None).unwrap().iter(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
135 let mut new_identifiers = vec!(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
136 for identifier in identifiers { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
137 let identifier = identifier.unwrap().extract(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
138 new_identifiers.push(identifier); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
139 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
140 new_identifiers |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
141 }; |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
142 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
143 let symbols = { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
144 let get_symbols = symtable.getattr(py, "get_symbols").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
145 let symbols = get_symbols.call(py, NoArgs, None).unwrap().iter(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
146 let mut new_symbols = vec!(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
147 for symbol in symbols { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
148 let symbol = symbol.unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
149 let symbol = parse_symbol(py, symbol); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
150 new_symbols.push(symbol); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
151 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
152 new_symbols |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
153 }; |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
154 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
155 let children = if has_children { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
156 let get_children = symtable.getattr(py, "get_children").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
157 let children = get_children.call(py, NoArgs, None).unwrap().iter(py).unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
158 let mut new_children = vec!(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
159 for child in children { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
160 let child = child.unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
161 let child = parse_symtable(py, child); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
162 new_children.push(child); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
163 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
164 new_children |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
165 } else { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
166 vec!() |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
167 }; |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
168 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
169 SymbolTable{type_: type_, id: id, name: name, lineno: lineno, optimized: optimized, nested: nested, has_exec: has_exec, identifiers: identifiers, symbols: symbols, children: children} |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
170 } |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
171 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
172 pub fn generate_symtable(code: String, filename: &String) -> Result<SymbolTable, PyErr> { |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
173 let gil = Python::acquire_gil(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
174 let py = gil.python(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
175 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
176 let symtable_module = py.import("symtable").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
177 let symtable_symtable = symtable_module.get(py, "symtable").unwrap(); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
178 |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
179 let symtable = try!(symtable_symtable.call(py, (code, filename, "exec"), None)); |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
180 //Ok(symtable) |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
181 Ok(parse_symtable(py, symtable)) |
4e62a8927dcc
Add a symtable module, to obtain information about symbols.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents:
diff
changeset
|
182 } |