goscript_parser/
objects.rs1#![macro_use]
2#![allow(unused_macros)]
3use super::ast;
4use super::scope;
5use slotmap::{new_key_type, DenseSlotMap};
6
7const DEFAULT_CAPACITY: usize = 16;
8
9macro_rules! new_objects {
10 () => {
11 DenseSlotMap::with_capacity_and_key(DEFAULT_CAPACITY)
12 };
13}
14
15new_key_type! { pub struct LabeledStmtKey; }
16new_key_type! { pub struct AssignStmtKey; }
17new_key_type! { pub struct SpecKey; }
18new_key_type! { pub struct FuncDeclKey; }
19new_key_type! { pub struct FuncTypeKey; }
20new_key_type! { pub struct IdentKey; }
21new_key_type! { pub struct FieldKey; }
22new_key_type! { pub struct EntityKey; }
23new_key_type! { pub struct ScopeKey; }
24
25pub type LabeledStmts = DenseSlotMap<LabeledStmtKey, ast::LabeledStmt>;
26pub type AssignStmts = DenseSlotMap<AssignStmtKey, ast::AssignStmt>;
27pub type Specs = DenseSlotMap<SpecKey, ast::Spec>;
28pub type FuncDecls = DenseSlotMap<FuncDeclKey, ast::FuncDecl>;
29pub type FuncTypes = DenseSlotMap<FuncTypeKey, ast::FuncType>;
30pub type Idents = DenseSlotMap<IdentKey, ast::Ident>;
31pub type Fields = DenseSlotMap<FieldKey, ast::Field>;
32pub type Entitys = DenseSlotMap<EntityKey, scope::Entity>;
33pub type Scopes = DenseSlotMap<ScopeKey, scope::Scope>;
34
35pub struct Objects {
36 pub l_stmts: LabeledStmts,
37 pub a_stmts: AssignStmts,
38 pub specs: Specs,
39 pub fdecls: FuncDecls,
40 pub ftypes: FuncTypes,
41 pub idents: Idents,
42 pub fields: Fields,
43 pub entities: Entitys,
44 pub scopes: Scopes,
45}
46
47impl Objects {
48 pub fn new() -> Objects {
49 Objects {
50 l_stmts: new_objects!(),
51 a_stmts: new_objects!(),
52 specs: new_objects!(),
53 fdecls: new_objects!(),
54 ftypes: new_objects!(),
55 idents: new_objects!(),
56 fields: new_objects!(),
57 entities: new_objects!(),
58 scopes: new_objects!(),
59 }
60 }
61}
62
63macro_rules! lab_stmts {
64 ($owner:ident) => {
65 &$owner.objects.l_stmts
66 };
67}
68macro_rules! lab_stmts_mut {
69 ($owner:ident) => {
70 &mut $owner.objects.l_stmts
71 };
72}
73macro_rules! lab_stmt {
74 ($owner:ident, $idx:expr) => {
75 &$owner.objects.l_stmts[$idx]
76 };
77}
78macro_rules! lab_stmt_mut {
79 ($owner:ident, $idx:expr) => {
80 &mut $owner.objects.l_stmts[$idx]
81 };
82}
83
84macro_rules! ass_stmts {
85 ($owner:ident) => {
86 &$owner.objects.a_stmts
87 };
88}
89macro_rules! ass_stmts_mut {
90 ($owner:ident) => {
91 &mut $owner.objects.a_stmts
92 };
93}
94macro_rules! ass_stmt {
95 ($owner:ident, $idx:expr) => {
96 &$owner.objects.a_stmts[$idx]
97 };
98}
99macro_rules! ass_stmt_mut {
100 ($owner:ident, $idx:expr) => {
101 &mut $owner.objects.a_stmts[$idx]
102 };
103}
104
105macro_rules! specs {
106 ($owner:ident) => {
107 &$owner.objects.specs
108 };
109}
110macro_rules! specs_mut {
111 ($owner:ident) => {
112 &mut $owner.objects.specs
113 };
114}
115macro_rules! spec {
116 ($owner:ident, $idx:expr) => {
117 &$owner.objects.specs[$idx]
118 };
119}
120macro_rules! spec_mut {
121 ($owner:ident, $idx:expr) => {
122 &mut $owner.objects.specs[$idx]
123 };
124}
125
126macro_rules! fn_decls {
127 ($owner:ident) => {
128 &$owner.objects.fdecls
129 };
130}
131macro_rules! fn_decls_mut {
132 ($owner:ident) => {
133 &mut $owner.objects.fdecls
134 };
135}
136macro_rules! fn_decl {
137 ($owner:ident, $idx:expr) => {
138 &$owner.objects.fdecls[$idx]
139 };
140}
141macro_rules! fn_decl_mut {
142 ($owner:ident, $idx:expr) => {
143 &mut $owner.objects.fdecls[$idx]
144 };
145}
146
147macro_rules! entities {
148 ($owner:ident) => {
149 &$owner.objects.entities
150 };
151}
152macro_rules! entities_mut {
153 ($owner:ident) => {
154 &mut $owner.objects.entities
155 };
156}
157macro_rules! entity {
158 ($owner:ident, $idx:expr) => {
159 &$owner.objects.entities[$idx]
160 };
161}
162macro_rules! entity_mut {
163 ($owner:ident, $idx:expr) => {
164 &mut $owner.objects.entities[$idx]
165 };
166}
167macro_rules! new_entity {
168 ($owner:ident, $kind:expr, $name:expr, $decl:expr, $data:expr) => {
169 $owner
170 .objects
171 .entities
172 .insert(Entity::new($kind, $name, $decl, $data))
173 };
174}
175
176macro_rules! scopes {
177 ($owner:ident) => {
178 &$owner.objects.scopes
179 };
180}
181macro_rules! scopes_mut {
182 ($owner:ident) => {
183 &mut $owner.objects.scopes
184 };
185}
186macro_rules! scope {
187 ($owner:ident, $idx:expr) => {
188 &$owner.objects.scopes[$idx]
189 };
190}
191macro_rules! scope_mut {
192 ($owner:ident, $idx:expr) => {
193 &mut $owner.objects.scopes[$idx]
194 };
195}
196macro_rules! new_scope {
197 ($owner:ident, $outer:expr) => {
198 $owner.objects.scopes.insert(Scope {
199 outer: $outer,
200 entities: HashMap::new(),
201 })
202 };
203}
204
205macro_rules! idents {
206 ($owner:ident) => {
207 &$owner.objects.idents
208 };
209}
210macro_rules! idents_mut {
211 ($owner:ident) => {
212 &mut $owner.objects.idents
213 };
214}
215macro_rules! ident {
216 ($owner:ident, $idx:expr) => {
217 &$owner.objects.idents[$idx]
218 };
219}
220macro_rules! ident_mut {
221 ($owner:ident, $idx:expr) => {
222 &mut $owner.objects.idents[$idx]
223 };
224}
225macro_rules! new_ident {
226 ($owner:ident, $pos:expr, $name:expr, $entity:expr) => {
227 $owner.objects.idents.insert(Ident {
228 pos: $pos,
229 name: $name,
230 entity: $entity,
231 })
232 };
233}
234
235macro_rules! field {
236 ($owner:ident, $idx:expr) => {
237 &$owner.objects.fields[$idx]
238 };
239}
240macro_rules! new_field {
241 ($owner:ident, $names:expr, $typ:expr, $tag:expr) => {
242 $owner.objects.fields.insert(Field {
243 names: $names,
244 typ: $typ,
245 tag: $tag,
246 })
247 };
248}