@@ -378,7 +378,7 @@ pub fn make_test(s: &str,
378
378
dont_insert_main : bool ,
379
379
opts : & TestOptions )
380
380
-> ( String , usize ) {
381
- let ( crate_attrs, everything_else) = partition_source ( s) ;
381
+ let ( crate_attrs, everything_else, crates ) = partition_source ( s) ;
382
382
let everything_else = everything_else. trim ( ) ;
383
383
let mut line_offset = 0 ;
384
384
let mut prog = String :: new ( ) ;
@@ -409,38 +409,47 @@ pub fn make_test(s: &str,
409
409
use crate :: syntax_pos:: FileName ;
410
410
411
411
let filename = FileName :: Anon ;
412
- let source = s . to_owned ( ) ;
412
+ let source = crates + & everything_else ;
413
413
let sess = ParseSess :: new ( FilePathMapping :: empty ( ) ) ;
414
414
415
415
let mut parser = parse:: new_parser_from_source_str ( & sess, filename, source) ;
416
416
417
417
let mut found_main = false ;
418
418
let mut found_extern_crate = cratename. is_none ( ) ;
419
419
420
- while let Ok ( Some ( item) ) = parser. parse_item ( ) {
421
- if !found_main {
422
- if let ast:: ItemKind :: Fn ( ..) = item. node {
423
- if item. ident . as_str ( ) == "main" {
424
- found_main = true ;
420
+ loop {
421
+ match parser. parse_item ( ) {
422
+ Ok ( Some ( item) ) => {
423
+ if !found_main {
424
+ if let ast:: ItemKind :: Fn ( ..) = item. node {
425
+ if item. ident . as_str ( ) == "main" {
426
+ found_main = true ;
427
+ }
428
+ }
425
429
}
426
- }
427
- }
428
430
429
- if !found_extern_crate {
430
- if let ast:: ItemKind :: ExternCrate ( original) = item. node {
431
- // This code will never be reached if `cratename` is none because
432
- // `found_extern_crate` is initialized to `true` if it is none.
433
- let cratename = cratename. unwrap ( ) ;
431
+ if !found_extern_crate {
432
+ if let ast:: ItemKind :: ExternCrate ( original) = item. node {
433
+ // This code will never be reached if `cratename` is none because
434
+ // `found_extern_crate` is initialized to `true` if it is none.
435
+ let cratename = cratename. unwrap ( ) ;
436
+
437
+ match original {
438
+ Some ( name) => found_extern_crate = name. as_str ( ) == cratename,
439
+ None => found_extern_crate = item. ident . as_str ( ) == cratename,
440
+ }
441
+ }
442
+ }
434
443
435
- match original {
436
- Some ( name) => found_extern_crate = name. as_str ( ) == cratename,
437
- None => found_extern_crate = item. ident . as_str ( ) == cratename,
444
+ if found_main && found_extern_crate {
445
+ break ;
438
446
}
439
447
}
440
- }
441
-
442
- if found_main && found_extern_crate {
443
- break ;
448
+ Ok ( None ) => break ,
449
+ Err ( mut e) => {
450
+ e. cancel ( ) ;
451
+ break ;
452
+ }
444
453
}
445
454
}
446
455
@@ -474,9 +483,10 @@ pub fn make_test(s: &str,
474
483
}
475
484
476
485
// FIXME(aburka): use a real parser to deal with multiline attributes
477
- fn partition_source ( s : & str ) -> ( String , String ) {
486
+ fn partition_source ( s : & str ) -> ( String , String , String ) {
478
487
let mut after_header = false ;
479
488
let mut before = String :: new ( ) ;
489
+ let mut crates = String :: new ( ) ;
480
490
let mut after = String :: new ( ) ;
481
491
482
492
for line in s. lines ( ) {
@@ -490,12 +500,16 @@ fn partition_source(s: &str) -> (String, String) {
490
500
after. push_str ( line) ;
491
501
after. push_str ( "\n " ) ;
492
502
} else {
503
+ if trimline. starts_with ( "#[macro_use] extern crate" )
504
+ || trimline. starts_with ( "extern crate" ) {
505
+ crates. push_str ( line) ;
506
+ }
493
507
before. push_str ( line) ;
494
508
before. push_str ( "\n " ) ;
495
509
}
496
510
}
497
511
498
- ( before, after)
512
+ ( before, after, crates )
499
513
}
500
514
501
515
pub trait Tester {
0 commit comments