diff options
| author | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-03-22 08:39:51 +0000 |
|---|---|---|
| committer | Jeffrey Seyfried <jeffrey.seyfried@gmail.com> | 2017-05-25 05:51:50 +0000 |
| commit | 1f175fa35d4263f1d2c4c3433a495a78996305f4 (patch) | |
| tree | 5c82cc94964d2e84147ed74a74f53d25c00fc29c /src/libsyntax | |
| parent | 1cded8472ed034739ff31e314f5cf76ebe5d07c1 (diff) | |
| download | rust-1f175fa35d4263f1d2c4c3433a495a78996305f4.tar.gz rust-1f175fa35d4263f1d2c4c3433a495a78996305f4.zip | |
Hygienize `librustc_resolve`.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 11 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 42 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 9 | ||||
| -rw-r--r-- | src/libsyntax/fold.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/std_inject.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/test.rs | 2 |
6 files changed, 47 insertions, 21 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 1930f61121b..71dc81c3759 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -550,12 +550,16 @@ pub enum SyntaxExtension { /// An attribute-like procedural macro that derives a builtin trait. BuiltinDerive(BuiltinDeriveFn), + + /// A declarative macro, e.g. `macro m() {}`. + DeclMacro(Box<TTMacroExpander>, Option<Span> /* definition site span */), } impl SyntaxExtension { /// Return which kind of macro calls this syntax extension. pub fn kind(&self) -> MacroKind { match *self { + SyntaxExtension::DeclMacro(..) | SyntaxExtension::NormalTT(..) | SyntaxExtension::IdentTT(..) | SyntaxExtension::ProcMacro(..) => @@ -569,6 +573,13 @@ impl SyntaxExtension { MacroKind::Derive, } } + + pub fn is_modern(&self) -> bool { + match *self { + SyntaxExtension::DeclMacro(..) => true, + _ => false, + } + } } pub type NamedSyntaxExtension = (Name, SyntaxExtension); diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 25e0aed220a..be077b48111 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -288,7 +288,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let derives = derives.entry(invoc.expansion_data.mark).or_insert_with(Vec::new); for path in &traits { - let mark = Mark::fresh(); + let mark = Mark::fresh(self.cx.current_expansion.mark); derives.push(mark); let item = match self.cx.resolver.resolve_macro( Mark::root(), path, MacroKind::Derive, false) { @@ -455,25 +455,37 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let path = &mac.node.path; let ident = ident.unwrap_or_else(|| keywords::Invalid.ident()); + let validate_and_set_expn_info = |def_site_span, allow_internal_unstable| { + if ident.name != keywords::Invalid.name() { + return Err(format!("macro {}! expects no ident argument, given '{}'", path, ident)); + } + mark.set_expn_info(ExpnInfo { + call_site: span, + callee: NameAndSpan { + format: MacroBang(Symbol::intern(&format!("{}", path))), + span: def_site_span, + allow_internal_unstable: allow_internal_unstable, + }, + }); + Ok(()) + }; + let marked_tts = noop_fold_tts(mac.node.stream(), &mut Marker(mark)); let opt_expanded = match *ext { - NormalTT(ref expandfun, exp_span, allow_internal_unstable) => { - if ident.name != keywords::Invalid.name() { - let msg = - format!("macro {}! expects no ident argument, given '{}'", path, ident); + SyntaxExtension::DeclMacro(ref expand, def_site_span) => { + if let Err(msg) = validate_and_set_expn_info(def_site_span, false) { self.cx.span_err(path.span, &msg); return kind.dummy(span); } + kind.make_from(expand.expand(self.cx, span, marked_tts)) + } - invoc.expansion_data.mark.set_expn_info(ExpnInfo { - call_site: span, - callee: NameAndSpan { - format: MacroBang(Symbol::intern(&format!("{}", path))), - span: exp_span.map(|(_, s)| s), - allow_internal_unstable: allow_internal_unstable, - }, - }); - + NormalTT(ref expandfun, def_info, allow_internal_unstable) => { + if let Err(msg) = validate_and_set_expn_info(def_info.map(|(_, s)| s), + allow_internal_unstable) { + self.cx.span_err(path.span, &msg); + return kind.dummy(span); + } kind.make_from(expandfun.expand(self.cx, span, marked_tts)) } @@ -687,7 +699,7 @@ macro_rules! fully_configure { impl<'a, 'b> InvocationCollector<'a, 'b> { fn collect(&mut self, expansion_kind: ExpansionKind, kind: InvocationKind) -> Expansion { - let mark = Mark::fresh(); + let mark = Mark::fresh(self.cx.current_expansion.mark); self.invocations.push(Invocation { kind: kind, expansion_kind: expansion_kind, diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index ad09d583734..a9252d0818e 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -253,9 +253,12 @@ pub fn compile(sess: &ParseSess, features: &RefCell<Features>, def: &ast::Item) valid: valid, }); - NormalTT(exp, - Some((def.id, def.span)), - attr::contains_name(&def.attrs, "allow_internal_unstable")) + if body.legacy { + let allow_internal_unstable = attr::contains_name(&def.attrs, "allow_internal_unstable"); + NormalTT(exp, Some((def.id, def.span)), allow_internal_unstable) + } else { + SyntaxExtension::DeclMacro(exp, Some(def.span)) + } } fn check_lhs_nt_follows(sess: &ParseSess, diff --git a/src/libsyntax/fold.rs b/src/libsyntax/fold.rs index 1d1e46cf576..5bbda5f2689 100644 --- a/src/libsyntax/fold.rs +++ b/src/libsyntax/fold.rs @@ -428,7 +428,7 @@ pub fn noop_fold_global_asm<T: Folder>(ga: P<GlobalAsm>, pub fn noop_fold_variant<T: Folder>(v: Variant, fld: &mut T) -> Variant { Spanned { node: Variant_ { - name: v.node.name, + name: fld.fold_ident(v.node.name), attrs: fold_attrs(v.node.attrs, fld), data: fld.fold_variant_data(v.node.data), disr_expr: v.node.disr_expr.map(|e| fld.fold_expr(e)), diff --git a/src/libsyntax/std_inject.rs b/src/libsyntax/std_inject.rs index 8e257102e1c..a8a9ae556f1 100644 --- a/src/libsyntax/std_inject.rs +++ b/src/libsyntax/std_inject.rs @@ -21,7 +21,7 @@ use tokenstream::TokenStream; /// call to codemap's `is_internal` check. /// The expanded code uses the unstable `#[prelude_import]` attribute. fn ignored_span(sp: Span) -> Span { - let mark = Mark::fresh(); + let mark = Mark::fresh(Mark::root()); mark.set_expn_info(ExpnInfo { call_site: DUMMY_SP, callee: NameAndSpan { diff --git a/src/libsyntax/test.rs b/src/libsyntax/test.rs index bb1a6ff65a5..3df61fadc35 100644 --- a/src/libsyntax/test.rs +++ b/src/libsyntax/test.rs @@ -276,7 +276,7 @@ fn generate_test_harness(sess: &ParseSess, let mut cleaner = EntryPointCleaner { depth: 0 }; let krate = cleaner.fold_crate(krate); - let mark = Mark::fresh(); + let mark = Mark::fresh(Mark::root()); let mut cx: TestCtxt = TestCtxt { sess: sess, span_diagnostic: sd, |
