@@ -6,7 +6,8 @@ import lib::llvm::False;
6
6
import lib:: llvm:: llvm;
7
7
import lib:: llvm:: mk_object_file;
8
8
import lib:: llvm:: mk_section_iter;
9
- import middle:: fold;
9
+ import middle:: resolve;
10
+ import middle:: walk;
10
11
import middle:: metadata;
11
12
import middle:: trans;
12
13
import middle:: ty;
@@ -28,13 +29,6 @@ import std::option::some;
28
29
import std:: os;
29
30
import std:: map:: hashmap;
30
31
31
- // TODO: map to a real type here.
32
- type env = @rec (
33
- session:: session sess,
34
- @hashmap[ str, int] crate_cache ,
35
- vec[ str] library_search_paths ,
36
- mutable int next_crate_num
37
- ) ;
38
32
39
33
// Type decoding
40
34
@@ -453,38 +447,49 @@ fn load_crate(session::session sess,
453
447
fail;
454
448
}
455
449
456
- fn fold_view_item_use( & env e, & span sp, & ast:: ident ident,
457
- & vec[ @ast:: meta_item] meta_items,
458
- & ast:: def_id id, & option:: t[ int] cnum_opt)
459
- -> @ast:: view_item {
460
- auto cnum;
461
- if ( !e. crate_cache. contains_key( ident) ) {
462
- cnum = e. next_crate_num;
463
- load_crate( e. sess, cnum, ident, e. library_search_paths) ;
464
- e. crate_cache. insert( ident, e. next_crate_num) ;
465
- e. next_crate_num += 1 ;
466
- } else {
467
- cnum = e. crate_cache. get( ident) ;
468
- }
450
+ type env = @rec(
451
+ session:: session sess,
452
+ resolve:: crate_map crate_map,
453
+ @hashmap[ str, int] crate_cache,
454
+ vec[ str] library_search_paths,
455
+ mutable int next_crate_num
456
+ ) ;
469
457
470
- auto viu = ast:: view_item_use( ident, meta_items, id, some[ int] ( cnum) ) ;
471
- ret @fold:: respan[ ast:: view_item_] ( sp, viu) ;
458
+ fn visit_view_item( env e, & @ast:: view_item i) {
459
+ alt ( i. node) {
460
+ case ( ast:: view_item_use( ?ident, ?meta_items, ?id, ?ann) ) {
461
+ auto cnum;
462
+ if ( !e. crate_cache. contains_key( ident) ) {
463
+ cnum = e. next_crate_num;
464
+ load_crate( e. sess, cnum, ident,
465
+ e. library_search_paths) ;
466
+ e. crate_cache. insert( ident, e. next_crate_num) ;
467
+ e. next_crate_num += 1 ;
468
+ } else {
469
+ cnum = e. crate_cache. get( ident) ;
470
+ }
471
+ e. crate_map. insert( ann. id, cnum) ;
472
+ }
473
+ case ( _) { }
474
+ }
472
475
}
473
476
477
+
474
478
// Reads external crates referenced by "use" directives.
475
479
fn read_crates( session:: session sess,
476
- @ast:: crate crate) -> @ast:: crate {
480
+ resolve:: crate_map crate_map,
481
+ & ast:: crate crate) {
477
482
auto e = @rec(
478
483
sess=sess,
484
+ crate_map=crate_map,
479
485
crate_cache=@common:: new_str_hash[ int] ( ) ,
480
486
library_search_paths=sess. get_opts( ) . library_search_paths,
481
487
mutable next_crate_num=1
482
488
) ;
483
489
484
- auto f = fold_view_item_use;
485
- auto fld = @rec( fold_view_item_use=f
486
- with * fold:: new_identity_fold[ env] ( ) ) ;
487
- ret fold:: fold_crate[ env] ( e, fld, crate ) ;
490
+ auto v = rec( visit_view_item_pre=bind visit_view_item( e, _)
491
+ with walk:: default_visitor( ) ) ;
492
+ walk:: walk_crate( v, crate ) ;
488
493
}
489
494
490
495
0 commit comments