annotate src/python_symtable.rs @ 91:859d44f143b8

Implement Bytes in the AST.
author Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
date Sat, 25 Jun 2016 02:08:50 +0100
parents 4e62a8927dcc
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }