mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-23 07:14:28 +00:00
pprust: Support macro
macros
This commit is contained in:
parent
a2a1cd1864
commit
0cdd18d0a7
@ -20,6 +20,11 @@ use syntax_pos::{DUMMY_SP, FileName, Span};
|
||||
|
||||
use std::borrow::Cow;
|
||||
|
||||
pub enum MacHeader<'a> {
|
||||
Path(&'a ast::Path),
|
||||
Keyword(&'static str),
|
||||
}
|
||||
|
||||
pub enum AnnNode<'a> {
|
||||
Ident(&'a ast::Ident),
|
||||
Name(&'a ast::Name),
|
||||
@ -620,7 +625,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM
|
||||
match attr.tokens.trees().next() {
|
||||
Some(TokenTree::Delimited(_, delim, tts)) => {
|
||||
self.print_mac_common(
|
||||
Some(&attr.path), false, None, delim, tts, true, attr.span
|
||||
Some(MacHeader::Path(&attr.path)), false, None, delim, tts, true, attr.span
|
||||
);
|
||||
}
|
||||
tree => {
|
||||
@ -706,7 +711,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM
|
||||
|
||||
fn print_mac_common(
|
||||
&mut self,
|
||||
path: Option<&ast::Path>,
|
||||
header: Option<MacHeader<'_>>,
|
||||
has_bang: bool,
|
||||
ident: Option<ast::Ident>,
|
||||
delim: DelimToken,
|
||||
@ -717,8 +722,10 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM
|
||||
if delim == DelimToken::Brace {
|
||||
self.cbox(INDENT_UNIT);
|
||||
}
|
||||
if let Some(path) = path {
|
||||
self.print_path(path, false, 0);
|
||||
match header {
|
||||
Some(MacHeader::Path(path)) => self.print_path(path, false, 0),
|
||||
Some(MacHeader::Keyword(kw)) => self.word(kw),
|
||||
None => {}
|
||||
}
|
||||
if has_bang {
|
||||
self.word("!");
|
||||
@ -729,7 +736,7 @@ pub trait PrintState<'a>: std::ops::Deref<Target=pp::Printer> + std::ops::DerefM
|
||||
}
|
||||
match delim {
|
||||
DelimToken::Brace => {
|
||||
if path.is_some() || has_bang || ident.is_some() {
|
||||
if header.is_some() || has_bang || ident.is_some() {
|
||||
self.nbsp();
|
||||
}
|
||||
self.word("{");
|
||||
@ -1357,9 +1364,11 @@ impl<'a> State<'a> {
|
||||
}
|
||||
}
|
||||
ast::ItemKind::MacroDef(ref macro_def) => {
|
||||
let (kw, has_bang) =
|
||||
if macro_def.legacy { ("macro_rules", true) } else { ("macro", false) };
|
||||
self.print_mac_common(
|
||||
Some(&ast::Path::from_ident(ast::Ident::with_empty_ctxt(sym::macro_rules))),
|
||||
true,
|
||||
Some(MacHeader::Keyword(kw)),
|
||||
has_bang,
|
||||
Some(item.ident),
|
||||
DelimToken::Brace,
|
||||
macro_def.stream(),
|
||||
@ -1754,7 +1763,13 @@ impl<'a> State<'a> {
|
||||
|
||||
crate fn print_mac(&mut self, m: &ast::Mac) {
|
||||
self.print_mac_common(
|
||||
Some(&m.node.path), true, None, m.node.delim.to_token(), m.node.stream(), true, m.span
|
||||
Some(MacHeader::Path(&m.node.path)),
|
||||
true,
|
||||
None,
|
||||
m.node.delim.to_token(),
|
||||
m.node.stream(),
|
||||
true,
|
||||
m.span,
|
||||
);
|
||||
}
|
||||
|
||||
|
7
src/test/pretty/macro.rs
Normal file
7
src/test/pretty/macro.rs
Normal file
@ -0,0 +1,7 @@
|
||||
// pp-exact
|
||||
|
||||
#![feature(decl_macro)]
|
||||
|
||||
macro mac { ($ arg : expr) => { $ arg + $ arg } }
|
||||
|
||||
fn main() { }
|
@ -2,7 +2,7 @@
|
||||
#![feature /* 0#0 */(no_core)]
|
||||
#![no_core /* 0#0 */]
|
||||
|
||||
macro_rules /* 0#0 */! foo /* 0#0 */ { ($ x : ident) => { y + $ x } }
|
||||
macro_rules! foo /* 0#0 */ { ($ x : ident) => { y + $ x } }
|
||||
|
||||
fn bar /* 0#0 */() { let x /* 0#0 */ = 1; y /* 0#1 */ + x /* 0#0 */ }
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user