Skip to content

Commit e1a2420

Browse files
committed
Clean up libsyntax/test using quasiquote.
1 parent 99a2054 commit e1a2420

File tree

1 file changed

+16
-63
lines changed

1 file changed

+16
-63
lines changed

src/libsyntax/test.rs

+16-63
Original file line numberDiff line numberDiff line change
@@ -539,26 +539,8 @@ fn path_node(ids: Vec<ast::Ident> ) -> ast::Path {
539539
fn mk_tests(cx: &TestCtxt) -> P<ast::Item> {
540540
// The vector of test_descs for this crate
541541
let test_descs = mk_test_descs(cx);
542-
543-
// FIXME #15962: should be using quote_item, but that stringifies
544-
// __test_reexports, causing it to be reinterned, losing the
545-
// gensym information.
546-
let sp = DUMMY_SP;
547-
let ecx = &cx.ext_cx;
548-
let struct_type = ecx.ty_path(ecx.path(sp, vec![ecx.ident_of("self"),
549-
ecx.ident_of("test"),
550-
ecx.ident_of("TestDescAndFn")]));
551-
let static_lt = ecx.lifetime(sp, token::special_idents::static_lifetime.name);
552-
// &'static [self::test::TestDescAndFn]
553-
let static_type = ecx.ty_rptr(sp,
554-
ecx.ty(sp, ast::TyVec(struct_type)),
555-
Some(static_lt),
556-
ast::MutImmutable);
557-
// static TESTS: $static_type = &[...];
558-
ecx.item_const(sp,
559-
ecx.ident_of("TESTS"),
560-
static_type,
561-
test_descs)
542+
quote_item!(&cx.ext_cx, const TESTS: &'static [self::test::TestDescAndFn] = $test_descs;)
543+
.unwrap()
562544
}
563545

564546
fn is_test_crate(krate: &ast::Crate) -> bool {
@@ -586,57 +568,31 @@ fn mk_test_descs(cx: &TestCtxt) -> P<ast::Expr> {
586568
}
587569

588570
fn mk_test_desc_and_fn_rec(cx: &TestCtxt, test: &Test) -> P<ast::Expr> {
589-
// FIXME #15962: should be using quote_expr, but that stringifies
590-
// __test_reexports, causing it to be reinterned, losing the
591-
// gensym information.
592-
593571
let span = ignored_span(cx, test.span);
594572
let path = test.path.clone();
595573
let ecx = &cx.ext_cx;
596-
let self_id = ecx.ident_of("self");
597-
let test_id = ecx.ident_of("test");
598-
599-
// creates self::test::$name
600-
let test_path = |name| {
601-
ecx.path(span, vec![self_id, test_id, ecx.ident_of(name)])
602-
};
603-
// creates $name: $expr
604-
let field = |name, expr| ecx.field_imm(span, ecx.ident_of(name), expr);
605-
606-
debug!("encoding {}", ast_util::path_name_i(&path[..]));
607574

608575
// path to the #[test] function: "foo::bar::baz"
609-
let path_string = ast_util::path_name_i(&path[..]);
610-
let name_expr = ecx.expr_str(span, token::intern_and_get_ident(&path_string[..]));
611-
612-
// self::test::StaticTestName($name_expr)
613-
let name_expr = ecx.expr_call(span,
614-
ecx.expr_path(test_path("StaticTestName")),
615-
vec![name_expr]);
576+
let path_string = ast_util::path_name_i(&path);
577+
debug!("encoding {}", path_string);
616578

617579
let ignore_expr = ecx.expr_bool(span, test.ignore);
618-
let should_fail_path = |name| {
619-
ecx.path(span, vec![self_id, test_id, ecx.ident_of("ShouldFail"), ecx.ident_of(name)])
620-
};
621580
let fail_expr = match test.should_fail {
622-
ShouldFail::No => ecx.expr_path(should_fail_path("No")),
581+
ShouldFail::No => quote_expr!(ecx, self::test::ShouldFail::No),
623582
ShouldFail::Yes(ref msg) => {
624-
let path = should_fail_path("Yes");
625583
let arg = match *msg {
626584
Some(ref msg) => ecx.expr_some(span, ecx.expr_str(span, msg.clone())),
627585
None => ecx.expr_none(span),
628586
};
629-
ecx.expr_call(span, ecx.expr_path(path), vec![arg])
587+
quote_expr!(ecx, self::test::ShouldFail::Yes($arg))
630588
}
631589
};
632590

633-
// self::test::TestDesc { ... }
634-
let desc_expr = ecx.expr_struct(
635-
span,
636-
test_path("TestDesc"),
637-
vec![field("name", name_expr),
638-
field("ignore", ignore_expr),
639-
field("should_fail", fail_expr)]);
591+
let desc_expr = quote_expr!(ecx, self::test::TestDesc {
592+
name: self::test::StaticTestName($path_string),
593+
ignore: $ignore_expr,
594+
should_fail: $fail_expr,
595+
});
640596

641597

642598
let mut visible_path = match cx.toplevel_reexport {
@@ -650,13 +606,10 @@ fn mk_test_desc_and_fn_rec(cx: &TestCtxt, test: &Test) -> P<ast::Expr> {
650606

651607
let fn_expr = ecx.expr_path(ecx.path_global(span, visible_path));
652608

653-
let variant_name = if test.bench { "StaticBenchFn" } else { "StaticTestFn" };
654-
// self::test::$variant_name($fn_expr)
655-
let testfn_expr = ecx.expr_call(span, ecx.expr_path(test_path(variant_name)), vec![fn_expr]);
609+
let variant_name = ecx.ident_of(if test.bench { "StaticBenchFn" } else { "StaticTestFn" });
656610

657-
// self::test::TestDescAndFn { ... }
658-
ecx.expr_struct(span,
659-
test_path("TestDescAndFn"),
660-
vec![field("desc", desc_expr),
661-
field("testfn", testfn_expr)])
611+
quote_expr!(ecx, self::test::TestDescAndFn {
612+
desc: $desc_expr,
613+
testfn: self::test::$variant_name($fn_expr),
614+
})
662615
}

0 commit comments

Comments
 (0)