Skip to content

Commit 6fcdb36

Browse files
committed
Make use of hygiene in AST passes
1 parent 4082cd9 commit 6fcdb36

File tree

15 files changed

+298
-257
lines changed

15 files changed

+298
-257
lines changed

src/librustc_interface/passes.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ pub fn register_plugins<'a>(
233233
syntax::attr::inject(krate, &sess.parse_sess, &sess.opts.debugging_opts.crate_attr)
234234
});
235235

236-
let (mut krate, features) = syntax::config::features(
236+
let (krate, features) = syntax::config::features(
237237
krate,
238238
&sess.parse_sess,
239239
sess.edition(),
@@ -268,16 +268,6 @@ pub fn register_plugins<'a>(
268268
middle::recursion_limit::update_limits(sess, &krate);
269269
});
270270

271-
krate = time(sess, "crate injection", || {
272-
let alt_std_name = sess.opts.alt_std_name.as_ref().map(|s| &**s);
273-
let (krate, name) =
274-
syntax_ext::standard_library_imports::inject(krate, alt_std_name, sess.edition());
275-
if let Some(name) = name {
276-
sess.parse_sess.injected_crate_name.set(name);
277-
}
278-
krate
279-
});
280-
281271
let registrars = time(sess, "plugin loading", || {
282272
plugin::load::load_plugins(
283273
sess,
@@ -370,6 +360,21 @@ fn configure_and_expand_inner<'a>(
370360
&resolver_arenas,
371361
);
372362
syntax_ext::register_builtin_macros(&mut resolver, sess.edition());
363+
364+
krate = time(sess, "crate injection", || {
365+
let alt_std_name = sess.opts.alt_std_name.as_ref().map(|s| Symbol::intern(s));
366+
let (krate, name) = syntax_ext::standard_library_imports::inject(
367+
krate,
368+
&mut resolver,
369+
alt_std_name,
370+
sess.edition(),
371+
);
372+
if let Some(name) = name {
373+
sess.parse_sess.injected_crate_name.set(name);
374+
}
375+
krate
376+
});
377+
373378
syntax_ext::plugin_macro_defs::inject(
374379
&mut krate, &mut resolver, plugin_info.syntax_exts, sess.edition()
375380
);

src/librustc_resolve/macros.rs

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,6 @@ impl<'a> base::Resolver for Resolver<'a> {
9797
self.session.next_node_id()
9898
}
9999

100-
fn get_module_scope(&mut self, id: NodeId) -> ExpnId {
101-
let expn_id = ExpnId::fresh(Some(ExpnData::default(
102-
ExpnKind::Macro(MacroKind::Attr, sym::test_case), DUMMY_SP, self.session.edition()
103-
)));
104-
let module = self.module_map[&self.definitions.local_def_id(id)];
105-
self.invocation_parent_scopes.insert(expn_id, ParentScope::module(module));
106-
self.definitions.set_invocation_parent(expn_id, module.def_id().unwrap().index);
107-
expn_id
108-
}
109-
110100
fn resolve_dollar_crates(&mut self) {
111101
hygiene::update_dollar_crate_names(|ctxt| {
112102
let ident = Ident::new(kw::DollarCrate, DUMMY_SP.with_ctxt(ctxt));

src/libsyntax/ext/base.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -653,8 +653,6 @@ bitflags::bitflags! {
653653
pub trait Resolver {
654654
fn next_node_id(&mut self) -> NodeId;
655655

656-
fn get_module_scope(&mut self, id: NodeId) -> ExpnId;
657-
658656
fn resolve_dollar_crates(&mut self);
659657
fn visit_ast_fragment_with_placeholders(&mut self, expn_id: ExpnId, fragment: &AstFragment,
660658
extra_placeholders: &[NodeId]);

src/libsyntax_ext/plugin_macro_defs.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use syntax::source_map::respan;
1111
use syntax::symbol::sym;
1212
use syntax::tokenstream::*;
1313
use syntax_pos::{Span, DUMMY_SP};
14-
use syntax_pos::hygiene::{ExpnData, ExpnKind, MacroKind};
14+
use syntax_pos::hygiene::{ExpnData, ExpnKind, AstPass};
1515

1616
use std::mem;
1717

@@ -44,7 +44,7 @@ pub fn inject(
4444
if !named_exts.is_empty() {
4545
let mut extra_items = Vec::new();
4646
let span = DUMMY_SP.fresh_expansion(ExpnData::allow_unstable(
47-
ExpnKind::Macro(MacroKind::Attr, sym::plugin), DUMMY_SP, edition,
47+
ExpnKind::AstPass(AstPass::PluginMacroDefs), DUMMY_SP, edition,
4848
[sym::rustc_attrs][..].into(),
4949
));
5050
for (name, ext) in named_exts {

src/libsyntax_ext/proc_macro_harness.rs

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ use std::mem;
33
use smallvec::smallvec;
44
use syntax::ast::{self, Ident};
55
use syntax::attr;
6-
use syntax::source_map::{ExpnData, ExpnKind, respan};
7-
use syntax::ext::base::{ExtCtxt, MacroKind};
6+
use syntax::ext::base::ExtCtxt;
87
use syntax::ext::expand::{AstFragment, ExpansionConfig};
98
use syntax::ext::proc_macro::is_proc_macro_attr;
109
use syntax::parse::ParseSess;
1110
use syntax::ptr::P;
1211
use syntax::symbol::{kw, sym};
1312
use syntax::visit::{self, Visitor};
1413
use syntax_pos::{Span, DUMMY_SP};
14+
use syntax_pos::hygiene::AstPass;
1515

1616
struct ProcMacroDerive {
1717
trait_name: ast::Name,
@@ -308,8 +308,7 @@ impl<'a> Visitor<'a> for CollectProcMacros<'a> {
308308

309309
// Creates a new module which looks like:
310310
//
311-
// #[doc(hidden)]
312-
// mod $gensym {
311+
// const _: () = {
313312
// extern crate proc_macro;
314313
//
315314
// use proc_macro::bridge::client::ProcMacro;
@@ -327,32 +326,29 @@ fn mk_decls(
327326
custom_attrs: &[ProcMacroDef],
328327
custom_macros: &[ProcMacroDef],
329328
) -> P<ast::Item> {
330-
let span = DUMMY_SP.fresh_expansion(ExpnData::allow_unstable(
331-
ExpnKind::Macro(MacroKind::Attr, sym::proc_macro), DUMMY_SP, cx.parse_sess.edition,
332-
[sym::rustc_attrs, sym::proc_macro_internals][..].into(),
333-
));
334-
335-
let hidden = cx.meta_list_item_word(span, sym::hidden);
336-
let doc = cx.meta_list(span, sym::doc, vec![hidden]);
337-
let doc_hidden = cx.attribute(doc);
338-
339-
let proc_macro = Ident::with_dummy_span(sym::proc_macro);
329+
let span = cx.resolver.span_for_ast_pass(
330+
DUMMY_SP,
331+
AstPass::ProcMacroHarness,
332+
&[sym::rustc_attrs, sym::proc_macro_internals],
333+
None,
334+
);
335+
336+
let proc_macro = Ident::new(sym::proc_macro, span);
340337
let krate = cx.item(span,
341338
proc_macro,
342339
Vec::new(),
343340
ast::ItemKind::ExternCrate(None));
344341

345-
let bridge = Ident::from_str("bridge");
346-
let client = Ident::from_str("client");
347-
let proc_macro_ty = Ident::from_str("ProcMacro");
348-
let custom_derive = Ident::from_str("custom_derive");
349-
let attr = Ident::from_str("attr");
350-
let bang = Ident::from_str("bang");
351-
let crate_kw = Ident::with_dummy_span(kw::Crate);
342+
let bridge = Ident::from_str_and_span("bridge", span);
343+
let client = Ident::from_str_and_span("client", span);
344+
let proc_macro_ty = Ident::from_str_and_span("ProcMacro", span);
345+
let custom_derive = Ident::from_str_and_span("custom_derive", span);
346+
let attr = Ident::from_str_and_span("attr", span);
347+
let bang = Ident::from_str_and_span("bang", span);
352348

353349
let decls = {
354350
let local_path = |sp: Span, name| {
355-
cx.expr_path(cx.path(sp.with_ctxt(span.ctxt()), vec![crate_kw, name]))
351+
cx.expr_path(cx.path(sp.with_ctxt(span.ctxt()), vec![name]))
356352
};
357353
let proc_macro_ty_method_path = |method| cx.expr_path(cx.path(span, vec![
358354
proc_macro, bridge, client, proc_macro_ty, method,
@@ -381,7 +377,7 @@ fn mk_decls(
381377

382378
let decls_static = cx.item_static(
383379
span,
384-
Ident::from_str("_DECLS"),
380+
Ident::from_str_and_span("_DECLS", span),
385381
cx.ty_rptr(span,
386382
cx.ty(span, ast::TyKind::Slice(
387383
cx.ty_path(cx.path(span,
@@ -392,22 +388,44 @@ fn mk_decls(
392388
).map(|mut i| {
393389
let attr = cx.meta_word(span, sym::rustc_proc_macro_decls);
394390
i.attrs.push(cx.attribute(attr));
395-
i.vis = respan(span, ast::VisibilityKind::Public);
396391
i
397392
});
398393

399-
let module = cx.item_mod(
400-
span,
394+
let block = P(ast::Expr {
395+
id: ast::DUMMY_NODE_ID,
396+
attrs: syntax::ThinVec::new(),
397+
node: ast::ExprKind::Block(P(ast::Block {
398+
id: ast::DUMMY_NODE_ID,
399+
rules: ast::BlockCheckMode::Default,
400+
stmts: vec![
401+
ast::Stmt {
402+
id: ast::DUMMY_NODE_ID,
403+
node: ast::StmtKind::Item(krate),
404+
span,
405+
},
406+
ast::Stmt {
407+
id: ast::DUMMY_NODE_ID,
408+
node: ast::StmtKind::Item(decls_static),
409+
span,
410+
}
411+
],
412+
span,
413+
}), None),
401414
span,
402-
ast::Ident::from_str("decls").gensym(),
403-
vec![doc_hidden],
404-
vec![krate, decls_static],
405-
).map(|mut i| {
406-
i.vis = respan(span, ast::VisibilityKind::Public);
407-
i
408415
});
409416

417+
let anon_constant = cx.item_const(
418+
span,
419+
ast::Ident::new(kw::Underscore, span),
420+
P(ast::Ty {
421+
id: ast::DUMMY_NODE_ID,
422+
node: ast::TyKind::Tup(Vec::new()),
423+
span,
424+
}),
425+
block,
426+
);
427+
410428
// Integrate the new module into existing module structures.
411-
let module = AstFragment::Items(smallvec![module]);
412-
cx.monotonic_expander().fully_expand_fragment(module).make_items().pop().unwrap()
429+
let items = AstFragment::Items(smallvec![anon_constant]);
430+
cx.monotonic_expander().fully_expand_fragment(items).make_items().pop().unwrap()
413431
}

0 commit comments

Comments
 (0)