goscript_parser/
objects.rs

1#![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}