@@ -141,6 +141,7 @@ def trace_print(*args):
141
141
_BRACE_REASON_OTHER = 0
142
142
_BRACE_REASON_NS = 1
143
143
_BRACE_REASON_EXTERN = 2
144
+ _BRACE_REASON_VARIABLE = 3
144
145
145
146
# Track what was added in what order and at what depth
146
147
parseHistory = []
@@ -239,10 +240,13 @@ def is_property_namestack(nameStack):
239
240
r = False
240
241
if "(" not in nameStack and ")" not in nameStack :
241
242
r = True
242
- elif (
243
- "(" in nameStack
244
- and "=" in nameStack
245
- and nameStack .index ("=" ) < nameStack .index ("(" )
243
+ elif "(" in nameStack and (
244
+ ( # = initialization
245
+ "=" in nameStack and nameStack .index ("=" ) < nameStack .index ("(" )
246
+ )
247
+ or ( # {} initialization
248
+ "{" in nameStack and nameStack .index ("{" ) < nameStack .index ("(" )
249
+ )
246
250
):
247
251
r = True
248
252
# See if we are a function pointer
@@ -1217,29 +1221,48 @@ def __init__(self, nameStack, doxygen, location, is_var=True, **kwargs):
1217
1221
else :
1218
1222
self ["extern" ] = False
1219
1223
1224
+ if "=" in nameStack :
1225
+ self ["type" ] = " " .join (nameStack [: nameStack .index ("=" ) - 1 ])
1226
+ self ["name" ] = nameStack [nameStack .index ("=" ) - 1 ]
1227
+ default = " " .join (nameStack [nameStack .index ("=" ) + 1 :])
1228
+ nameStack = nameStack [: nameStack .index ("=" )]
1229
+ default = self ._filter_name (default )
1230
+ self ["default" ] = default
1231
+ # backwards compat; deprecate camelCase in dicts
1232
+ self ["defaultValue" ] = default
1233
+ elif "{" in nameStack and "}" in nameStack :
1234
+ posBracket = nameStack .index ("{" )
1235
+ self ["type" ] = " " .join (nameStack [: posBracket - 1 ])
1236
+ self ["name" ] = nameStack [posBracket - 1 ]
1237
+ default = " " .join (nameStack [posBracket + 1 : - 1 ])
1238
+ nameStack = nameStack [:posBracket ]
1239
+ default = self ._filter_name (default )
1240
+ self ["default" ] = default
1241
+ # backwards compat; deprecate camelCase in dicts
1242
+ self ["defaultValue" ] = default
1243
+
1220
1244
_stack_ = nameStack
1221
- if "[" in nameStack : # strip off array informatin
1222
- arrayStack = nameStack [nameStack .index ("[" ) :]
1223
- if nameStack .count ("[" ) > 1 :
1245
+ self ["array" ] = 0
1246
+ while "]" in nameStack [- 1 ]: # strip off array information
1247
+ arrayPos = len (nameStack ) - 1 - nameStack [::- 1 ].index ("[" )
1248
+ arrayStack = nameStack [arrayPos :]
1249
+ if self ["array" ] == 1 :
1224
1250
debug_print ("Multi dimensional array" )
1225
1251
debug_print ("arrayStack=%s" , arrayStack )
1226
- nums = [x for x in arrayStack if x .isdigit ()]
1227
- # Calculate size by multiplying all dimensions
1228
- p = 1
1229
- for n in nums :
1230
- p *= int (n )
1252
+ if len (arrayStack ) == 3 :
1253
+ n = arrayStack [1 ]
1231
1254
# Multi dimensional array
1232
- self ["array_size" ] = p
1255
+ if not "multi_dimensional_array_size" in self :
1256
+ self ["multi_dimensional_array_size" ] = self ["array_size" ]
1257
+ self ["multi_dimensional_array_size" ] += "x" + n
1258
+ self ["array_size" ] = str (int (self ["array_size" ]) * int (n ))
1233
1259
self ["multi_dimensional_array" ] = 1
1234
- self ["multi_dimensional_array_size" ] = "x" .join (nums )
1235
1260
else :
1236
1261
debug_print ("Array" )
1237
1262
if len (arrayStack ) == 3 :
1238
1263
self ["array_size" ] = arrayStack [1 ]
1239
- nameStack = nameStack [: nameStack . index ( "[" ) ]
1264
+ nameStack = nameStack [:arrayPos ]
1240
1265
self ["array" ] = 1
1241
- else :
1242
- self ["array" ] = 0
1243
1266
nameStack = self ._name_stack_helper (nameStack )
1244
1267
1245
1268
if doxygen :
@@ -1268,15 +1291,6 @@ def __init__(self, nameStack, doxygen, location, is_var=True, **kwargs):
1268
1291
)
1269
1292
self ["function_pointer" ] = 1
1270
1293
1271
- elif "=" in nameStack :
1272
- self ["type" ] = " " .join (nameStack [: nameStack .index ("=" ) - 1 ])
1273
- self ["name" ] = nameStack [nameStack .index ("=" ) - 1 ]
1274
- default = " " .join (nameStack [nameStack .index ("=" ) + 1 :])
1275
- default = self ._filter_name (default )
1276
- self ["default" ] = default
1277
- # backwards compat; deprecate camelCase in dicts
1278
- self ["defaultValue" ] = default
1279
-
1280
1294
elif (
1281
1295
is_fundamental (nameStack [- 1 ])
1282
1296
or nameStack [- 1 ] in [">" , "<" , ":" , "." ]
@@ -2931,7 +2945,23 @@ def __init__(
2931
2945
continue
2932
2946
2933
2947
if parenDepth == 0 and tok .type == "{" :
2934
- self .lastBraceReason = _BRACE_REASON_OTHER
2948
+ if self .nameStack [0 ] in (
2949
+ "class" ,
2950
+ "struct" ,
2951
+ "union" ,
2952
+ "namespace" ,
2953
+ "enum" ,
2954
+ "extern" ,
2955
+ "typedef" ,
2956
+ ) or (is_method_namestack (self .stack ) or (not self .curClass )):
2957
+ self .lastBraceReason = _BRACE_REASON_OTHER
2958
+ else :
2959
+ # Case : type variable {init};
2960
+ self .lastBraceReason = _BRACE_REASON_VARIABLE
2961
+ self .braceDepth += 1
2962
+ self .braceReason .append (self .lastBraceReason )
2963
+ self .nameStack .append (tok .value )
2964
+ continue
2935
2965
if len (self .nameStack ) >= 2 and is_namespace (
2936
2966
self .nameStack
2937
2967
): # namespace {} with no name used in boost, this sets default?
@@ -2991,6 +3021,10 @@ def __init__(
2991
3021
self .linkage_stack .pop ()
2992
3022
self .stack = [] # clear stack when linkage ends?
2993
3023
self .stmtTokens = []
3024
+ # Case : type variable {init};
3025
+ elif reason == _BRACE_REASON_VARIABLE :
3026
+ self .nameStack .append (tok .value )
3027
+ continue
2994
3028
else :
2995
3029
self ._evaluate_stack ()
2996
3030
self .braceDepth -= 1
0 commit comments