@@ -2443,6 +2443,29 @@ def _evaluate_typedef(self):
2443
2443
if name not in self .typedefs_order :
2444
2444
self .typedefs_order .append (name )
2445
2445
2446
+ def _finish_struct_typedef (self ):
2447
+ # Look for the name of a typedef struct: struct typedef {...] StructName; or unions to get renamed
2448
+ debug_print ("finish struct typedef" )
2449
+ self .typedef_encountered = False
2450
+
2451
+ toks = self ._consume_up_to ([], ";" )
2452
+
2453
+ # grab the first name token, TODO: typedef struct{} X, *PX;
2454
+ for tok in toks :
2455
+ if tok .type == "NAME" :
2456
+ new_name = tok .value
2457
+ break
2458
+ else :
2459
+ return
2460
+
2461
+ type_name_to_rename = self .curClass ["name" ]
2462
+ type_to_rename = self .classes [type_name_to_rename ]
2463
+ type_to_rename ["name" ] = new_name
2464
+ # Now re install it in its new location
2465
+ self .classes [new_name ] = type_to_rename
2466
+ if new_name != type_name_to_rename :
2467
+ del self .classes [type_name_to_rename ]
2468
+
2446
2469
def _evaluate_property_stack (self , clearStack = True , addToVar = None ):
2447
2470
"""Create a Property out of the name stack"""
2448
2471
global parseHistory
@@ -2756,12 +2779,13 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
2756
2779
"curAccessSpecifier changed/defaulted to %s" , self .curAccessSpecifier
2757
2780
)
2758
2781
self .initextra ()
2759
- # Old namestacks for a given level
2760
- self .nameStackHistory = []
2782
+
2761
2783
self .anon_struct_counter = 0
2762
2784
self .anon_union_counter = 0
2763
2785
self .anon_class_counter = 0
2764
2786
2787
+ self .typedef_encountered = False
2788
+
2765
2789
#: Using directives in this header outside of class scope: key is
2766
2790
#: full name for lookup, value is :class:`.CppVariable`
2767
2791
self .using = {}
@@ -2978,6 +3002,10 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
2978
3002
if self .accessSpecifierStack :
2979
3003
self .curAccessSpecifier = self .accessSpecifierStack [- 1 ]
2980
3004
self .accessSpecifierStack = self .accessSpecifierStack [:- 1 ]
3005
+
3006
+ if self .curClass and self .typedef_encountered :
3007
+ self ._finish_struct_typedef ()
3008
+
2981
3009
if self .curClass and self .curClass ["parent" ]:
2982
3010
thisClass = self .curClass
2983
3011
self .curClass = self .curClass ["parent" ]
@@ -3094,10 +3122,10 @@ def __init__(self, headerFileName, argType="file", encoding=None, **kwargs):
3094
3122
"nameSpaces" ,
3095
3123
"curAccessSpecifier" ,
3096
3124
"accessSpecifierStack" ,
3097
- "nameStackHistory" ,
3098
3125
"anon_struct_counter" ,
3099
3126
"anon_union_counter" ,
3100
3127
"anon_class_counter" ,
3128
+ "typedef_encountered" ,
3101
3129
"_forward_decls" ,
3102
3130
"stack" ,
3103
3131
"mainClass" ,
@@ -3269,8 +3297,6 @@ def _discard_ctor_initializer(self):
3269
3297
def _evaluate_stack (self , token = None ):
3270
3298
"""Evaluates the current name stack"""
3271
3299
3272
- nameStackCopy = self .nameStack [:]
3273
-
3274
3300
debug_print (
3275
3301
"Evaluating stack %s\n BraceDepth: %s (called from %s)" ,
3276
3302
self .nameStack ,
@@ -3380,25 +3406,7 @@ def _evaluate_stack(self, token=None):
3380
3406
self ._parse_enum ()
3381
3407
self .stack = []
3382
3408
self .stmtTokens = []
3383
- elif (
3384
- len (self .nameStack ) == 1
3385
- and len (self .nameStackHistory ) > self .braceDepth
3386
- and (
3387
- self .nameStackHistory [self .braceDepth ][0 ][0 :2 ] == ["typedef" , "struct" ]
3388
- or self .nameStackHistory [self .braceDepth ][0 ][0 :2 ]
3389
- == ["typedef" , "union" ]
3390
- )
3391
- ):
3392
- # Look for the name of a typedef struct: struct typedef {...] StructName; or unions to get renamed
3393
- debug_print ("found the naming of a union" )
3394
- type_name_to_rename = self .nameStackHistory [self .braceDepth ][1 ]
3395
- new_name = self .nameStack [0 ]
3396
- type_to_rename = self .classes [type_name_to_rename ]
3397
- type_to_rename ["name" ] = self .nameStack [0 ]
3398
- # Now re install it in its new location
3399
- self .classes [new_name ] = type_to_rename
3400
- if new_name != type_name_to_rename :
3401
- del self .classes [type_name_to_rename ]
3409
+
3402
3410
elif self .stack [- 1 ] == ";" and is_property_namestack (self .nameStack ):
3403
3411
debug_print ("trace" )
3404
3412
if self .nameStack [0 ] in ("class" , "struct" ) and len (self .stack ) == 3 :
@@ -3410,13 +3418,16 @@ def _evaluate_stack(self, token=None):
3410
3418
else :
3411
3419
self ._evaluate_property_stack () # catches class props and structs in a namespace
3412
3420
3413
- elif (
3414
- self .nameStack [0 ] in ("class" , "struct" , "union" )
3415
- or self .nameStack [0 ] == "typedef"
3416
- and self .nameStack [1 ] in ("struct" , "union" )
3421
+ elif self .nameStack [0 ] in ("class" , "struct" , "union" ):
3422
+ debug_print ("trace" )
3423
+ self ._evaluate_class_stack ()
3424
+
3425
+ elif self .nameStack [0 ] == "typedef" and self .nameStack [1 ] in (
3426
+ "struct" ,
3427
+ "union" ,
3417
3428
):
3418
- # Parsing a union can reuse much of the class parsing
3419
3429
debug_print ("trace" )
3430
+ self .typedef_encountered = True
3420
3431
self ._evaluate_class_stack ()
3421
3432
3422
3433
elif not self .curClass :
@@ -3430,12 +3441,6 @@ def _evaluate_stack(self, token=None):
3430
3441
else :
3431
3442
debug_print ("Discarded statement %s" , self .nameStack )
3432
3443
3433
- className = self .curClass ["name" ] if self .curClass else ""
3434
- try :
3435
- self .nameStackHistory [self .braceDepth ] = (nameStackCopy , className )
3436
- except :
3437
- self .nameStackHistory .append ((nameStackCopy , className ))
3438
-
3439
3444
# its a little confusing to have some if/else above return and others not, and then clearning the nameStack down here
3440
3445
self .nameStack = []
3441
3446
self .lex .doxygenCommentCache = ""
@@ -3684,7 +3689,7 @@ def _strip_parent_keys(self):
3684
3689
for k in obj .keys ():
3685
3690
trace_print ("-Try key" , k )
3686
3691
trace_print ("-type" , type (obj [k ]))
3687
- if k in ["nameStackHistory" , " parent" , "_public_typedefs" ]:
3692
+ if k in ["parent" , "_public_typedefs" ]:
3688
3693
continue
3689
3694
if type (obj [k ]) == list :
3690
3695
for i in obj [k ]:
0 commit comments