@@ -179,6 +179,13 @@ class N::C {
179
179
# Visitor implementation
180
180
#
181
181
182
+ # define what user data we store in each state type
183
+ SState = State [Block , Block ]
184
+ SEmptyBlockState = EmptyBlockState [Block , Block ]
185
+ SExternBlockState = ExternBlockState [Block , Block ]
186
+ SNamespaceBlockState = NamespaceBlockState [NamespaceScope , NamespaceScope ]
187
+ SClassBlockState = ClassBlockState [ClassScope , Block ]
188
+
182
189
183
190
class SimpleCxxVisitor :
184
191
"""
@@ -190,43 +197,35 @@ class SimpleCxxVisitor:
190
197
"""
191
198
192
199
data : ParsedData
193
- namespace : NamespaceScope
194
- block : Block
195
-
196
- def __init__ (self ) -> None :
197
- self .namespace = NamespaceScope ("" )
198
- self .block = self .namespace
199
-
200
- self .ns_stack = typing .Deque [NamespaceScope ]()
201
- self .block_stack = typing .Deque [Block ]()
202
200
203
- self .data = ParsedData (self .namespace )
201
+ def on_parse_start (self , state : SNamespaceBlockState ) -> None :
202
+ ns = NamespaceScope ("" )
203
+ self .data = ParsedData (ns )
204
+ state .user_data = ns
204
205
205
- def on_pragma (self , state : State , content : Value ) -> None :
206
+ def on_pragma (self , state : SState , content : Value ) -> None :
206
207
self .data .pragmas .append (Pragma (content ))
207
208
208
- def on_include (self , state : State , filename : str ) -> None :
209
+ def on_include (self , state : SState , filename : str ) -> None :
209
210
self .data .includes .append (Include (filename ))
210
211
211
- def on_empty_block_start (self , state : EmptyBlockState ) -> None :
212
+ def on_empty_block_start (self , state : SEmptyBlockState ) -> None :
212
213
# this matters for some scope/resolving purposes, but you're
213
214
# probably going to want to use clang if you care about that
214
215
# level of detail
215
- pass
216
+ state . user_data = state . parent . user_data
216
217
217
- def on_empty_block_end (self , state : EmptyBlockState ) -> None :
218
+ def on_empty_block_end (self , state : SEmptyBlockState ) -> None :
218
219
pass
219
220
220
- def on_extern_block_start (self , state : ExternBlockState ) -> None :
221
- pass # TODO
221
+ def on_extern_block_start (self , state : SExternBlockState ) -> None :
222
+ state . user_data = state . parent . user_data
222
223
223
- def on_extern_block_end (self , state : ExternBlockState ) -> None :
224
+ def on_extern_block_end (self , state : SExternBlockState ) -> None :
224
225
pass
225
226
226
- def on_namespace_start (self , state : NamespaceBlockState ) -> None :
227
- parent_ns = self .namespace
228
- self .block_stack .append (parent_ns )
229
- self .ns_stack .append (parent_ns )
227
+ def on_namespace_start (self , state : SNamespaceBlockState ) -> None :
228
+ parent_ns = state .parent .user_data
230
229
231
230
ns = None
232
231
names = state .namespace .names
@@ -247,81 +246,76 @@ def on_namespace_start(self, state: NamespaceBlockState) -> None:
247
246
ns .inline = state .namespace .inline
248
247
ns .doxygen = state .namespace .doxygen
249
248
250
- self .block = ns
251
- self .namespace = ns
249
+ state .user_data = ns
252
250
253
- def on_namespace_end (self , state : NamespaceBlockState ) -> None :
254
- self .block = self .block_stack .pop ()
255
- self .namespace = self .ns_stack .pop ()
251
+ def on_namespace_end (self , state : SNamespaceBlockState ) -> None :
252
+ pass
256
253
257
- def on_namespace_alias (self , state : State , alias : NamespaceAlias ) -> None :
258
- assert isinstance (self . block , NamespaceScope )
259
- self . block .ns_alias .append (alias )
254
+ def on_namespace_alias (self , state : SState , alias : NamespaceAlias ) -> None :
255
+ assert isinstance (state . user_data , NamespaceScope )
256
+ state . user_data .ns_alias .append (alias )
260
257
261
- def on_forward_decl (self , state : State , fdecl : ForwardDecl ) -> None :
262
- self . block .forward_decls .append (fdecl )
258
+ def on_forward_decl (self , state : SState , fdecl : ForwardDecl ) -> None :
259
+ state . user_data .forward_decls .append (fdecl )
263
260
264
- def on_template_inst (self , state : State , inst : TemplateInst ) -> None :
265
- assert isinstance (self . block , NamespaceScope )
266
- self . block .template_insts .append (inst )
261
+ def on_template_inst (self , state : SState , inst : TemplateInst ) -> None :
262
+ assert isinstance (state . user_data , NamespaceScope )
263
+ state . user_data .template_insts .append (inst )
267
264
268
- def on_variable (self , state : State , v : Variable ) -> None :
269
- assert isinstance (self . block , NamespaceScope )
270
- self . block .variables .append (v )
265
+ def on_variable (self , state : SState , v : Variable ) -> None :
266
+ assert isinstance (state . user_data , NamespaceScope )
267
+ state . user_data .variables .append (v )
271
268
272
- def on_function (self , state : State , fn : Function ) -> None :
273
- assert isinstance (self . block , NamespaceScope )
274
- self . block .functions .append (fn )
269
+ def on_function (self , state : SState , fn : Function ) -> None :
270
+ assert isinstance (state . user_data , NamespaceScope )
271
+ state . user_data .functions .append (fn )
275
272
276
- def on_method_impl (self , state : State , method : Method ) -> None :
277
- assert isinstance (self . block , NamespaceScope )
278
- self . block .method_impls .append (method )
273
+ def on_method_impl (self , state : SState , method : Method ) -> None :
274
+ assert isinstance (state . user_data , NamespaceScope )
275
+ state . user_data .method_impls .append (method )
279
276
280
- def on_typedef (self , state : State , typedef : Typedef ) -> None :
281
- self . block .typedefs .append (typedef )
277
+ def on_typedef (self , state : SState , typedef : Typedef ) -> None :
278
+ state . user_data .typedefs .append (typedef )
282
279
283
- def on_using_namespace (self , state : State , namespace : typing .List [str ]) -> None :
284
- assert isinstance (self . block , NamespaceScope )
280
+ def on_using_namespace (self , state : SState , namespace : typing .List [str ]) -> None :
281
+ assert isinstance (state . user_data , NamespaceScope )
285
282
ns = UsingNamespace ("::" .join (namespace ))
286
- self . block .using_ns .append (ns )
283
+ state . user_data .using_ns .append (ns )
287
284
288
- def on_using_alias (self , state : State , using : UsingAlias ) -> None :
289
- self . block .using_alias .append (using )
285
+ def on_using_alias (self , state : SState , using : UsingAlias ) -> None :
286
+ state . user_data .using_alias .append (using )
290
287
291
- def on_using_declaration (self , state : State , using : UsingDecl ) -> None :
292
- self . block .using .append (using )
288
+ def on_using_declaration (self , state : SState , using : UsingDecl ) -> None :
289
+ state . user_data .using .append (using )
293
290
294
291
#
295
292
# Enums
296
293
#
297
294
298
- def on_enum (self , state : State , enum : EnumDecl ) -> None :
299
- self . block .enums .append (enum )
295
+ def on_enum (self , state : SState , enum : EnumDecl ) -> None :
296
+ state . user_data .enums .append (enum )
300
297
301
298
#
302
299
# Class/union/struct
303
300
#
304
301
305
- def on_class_start (self , state : ClassBlockState ) -> None :
302
+ def on_class_start (self , state : SClassBlockState ) -> None :
303
+ parent = state .parent .user_data
306
304
block = ClassScope (state .class_decl )
307
- self .block .classes .append (block )
308
- self .block_stack .append (self .block )
309
- self .block = block
305
+ parent .classes .append (block )
306
+ state .user_data = block
310
307
311
- def on_class_field (self , state : State , f : Field ) -> None :
312
- assert isinstance (self .block , ClassScope )
313
- self .block .fields .append (f )
308
+ def on_class_field (self , state : SClassBlockState , f : Field ) -> None :
309
+ state .user_data .fields .append (f )
314
310
315
- def on_class_method (self , state : ClassBlockState , method : Method ) -> None :
316
- assert isinstance (self .block , ClassScope )
317
- self .block .methods .append (method )
311
+ def on_class_method (self , state : SClassBlockState , method : Method ) -> None :
312
+ state .user_data .methods .append (method )
318
313
319
- def on_class_friend (self , state : ClassBlockState , friend : FriendDecl ) -> None :
320
- assert isinstance (self .block , ClassScope )
321
- self .block .friends .append (friend )
314
+ def on_class_friend (self , state : SClassBlockState , friend : FriendDecl ) -> None :
315
+ state .user_data .friends .append (friend )
322
316
323
- def on_class_end (self , state : ClassBlockState ) -> None :
324
- self . block = self . block_stack . pop ()
317
+ def on_class_end (self , state : SClassBlockState ) -> None :
318
+ pass
325
319
326
320
327
321
def parse_string (
0 commit comments