@@ -1273,21 +1273,149 @@ pub fn type_to_str(x: CXTypeKind) -> String {
1273
1273
1274
1274
/// Dump the Clang AST to stdout for debugging purposes.
1275
1275
pub fn ast_dump ( c : & Cursor , depth : isize ) -> CXChildVisitResult {
1276
- fn print_indent ( depth : isize , s : & str ) {
1276
+ fn print_indent < S : AsRef < str > > ( depth : isize , s : S ) {
1277
1277
for _ in 0 ..depth {
1278
- print ! ( "\t " ) ;
1278
+ print ! ( " " ) ;
1279
+ }
1280
+ println ! ( "{}" , s. as_ref( ) ) ;
1281
+ }
1282
+
1283
+ fn print_cursor < S : AsRef < str > > ( depth : isize , prefix : S , c : & Cursor ) {
1284
+ let prefix = prefix. as_ref ( ) ;
1285
+ print_indent ( depth, format ! ( " {}kind = {}" , prefix, kind_to_str( c. kind( ) ) ) ) ;
1286
+ print_indent ( depth, format ! ( " {}spelling = \" {}\" " , prefix, c. spelling( ) ) ) ;
1287
+ print_indent ( depth, format ! ( " {}location = {}" , prefix, c. location( ) ) ) ;
1288
+ print_indent ( depth, format ! ( " {}is-definition? {}" , prefix, c. is_definition( ) ) ) ;
1289
+ print_indent ( depth, format ! ( " {}is-declaration? {}" , prefix, c. is_declaration( ) ) ) ;
1290
+ print_indent ( depth, format ! ( " {}is-anonymous? {}" , prefix, c. is_anonymous( ) ) ) ;
1291
+ print_indent ( depth, format ! ( " {}is-inlined-function? {}" , prefix, c. is_inlined_function( ) ) ) ;
1292
+
1293
+ let templ_kind = c. template_kind ( ) ;
1294
+ if templ_kind != CXCursor_NoDeclFound {
1295
+ print_indent ( depth, format ! ( " {}template-kind = {}" , prefix, kind_to_str( templ_kind) ) ) ;
1296
+ }
1297
+ if let Some ( usr) = c. usr ( ) {
1298
+ print_indent ( depth, format ! ( " {}usr = \" {}\" " , prefix, usr) ) ;
1299
+ }
1300
+ if let Ok ( num) = c. num_args ( ) {
1301
+ print_indent ( depth, format ! ( " {}number-of-args = {}" , prefix, num) ) ;
1302
+ }
1303
+ if let Some ( num) = c. num_template_args ( ) {
1304
+ print_indent ( depth, format ! ( " {}number-of-template-args = {}" , prefix, num) ) ;
1305
+ }
1306
+ if let Some ( width) = c. bit_width ( ) {
1307
+ print_indent ( depth, format ! ( " {}bit-width = {}" , prefix, width) ) ;
1308
+ }
1309
+ if let Some ( ty) = c. enum_type ( ) {
1310
+ print_indent ( depth, format ! ( " {}enum-type = {}" , prefix, type_to_str( ty. kind( ) ) ) ) ;
1311
+ }
1312
+ if let Some ( val) = c. enum_val_signed ( ) {
1313
+ print_indent ( depth, format ! ( " {}enum-val = {}" , prefix, val) ) ;
1314
+ }
1315
+ if let Some ( ty) = c. typedef_type ( ) {
1316
+ print_indent ( depth, format ! ( " {}typedef-type = {}" , prefix, type_to_str( ty. kind( ) ) ) ) ;
1317
+ }
1318
+
1319
+ if let Some ( refd) = c. referenced ( ) {
1320
+ if refd != * c {
1321
+ println ! ( ) ;
1322
+ print_cursor ( depth, String :: from ( prefix) + "referenced." , & refd) ;
1323
+ }
1324
+ }
1325
+
1326
+ let canonical = c. canonical ( ) ;
1327
+ if canonical != * c {
1328
+ println ! ( ) ;
1329
+ print_cursor ( depth, String :: from ( prefix) + "canonical." , & canonical) ;
1330
+ }
1331
+
1332
+ if let Some ( specialized) = c. specialized ( ) {
1333
+ if specialized != * c {
1334
+ println ! ( ) ;
1335
+ print_cursor ( depth, String :: from ( prefix) + "specialized." , & specialized) ;
1336
+ }
1279
1337
}
1280
- println ! ( "{}" , s) ;
1281
1338
}
1282
1339
1283
- print_indent ( depth,
1284
- & format ! ( "(kind: {}, spelling: {}, type: {}" ,
1285
- kind_to_str( c. kind( ) ) ,
1286
- c. spelling( ) ,
1287
- type_to_str( c. cur_type( ) . kind( ) ) ) ) ;
1340
+ fn print_type < S : AsRef < str > > ( depth : isize , prefix : S , ty : & Type ) {
1341
+ let prefix = prefix. as_ref ( ) ;
1342
+
1343
+ let kind = ty. kind ( ) ;
1344
+ print_indent ( depth, format ! ( " {}kind = {}" , prefix, type_to_str( kind) ) ) ;
1345
+ if kind == CXType_Invalid {
1346
+ return ;
1347
+ }
1348
+
1349
+ print_indent ( depth, format ! ( " {}spelling = \" {}\" " , prefix, ty. spelling( ) ) ) ;
1350
+ let num_template_args = unsafe {
1351
+ clang_Type_getNumTemplateArguments ( ty. x )
1352
+ } ;
1353
+ if num_template_args >= 0 {
1354
+ print_indent ( depth, format ! ( " {}number-of-template-args = {}" ,
1355
+ prefix,
1356
+ num_template_args) ) ;
1357
+ }
1358
+ if let Some ( num) = ty. num_elements ( ) {
1359
+ print_indent ( depth, format ! ( " {}number-of-elements = {}" , prefix, num) ) ;
1360
+ }
1361
+ print_indent ( depth, format ! ( " {}is-variadic? {}" , prefix, ty. is_variadic( ) ) ) ;
1362
+
1363
+ let canonical = ty. canonical_type ( ) ;
1364
+ if canonical != * ty {
1365
+ println ! ( ) ;
1366
+ print_type ( depth, String :: from ( prefix) + "canonical." , & canonical) ;
1367
+ }
1368
+
1369
+ if let Some ( pointee) = ty. pointee_type ( ) {
1370
+ if pointee != * ty {
1371
+ println ! ( ) ;
1372
+ print_type ( depth, String :: from ( prefix) + "pointee." , & pointee) ;
1373
+ }
1374
+ }
1375
+
1376
+ if let Some ( elem) = ty. elem_type ( ) {
1377
+ if elem != * ty {
1378
+ println ! ( ) ;
1379
+ print_type ( depth, String :: from ( prefix) + "elements." , & elem) ;
1380
+ }
1381
+ }
1382
+
1383
+ if let Some ( ret) = ty. ret_type ( ) {
1384
+ if ret != * ty {
1385
+ println ! ( ) ;
1386
+ print_type ( depth, String :: from ( prefix) + "return." , & ret) ;
1387
+ }
1388
+ }
1389
+
1390
+ let named = ty. named ( ) ;
1391
+ if named != * ty && named. is_valid ( ) {
1392
+ println ! ( ) ;
1393
+ print_type ( depth, String :: from ( prefix) + "named." , & named) ;
1394
+ }
1395
+ }
1396
+
1397
+ print_indent ( depth, "(" ) ;
1398
+ print_cursor ( depth, "" , c) ;
1399
+
1400
+ println ! ( ) ;
1401
+ let ty = c. cur_type ( ) ;
1402
+ print_type ( depth, "type." , & ty) ;
1403
+
1404
+ let declaration = ty. declaration ( ) ;
1405
+ if declaration != * c && declaration. kind ( ) != CXCursor_NoDeclFound {
1406
+ println ! ( ) ;
1407
+ print_cursor ( depth, "type.declaration." , & declaration) ;
1408
+ }
1288
1409
1289
1410
// Recurse.
1290
- c. visit ( |s| ast_dump ( & s, depth + 1 ) ) ;
1411
+ let mut found_children = false ;
1412
+ c. visit ( |s| {
1413
+ if !found_children {
1414
+ println ! ( ) ;
1415
+ found_children = true ;
1416
+ }
1417
+ ast_dump ( & s, depth + 1 )
1418
+ } ) ;
1291
1419
1292
1420
print_indent ( depth, ")" ) ;
1293
1421
0 commit comments