Skip to content

Commit 46b98c5

Browse files
committed
---
yaml --- r: 175406 b: refs/heads/master c: 2b879a0 h: refs/heads/master v: v3
1 parent 4c23985 commit 46b98c5

File tree

2 files changed

+80
-16
lines changed

2 files changed

+80
-16
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 41278c5441f484a68a20ca12d93cab368a2a943f
2+
refs/heads/master: 2b879a08b503f3ea45e7206c6bcd47d966603598
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 777435990e0e91df6b72ce80c9b6fa485eeb5daa
55
refs/heads/try: 08f6380a9f0b866796080094f44fe25ea5636547

trunk/src/libsyntax/test.rs

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,24 @@ fn strip_test_functions(krate: ast::Crate) -> ast::Crate {
282282
})
283283
}
284284

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+
285303
#[derive(PartialEq)]
286304
enum HasTestSignature {
287305
Yes,
@@ -408,6 +426,64 @@ fn mk_std(cx: &TestCtxt) -> ast::ViewItem {
408426
}
409427
}
410428

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+
411487
fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<ast::ViewItem>) {
412488
// Link to test crate
413489
let view_items = vec!(mk_std(cx));
@@ -417,13 +493,7 @@ fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<ast::ViewItem>) {
417493

418494
// The synthesized main function which will call the console test runner
419495
// 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);
427497

428498
let testmod = ast::Mod {
429499
inner: DUMMY_SP,
@@ -433,19 +503,13 @@ fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<ast::ViewItem>) {
433503
let item_ = ast::ItemMod(testmod);
434504

435505
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-
};
442506
let item = ast::Item {
443507
ident: mod_ident,
444508
id: ast::DUMMY_NODE_ID,
445509
node: item_,
446510
vis: ast::Public,
447511
span: DUMMY_SP,
448-
attrs: vec![allow_unstable],
512+
attrs: vec![],
449513
};
450514
let reexport = cx.reexport_test_harness_main.as_ref().map(|s| {
451515
// building `use <ident> = __test::main`
@@ -538,7 +602,7 @@ fn mk_test_desc_and_fn_rec(cx: &TestCtxt, test: &Test) -> P<ast::Expr> {
538602
// __test_reexports, causing it to be reinterned, losing the
539603
// gensym information.
540604

541-
let span = test.span;
605+
let span = ignored_span(cx, test.span);
542606
let path = test.path.clone();
543607
let ecx = &cx.ext_cx;
544608
let self_id = ecx.ident_of("self");

0 commit comments

Comments
 (0)