Skip to content

Commit 78c0039

Browse files
committed
Expand generated test harnesses and macro registries.
1 parent f3c2dca commit 78c0039

File tree

3 files changed

+27
-28
lines changed

3 files changed

+27
-28
lines changed

src/librustc_driver/driver.rs

+2
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,7 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
690690

691691
krate = time(time_passes, "maybe building test harness", || {
692692
syntax::test::modify_for_testing(&sess.parse_sess,
693+
&mut resolver,
693694
sess.opts.test,
694695
krate,
695696
sess.diagnostic())
@@ -700,6 +701,7 @@ pub fn phase_2_configure_and_expand<'a, F>(sess: &Session,
700701
let is_rustc_macro_crate = crate_types.contains(&config::CrateTypeRustcMacro);
701702
let num_crate_types = crate_types.len();
702703
syntax_ext::rustc_macro_registrar::modify(&sess.parse_sess,
704+
&mut resolver,
703705
krate,
704706
is_rustc_macro_crate,
705707
num_crate_types,

src/libsyntax/test.rs

+15-15
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ use errors;
2828
use errors::snippet::{SnippetData};
2929
use config;
3030
use entry::{self, EntryPointType};
31-
use ext::base::{ExtCtxt, DummyResolver};
31+
use ext::base::{ExtCtxt, Resolver};
3232
use ext::build::AstBuilder;
3333
use ext::expand::ExpansionConfig;
3434
use fold::Folder;
@@ -70,6 +70,7 @@ struct TestCtxt<'a> {
7070
// Traverse the crate, collecting all the test functions, eliding any
7171
// existing main functions, and synthesizing a main test harness
7272
pub fn modify_for_testing(sess: &ParseSess,
73+
resolver: &mut Resolver,
7374
should_test: bool,
7475
krate: ast::Crate,
7576
span_diagnostic: &errors::Handler) -> ast::Crate {
@@ -82,7 +83,7 @@ pub fn modify_for_testing(sess: &ParseSess,
8283
"reexport_test_harness_main");
8384

8485
if should_test {
85-
generate_test_harness(sess, reexport_test_harness_main, krate, span_diagnostic)
86+
generate_test_harness(sess, resolver, reexport_test_harness_main, krate, span_diagnostic)
8687
} else {
8788
krate
8889
}
@@ -248,41 +249,39 @@ fn mk_reexport_mod(cx: &mut TestCtxt, tests: Vec<ast::Ident>,
248249
}).chain(tested_submods.into_iter().map(|(r, sym)| {
249250
let path = cx.ext_cx.path(DUMMY_SP, vec![super_, r, sym]);
250251
cx.ext_cx.item_use_simple_(DUMMY_SP, ast::Visibility::Public, r, path)
251-
}));
252+
})).collect();
252253

253254
let reexport_mod = ast::Mod {
254255
inner: DUMMY_SP,
255-
items: items.collect(),
256+
items: items,
256257
};
257258

258259
let sym = token::gensym_ident("__test_reexports");
259-
let it = P(ast::Item {
260+
let it = cx.ext_cx.expander().fold_item(P(ast::Item {
260261
ident: sym.clone(),
261262
attrs: Vec::new(),
262263
id: ast::DUMMY_NODE_ID,
263264
node: ast::ItemKind::Mod(reexport_mod),
264265
vis: ast::Visibility::Public,
265266
span: DUMMY_SP,
266-
});
267+
})).pop().unwrap();
267268

268269
(it, sym)
269270
}
270271

271272
fn generate_test_harness(sess: &ParseSess,
273+
resolver: &mut Resolver,
272274
reexport_test_harness_main: Option<InternedString>,
273275
krate: ast::Crate,
274276
sd: &errors::Handler) -> ast::Crate {
275277
// Remove the entry points
276278
let mut cleaner = EntryPointCleaner { depth: 0 };
277279
let krate = cleaner.fold_crate(krate);
278280

279-
let mut resolver = DummyResolver;
280281
let mut cx: TestCtxt = TestCtxt {
281282
sess: sess,
282283
span_diagnostic: sd,
283-
ext_cx: ExtCtxt::new(sess, vec![],
284-
ExpansionConfig::default("test".to_string()),
285-
&mut resolver),
284+
ext_cx: ExtCtxt::new(sess, vec![], ExpansionConfig::default("test".to_string()), resolver),
286285
path: Vec::new(),
287286
testfns: Vec::new(),
288287
reexport_test_harness_main: reexport_test_harness_main,
@@ -511,16 +510,17 @@ fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<P<ast::Item>>) {
511510
items: vec![import, mainfn, tests],
512511
};
513512
let item_ = ast::ItemKind::Mod(testmod);
514-
515513
let mod_ident = token::gensym_ident("__test");
516-
let item = P(ast::Item {
514+
515+
let mut expander = cx.ext_cx.expander();
516+
let item = expander.fold_item(P(ast::Item {
517517
id: ast::DUMMY_NODE_ID,
518518
ident: mod_ident,
519519
attrs: vec![],
520520
node: item_,
521521
vis: ast::Visibility::Public,
522522
span: DUMMY_SP,
523-
});
523+
})).pop().unwrap();
524524
let reexport = cx.reexport_test_harness_main.as_ref().map(|s| {
525525
// building `use <ident> = __test::main`
526526
let reexport_ident = token::str_to_ident(&s);
@@ -529,14 +529,14 @@ fn mk_test_module(cx: &mut TestCtxt) -> (P<ast::Item>, Option<P<ast::Item>>) {
529529
nospan(ast::ViewPathSimple(reexport_ident,
530530
path_node(vec![mod_ident, token::str_to_ident("main")])));
531531

532-
P(ast::Item {
532+
expander.fold_item(P(ast::Item {
533533
id: ast::DUMMY_NODE_ID,
534534
ident: keywords::Invalid.ident(),
535535
attrs: vec![],
536536
node: ast::ItemKind::Use(P(use_path)),
537537
vis: ast::Visibility::Inherited,
538538
span: DUMMY_SP
539-
})
539+
})).pop().unwrap()
540540
});
541541

542542
debug!("Synthetic test module:\n{}\n", pprust::item_to_string(&item));

src/libsyntax_ext/rustc_macro_registrar.rs

+10-13
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ use std::mem;
1313
use errors;
1414
use syntax::ast::{self, Ident, NodeId};
1515
use syntax::codemap::{ExpnInfo, NameAndSpan, MacroAttribute};
16-
use syntax::ext::base::{ExtCtxt, DummyResolver};
16+
use syntax::ext::base::ExtCtxt;
1717
use syntax::ext::build::AstBuilder;
1818
use syntax::ext::expand::ExpansionConfig;
1919
use syntax::parse::ParseSess;
2020
use syntax::parse::token::{self, InternedString};
2121
use syntax::feature_gate::Features;
22+
use syntax::fold::Folder;
2223
use syntax::ptr::P;
2324
use syntax_pos::{Span, DUMMY_SP};
2425
use syntax::visit::{self, Visitor};
@@ -39,16 +40,14 @@ struct CollectCustomDerives<'a> {
3940
}
4041

4142
pub fn modify(sess: &ParseSess,
43+
resolver: &mut ::syntax::ext::base::Resolver,
4244
mut krate: ast::Crate,
4345
is_rustc_macro_crate: bool,
4446
num_crate_types: usize,
4547
handler: &errors::Handler,
4648
features: &Features) -> ast::Crate {
47-
let mut loader = DummyResolver;
48-
let mut cx = ExtCtxt::new(sess,
49-
Vec::new(),
50-
ExpansionConfig::default("rustc_macro".to_string()),
51-
&mut loader);
49+
let ecfg = ExpansionConfig::default("rustc_macro".to_string());
50+
let mut cx = ExtCtxt::new(sess, Vec::new(), ecfg, resolver);
5251

5352
let mut collect = CollectCustomDerives {
5453
derives: Vec::new(),
@@ -268,13 +267,11 @@ fn mk_registrar(cx: &mut ExtCtxt,
268267
i.vis = ast::Visibility::Public;
269268
i
270269
});
271-
let module = cx.item_mod(span,
272-
span,
273-
ast::Ident::with_empty_ctxt(token::gensym("registrar")),
274-
Vec::new(),
275-
vec![krate, func]);
276-
module.map(|mut i| {
270+
let ident = ast::Ident::with_empty_ctxt(token::gensym("registrar"));
271+
let module = cx.item_mod(span, span, ident, Vec::new(), vec![krate, func]).map(|mut i| {
277272
i.vis = ast::Visibility::Public;
278273
i
279-
})
274+
});
275+
276+
cx.expander().fold_item(module).pop().unwrap()
280277
}

0 commit comments

Comments
 (0)