@@ -35,6 +35,7 @@ use std::io::fs;
3535use std:: os;
3636use arena:: TypedArena ;
3737use syntax:: ast;
38+ use syntax:: ast_map;
3839use syntax:: attr;
3940use syntax:: attr:: { AttrMetaMethods } ;
4041use syntax:: diagnostics;
@@ -65,7 +66,7 @@ pub fn compile_input(sess: Session,
6566 // large chunks of memory alive and we want to free them as soon as
6667 // possible to keep the peak memory usage low
6768 let ( outputs, trans, sess) = {
68- let ( outputs, expanded_crate, ast_map , id) = {
69+ let ( outputs, expanded_crate, id) = {
6970 let krate = phase_1_parse_input ( & sess, cfg, input) ;
7071 if stop_after_phase_1 ( & sess) { return ; }
7172 let outputs = build_output_filenames ( input,
@@ -75,25 +76,28 @@ pub fn compile_input(sess: Session,
7576 & sess) ;
7677 let id = link:: find_crate_name ( Some ( & sess) , krate. attrs . as_slice ( ) ,
7778 input) ;
78- let ( expanded_crate, ast_map )
79+ let expanded_crate
7980 = match phase_2_configure_and_expand ( & sess, krate, id. as_slice ( ) ,
8081 addl_plugins) {
8182 None => return ,
82- Some ( p ) => p ,
83+ Some ( k ) => k
8384 } ;
8485
85- ( outputs, expanded_crate, ast_map , id)
86+ ( outputs, expanded_crate, id)
8687 } ;
88+
89+ let mut forest = ast_map:: Forest :: new ( expanded_crate) ;
90+ let ast_map = assign_node_ids_and_map ( & sess, & mut forest) ;
91+
8792 write_out_deps ( & sess, input, & outputs, id. as_slice ( ) ) ;
8893
8994 if stop_after_phase_2 ( & sess) { return ; }
9095
9196 let type_arena = TypedArena :: new ( ) ;
92- let analysis = phase_3_run_analysis_passes ( sess, & expanded_crate,
93- ast_map, & type_arena, id) ;
94- phase_save_analysis ( & analysis. ty_cx . sess , & expanded_crate, & analysis, outdir) ;
97+ let analysis = phase_3_run_analysis_passes ( sess, ast_map, & type_arena, id) ;
98+ phase_save_analysis ( & analysis. ty_cx . sess , analysis. ty_cx . map . krate ( ) , & analysis, outdir) ;
9599 if stop_after_phase_3 ( & analysis. ty_cx . sess ) { return ; }
96- let ( tcx, trans) = phase_4_translate_to_llvm ( expanded_crate , analysis) ;
100+ let ( tcx, trans) = phase_4_translate_to_llvm ( analysis) ;
97101
98102 // Discard interned strings as they are no longer required.
99103 token:: get_ident_interner ( ) . clear ( ) ;
@@ -182,7 +186,7 @@ pub fn phase_2_configure_and_expand(sess: &Session,
182186 mut krate : ast:: Crate ,
183187 crate_name : & str ,
184188 addl_plugins : Option < Plugins > )
185- -> Option < ( ast:: Crate , syntax :: ast_map :: Map ) > {
189+ -> Option < ast:: Crate > {
186190 let time_passes = sess. time_passes ( ) ;
187191
188192 * sess. crate_types . borrow_mut ( ) =
@@ -294,20 +298,37 @@ pub fn phase_2_configure_and_expand(sess: &Session,
294298 krate = time ( time_passes, "prelude injection" , krate, |krate|
295299 front:: std_inject:: maybe_inject_prelude ( sess, krate) ) ;
296300
297- let ( krate, map) = time ( time_passes, "assigning node ids and indexing ast" , krate, |krate|
298- front:: assign_node_ids_and_map:: assign_node_ids_and_map ( sess, krate) ) ;
301+ time ( time_passes, "checking that all macro invocations are gone" , & krate, |krate|
302+ syntax:: ext:: expand:: check_for_macros ( & sess. parse_sess , krate) ) ;
303+
304+ Some ( krate)
305+ }
306+
307+ pub fn assign_node_ids_and_map < ' ast > ( sess : & Session ,
308+ forest : & ' ast mut ast_map:: Forest )
309+ -> ast_map:: Map < ' ast > {
310+ struct NodeIdAssigner < ' a > {
311+ sess : & ' a Session
312+ }
313+
314+ impl < ' a > ast_map:: FoldOps for NodeIdAssigner < ' a > {
315+ fn new_id ( & self , old_id : ast:: NodeId ) -> ast:: NodeId {
316+ assert_eq ! ( old_id, ast:: DUMMY_NODE_ID ) ;
317+ self . sess . next_node_id ( )
318+ }
319+ }
320+
321+ let map = time ( sess. time_passes ( ) , "assigning node ids and indexing ast" , forest, |forest|
322+ ast_map:: map_crate ( forest, NodeIdAssigner { sess : sess } ) ) ;
299323
300324 if sess. opts . debugging_opts & config:: AST_JSON != 0 {
301325 let mut stdout = io:: BufferedWriter :: new ( io:: stdout ( ) ) ;
302326 let mut json = json:: PrettyEncoder :: new ( & mut stdout) ;
303327 // unwrapping so IoError isn't ignored
304- krate. encode ( & mut json) . unwrap ( ) ;
328+ map . krate ( ) . encode ( & mut json) . unwrap ( ) ;
305329 }
306330
307- time ( time_passes, "checking that all macro invocations are gone" , & krate, |krate|
308- syntax:: ext:: expand:: check_for_macros ( & sess. parse_sess , krate) ) ;
309-
310- Some ( ( krate, map) )
331+ map
311332}
312333
313334pub struct CrateAnalysis < ' tcx > {
@@ -324,11 +345,11 @@ pub struct CrateAnalysis<'tcx> {
324345/// miscellaneous analysis passes on the crate. Return various
325346/// structures carrying the results of the analysis.
326347pub fn phase_3_run_analysis_passes < ' tcx > ( sess : Session ,
327- krate : & ast:: Crate ,
328- ast_map : syntax:: ast_map:: Map ,
348+ ast_map : ast_map:: Map < ' tcx > ,
329349 type_arena : & ' tcx TypedArena < ty:: t_box_ > ,
330350 name : String ) -> CrateAnalysis < ' tcx > {
331351 let time_passes = sess. time_passes ( ) ;
352+ let krate = ast_map. krate ( ) ;
332353
333354 time ( time_passes, "external crate/lib resolution" , ( ) , |_|
334355 creader:: read_crates ( & sess, krate) ) ;
@@ -353,7 +374,7 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
353374 |_| middle:: resolve_lifetime:: krate ( & sess, krate) ) ;
354375
355376 time ( time_passes, "looking for entry point" , ( ) ,
356- |_| middle:: entry:: find_entry_point ( & sess, krate , & ast_map) ) ;
377+ |_| middle:: entry:: find_entry_point ( & sess, & ast_map) ) ;
357378
358379 sess. plugin_registrar_fn . set (
359380 time ( time_passes, "looking for plugin registrar" , ( ) , |_|
@@ -385,43 +406,43 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
385406 stability_index) ;
386407
387408 // passes are timed inside typeck
388- typeck:: check_crate ( & ty_cx, trait_map, krate ) ;
409+ typeck:: check_crate ( & ty_cx, trait_map) ;
389410
390411 time ( time_passes, "check static items" , ( ) , |_|
391- middle:: check_static:: check_crate ( & ty_cx, krate ) ) ;
412+ middle:: check_static:: check_crate ( & ty_cx) ) ;
392413
393414 // These next two const passes can probably be merged
394415 time ( time_passes, "const marking" , ( ) , |_|
395- middle:: const_eval:: process_crate ( krate , & ty_cx) ) ;
416+ middle:: const_eval:: process_crate ( & ty_cx) ) ;
396417
397418 time ( time_passes, "const checking" , ( ) , |_|
398- middle:: check_const:: check_crate ( krate , & ty_cx) ) ;
419+ middle:: check_const:: check_crate ( & ty_cx) ) ;
399420
400421 let maps = ( external_exports, last_private_map) ;
401422 let ( exported_items, public_items) =
402423 time ( time_passes, "privacy checking" , maps, |( a, b) |
403- middle:: privacy:: check_crate ( & ty_cx, & exp_map2, a, b, krate ) ) ;
424+ middle:: privacy:: check_crate ( & ty_cx, & exp_map2, a, b) ) ;
404425
405426 time ( time_passes, "intrinsic checking" , ( ) , |_|
406- middle:: intrinsicck:: check_crate ( & ty_cx, krate ) ) ;
427+ middle:: intrinsicck:: check_crate ( & ty_cx) ) ;
407428
408429 time ( time_passes, "effect checking" , ( ) , |_|
409- middle:: effect:: check_crate ( & ty_cx, krate ) ) ;
430+ middle:: effect:: check_crate ( & ty_cx) ) ;
410431
411432 time ( time_passes, "match checking" , ( ) , |_|
412- middle:: check_match:: check_crate ( & ty_cx, krate ) ) ;
433+ middle:: check_match:: check_crate ( & ty_cx) ) ;
413434
414435 time ( time_passes, "liveness checking" , ( ) , |_|
415- middle:: liveness:: check_crate ( & ty_cx, krate ) ) ;
436+ middle:: liveness:: check_crate ( & ty_cx) ) ;
416437
417438 time ( time_passes, "borrow checking" , ( ) , |_|
418- middle:: borrowck:: check_crate ( & ty_cx, krate ) ) ;
439+ middle:: borrowck:: check_crate ( & ty_cx) ) ;
419440
420441 time ( time_passes, "rvalue checking" , ( ) , |_|
421442 middle:: check_rvalues:: check_crate ( & ty_cx, krate) ) ;
422443
423444 time ( time_passes, "kind checking" , ( ) , |_|
424- kind:: check_crate ( & ty_cx, krate ) ) ;
445+ kind:: check_crate ( & ty_cx) ) ;
425446
426447 let reachable_map =
427448 time ( time_passes, "reachability checking" , ( ) , |_|
@@ -430,12 +451,11 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
430451 time ( time_passes, "death checking" , ( ) , |_| {
431452 middle:: dead:: check_crate ( & ty_cx,
432453 & exported_items,
433- & reachable_map,
434- krate)
454+ & reachable_map)
435455 } ) ;
436456
437457 time ( time_passes, "lint checking" , ( ) , |_|
438- lint:: check_crate ( & ty_cx, krate , & exported_items) ) ;
458+ lint:: check_crate ( & ty_cx, & exported_items) ) ;
439459
440460 CrateAnalysis {
441461 exp_map2 : exp_map2,
@@ -475,16 +495,16 @@ pub struct CrateTranslation {
475495
476496/// Run the translation phase to LLVM, after which the AST and analysis can
477497/// be discarded.
478- pub fn phase_4_translate_to_llvm ( krate : ast :: Crate ,
479- analysis : CrateAnalysis ) -> ( ty:: ctxt , CrateTranslation ) {
498+ pub fn phase_4_translate_to_llvm < ' tcx > ( analysis : CrateAnalysis < ' tcx > )
499+ -> ( ty:: ctxt < ' tcx > , CrateTranslation ) {
480500 let time_passes = analysis. ty_cx . sess . time_passes ( ) ;
481501
482502 time ( time_passes, "resolving dependency formats" , ( ) , |_|
483503 dependency_format:: calculate ( & analysis. ty_cx ) ) ;
484504
485505 // Option dance to work around the lack of stack once closures.
486- time ( time_passes, "translation" , ( krate , analysis) , |( krate , analysis) |
487- trans:: base:: trans_crate ( krate , analysis) )
506+ time ( time_passes, "translation" , analysis, |analysis|
507+ trans:: base:: trans_crate ( analysis) )
488508}
489509
490510/// Run LLVM itself, producing a bitcode file, assembly file or object file
0 commit comments