@@ -370,6 +370,157 @@ fn dtor_dec() -> fn_decl {
370
370
output: nil_t, purity: impure_fn, cf: return_val, constraints: [ ] }
371
371
}
372
372
373
+ // ______________________________________________________________________
374
+ // Enumerating the IDs which appear in an AST
375
+
376
+ #[ auto_serialize]
377
+ type id_range = { min: node_id, max: node_id} ;
378
+
379
+ fn empty( range: id_range) -> bool {
380
+ range. min >= range. max
381
+ }
382
+
383
+ fn id_visitor( vfn: fn @( node_id) ) -> visit:: vt<( ) > {
384
+ visit:: mk_simple_visitor( @{
385
+ visit_mod: fn @( _m: _mod, _sp: span, id: node_id) {
386
+ vfn( id)
387
+ } ,
388
+
389
+ visit_view_item: fn @( vi: @view_item) {
390
+ alt vi. node {
391
+ view_item_use( _, _, id) { vfn( id) }
392
+ view_item_import( vps) | view_item_export( vps) {
393
+ vec:: iter( vps) { |vp|
394
+ alt vp. node {
395
+ view_path_simple( _, _, id) { vfn( id) }
396
+ view_path_glob( _, id) { vfn( id) }
397
+ view_path_list( _, _, id) { vfn( id) }
398
+ }
399
+ }
400
+ }
401
+ }
402
+ } ,
403
+
404
+ visit_native_item: fn @( ni: @native_item) {
405
+ vfn( ni. id)
406
+ } ,
407
+
408
+ visit_item: fn @( i: @item) {
409
+ vfn( i. id) ;
410
+ alt i. node {
411
+ item_res( _, _, _, d_id, c_id, _) { vfn( d_id) ; vfn( c_id) ; }
412
+ item_enum( vs, _, _) { for vs. each { |v| vfn( v. node. id) ; } }
413
+ _ { }
414
+ }
415
+ } ,
416
+
417
+ visit_local: fn @( l: @local) {
418
+ vfn( l. node. id) ;
419
+ } ,
420
+
421
+ visit_block: fn @( b: blk) {
422
+ vfn( b. node. id) ;
423
+ } ,
424
+
425
+ visit_stmt: fn @( s: @stmt) {
426
+ vfn( ast_util:: stmt_id( * s) ) ;
427
+ } ,
428
+
429
+ visit_arm: fn @( _a: arm) { } ,
430
+
431
+ visit_pat: fn @( p: @pat) {
432
+ vfn( p. id)
433
+ } ,
434
+
435
+ visit_decl: fn @( _d: @decl) {
436
+ } ,
437
+
438
+ visit_expr: fn @( e: @expr) {
439
+ vfn( e. id) ;
440
+ alt e. node {
441
+ expr_unary( _, _) | expr_binary( _, _, _) {
442
+ vfn( ast_util:: op_expr_callee_id( e) ) ;
443
+ }
444
+ _ { /* fallthrough */ }
445
+ }
446
+ } ,
447
+
448
+ visit_ty: fn @( t: @ty) {
449
+ alt t. node {
450
+ ty_path( _, id) {
451
+ vfn( id)
452
+ }
453
+ _ { /* fall through */ }
454
+ }
455
+ } ,
456
+
457
+ visit_ty_params: fn @( ps: [ ty_param] ) {
458
+ vec:: iter( ps) { |p| vfn( p. id) }
459
+ } ,
460
+
461
+ visit_constr: fn @( _p: @path, _sp: span, id: node_id) {
462
+ vfn( id) ;
463
+ } ,
464
+
465
+ visit_fn: fn @( fk: visit:: fn_kind, d: fn_decl,
466
+ _b: blk, _sp: span, id: node_id) {
467
+ vfn( id) ;
468
+
469
+ alt fk {
470
+ visit:: fk_ctor( _, tps, self_id, parent_id) |
471
+ visit:: fk_dtor( tps, self_id, parent_id) {
472
+ vec:: iter( tps) { |tp| vfn( tp. id) }
473
+ vfn( id) ;
474
+ vfn( self_id) ;
475
+ vfn( parent_id. node) ;
476
+ }
477
+ visit:: fk_item_fn( _, tps) |
478
+ visit:: fk_res( _, tps, _) {
479
+ vec:: iter( tps) { |tp| vfn( tp. id) }
480
+ }
481
+ visit:: fk_method( _, tps, m) {
482
+ vfn( m. self_id) ;
483
+ vec:: iter( tps) { |tp| vfn( tp. id) }
484
+ }
485
+ visit:: fk_anon( * ) | visit:: fk_fn_block( * ) {
486
+ }
487
+ }
488
+
489
+ vec:: iter( d. inputs) { |arg|
490
+ vfn( arg. id)
491
+ }
492
+ } ,
493
+
494
+ visit_class_item: fn @( c: @class_member) {
495
+ alt c. node {
496
+ instance_var( _, _, _, id, _) {
497
+ vfn( id)
498
+ }
499
+ class_method( _) {
500
+ }
501
+ }
502
+ }
503
+ } )
504
+ }
505
+
506
+ fn visit_ids_for_inlined_item( item: inlined_item, vfn: fn @( node_id) ) {
507
+ item. accept( ( ) , id_visitor( vfn) ) ;
508
+ }
509
+
510
+ fn compute_id_range( visit_ids_fn: fn ( fn @( node_id) ) ) -> id_range {
511
+ let min = @mut int:: max_value;
512
+ let max = @mut int:: min_value;
513
+ visit_ids_fn { |id|
514
+ * min = int:: min( * min, id) ;
515
+ * max = int:: max( * max, id + 1 ) ;
516
+ }
517
+ ret { min: * min, max: * max} ;
518
+ }
519
+
520
+ fn compute_id_range_for_inlined_item( item: inlined_item) -> id_range {
521
+ compute_id_range { |f| visit_ids_for_inlined_item( item, f) }
522
+ }
523
+
373
524
// Local Variables:
374
525
// mode: rust
375
526
// fill-column: 78;
0 commit comments