@@ -282,6 +282,24 @@ fn strip_test_functions(krate: ast::Crate) -> ast::Crate {
282
282
} )
283
283
}
284
284
285
+ /// Craft a span that will be ignored by the stability lint's
286
+ /// call to codemap's is_internal check.
287
+ /// The expanded code calls some unstable functions in the test crate.
288
+ fn ignored_span ( cx : & TestCtxt , sp : Span ) -> Span {
289
+ let info = ExpnInfo {
290
+ call_site : DUMMY_SP ,
291
+ callee : NameAndSpan {
292
+ name : "test" . to_string ( ) ,
293
+ format : MacroAttribute ,
294
+ span : None
295
+ }
296
+ } ;
297
+ let expn_id = cx. sess . span_diagnostic . cm . record_expansion ( info) ;
298
+ let mut sp = sp;
299
+ sp. expn_id = expn_id;
300
+ return sp;
301
+ }
302
+
285
303
#[ derive( PartialEq ) ]
286
304
enum HasTestSignature {
287
305
Yes ,
@@ -408,6 +426,64 @@ fn mk_std(cx: &TestCtxt) -> ast::ViewItem {
408
426
}
409
427
}
410
428
429
+ fn mk_main ( cx : & mut TestCtxt ) -> P < ast:: Item > {
430
+ // Writing this out by hand with 'ignored_span':
431
+ // pub fn main() {
432
+ // #![main]
433
+ // use std::slice::AsSlice;
434
+ // test::test_main_static(::std::os::args().as_slice(), TESTS);
435
+ // }
436
+
437
+ let sp = ignored_span ( cx, DUMMY_SP ) ;
438
+ let ecx = & cx. ext_cx ;
439
+
440
+ // std::slice::AsSlice
441
+ let as_slice_path = ecx. path ( sp, vec ! [ token:: str_to_ident( "std" ) ,
442
+ token:: str_to_ident( "slice" ) ,
443
+ token:: str_to_ident( "AsSlice" ) ] ) ;
444
+ // test::test_main_static
445
+ let test_main_path = ecx. path ( sp, vec ! [ token:: str_to_ident( "test" ) ,
446
+ token:: str_to_ident( "test_main_static" ) ] ) ;
447
+ // ::std::os::args
448
+ let os_args_path = ecx. path_global ( sp, vec ! [ token:: str_to_ident( "std" ) ,
449
+ token:: str_to_ident( "os" ) ,
450
+ token:: str_to_ident( "args" ) ] ) ;
451
+ // use std::slice::AsSlice
452
+ let as_slice_path = P ( nospan ( ast:: ViewPathSimple ( token:: str_to_ident ( "AsSlice" ) ,
453
+ as_slice_path, ast:: DUMMY_NODE_ID ) ) ) ;
454
+ let use_as_slice = ecx. view_use ( sp, ast:: Inherited , as_slice_path) ;
455
+ // ::std::os::args()
456
+ let os_args_path_expr = ecx. expr_path ( os_args_path) ;
457
+ let call_os_args = ecx. expr_call ( sp, os_args_path_expr, vec ! [ ] ) ;
458
+ // ::std::os::args().as_slice()
459
+ let call_as_slice = ecx. expr_method_call ( sp, call_os_args,
460
+ token:: str_to_ident ( "as_slice" ) , vec ! [ ] ) ;
461
+ // test::test_main_static(...)
462
+ let test_main_path_expr = ecx. expr_path ( test_main_path) ;
463
+ let tests_ident_expr = ecx. expr_ident ( sp, token:: str_to_ident ( "TESTS" ) ) ;
464
+ let call_test_main = ecx. expr_call ( sp, test_main_path_expr,
465
+ vec ! [ call_as_slice, tests_ident_expr] ) ;
466
+ let call_test_main = ecx. stmt_expr ( call_test_main) ;
467
+ // #![main]
468
+ let main_meta = ecx. meta_word ( sp, token:: intern_and_get_ident ( "main" ) ) ;
469
+ let main_attr = ecx. attribute ( sp, main_meta) ;
470
+ // pub fn main() { ... }
471
+ let main_ret_ty = ecx. ty ( sp, ast:: TyTup ( vec ! [ ] ) ) ;
472
+ let main_body = ecx. block_all ( sp, vec ! [ use_as_slice] , vec ! [ call_test_main] , None ) ;
473
+ let main = ast:: ItemFn ( ecx. fn_decl ( vec ! [ ] , main_ret_ty) ,
474
+ ast:: Unsafety :: Normal , :: abi:: Rust , empty_generics ( ) , main_body) ;
475
+ let main = P ( ast:: Item {
476
+ ident : token:: str_to_ident ( "main" ) ,
477
+ attrs : vec ! [ main_attr] ,
478
+ id : ast:: DUMMY_NODE_ID ,
479
+ node : main,
480
+ vis : ast:: Public ,
481
+ span : sp
482
+ } ) ;
483
+
484
+ return main;
485
+ }
486
+
411
487
fn mk_test_module ( cx : & mut TestCtxt ) -> ( P < ast:: Item > , Option < ast:: ViewItem > ) {
412
488
// Link to test crate
413
489
let view_items = vec ! ( mk_std( cx) ) ;
@@ -417,13 +493,7 @@ fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<ast::ViewItem>) {
417
493
418
494
// The synthesized main function which will call the console test runner
419
495
// with our list of tests
420
- let mainfn = ( quote_item ! ( & mut cx. ext_cx,
421
- pub fn main( ) {
422
- #![ main]
423
- use std:: slice:: AsSlice ;
424
- test:: test_main_static( :: std:: os:: args( ) . as_slice( ) , TESTS ) ;
425
- }
426
- ) ) . unwrap ( ) ;
496
+ let mainfn = mk_main ( cx) ;
427
497
428
498
let testmod = ast:: Mod {
429
499
inner : DUMMY_SP ,
@@ -433,19 +503,13 @@ fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<ast::ViewItem>) {
433
503
let item_ = ast:: ItemMod ( testmod) ;
434
504
435
505
let mod_ident = token:: gensym_ident ( "__test" ) ;
436
- let allow_unstable = {
437
- let unstable = P ( nospan ( ast:: MetaWord ( InternedString :: new ( "unstable" ) ) ) ) ;
438
- let allow = P ( nospan ( ast:: MetaList ( InternedString :: new ( "allow" ) ,
439
- vec ! [ unstable] ) ) ) ;
440
- attr:: mk_attr_inner ( attr:: mk_attr_id ( ) , allow)
441
- } ;
442
506
let item = ast:: Item {
443
507
ident : mod_ident,
444
508
id : ast:: DUMMY_NODE_ID ,
445
509
node : item_,
446
510
vis : ast:: Public ,
447
511
span : DUMMY_SP ,
448
- attrs : vec ! [ allow_unstable ] ,
512
+ attrs : vec ! [ ] ,
449
513
} ;
450
514
let reexport = cx. reexport_test_harness_main . as_ref ( ) . map ( |s| {
451
515
// building `use <ident> = __test::main`
@@ -538,7 +602,7 @@ fn mk_test_desc_and_fn_rec(cx: &TestCtxt, test: &Test) -> P<ast::Expr> {
538
602
// __test_reexports, causing it to be reinterned, losing the
539
603
// gensym information.
540
604
541
- let span = test. span ;
605
+ let span = ignored_span ( cx , test. span ) ;
542
606
let path = test. path . clone ( ) ;
543
607
let ecx = & cx. ext_cx ;
544
608
let self_id = ecx. ident_of ( "self" ) ;
0 commit comments