summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNika Layzell <nika@thelayzells.com>2022-06-27 20:03:56 -0400
committerNika Layzell <nika@thelayzells.com>2022-06-28 09:54:29 -0400
commit64a7d57046bc4653dddb346b51cd66a8980f3533 (patch)
tree99e98144d5fc04f147314b36735174dd910dd3a2
parentf28dfdf1c777ff83660cec0b432acabde1a2f7a4 (diff)
downloadrust-64a7d57046bc4653dddb346b51cd66a8980f3533.tar.gz
review changes
longer names for RPC generics and reduced dependency on macros in the server.
-rw-r--r--compiler/rustc_expand/src/proc_macro_server.rs199
-rw-r--r--library/proc_macro/src/bridge/mod.rs53
-rw-r--r--library/proc_macro/src/lib.rs8
3 files changed, 128 insertions, 132 deletions
diff --git a/compiler/rustc_expand/src/proc_macro_server.rs b/compiler/rustc_expand/src/proc_macro_server.rs
index 75731b9071d..0e909e2f982 100644
--- a/compiler/rustc_expand/src/proc_macro_server.rs
+++ b/compiler/rustc_expand/src/proc_macro_server.rs
@@ -55,8 +55,10 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)>
fn from_internal((stream, rustc): (TokenStream, &mut Rustc<'_, '_>)) -> Self {
use rustc_ast::token::*;
+ // Estimate the capacity as `stream.len()` rounded up to the next power
+ // of two to limit the number of required reallocations.
+ let mut trees = Vec::with_capacity(stream.len().next_power_of_two());
let mut cursor = stream.into_trees();
- let mut trees = Vec::new();
while let Some((tree, spacing)) = cursor.next_with_spacing() {
let joint = spacing == Joint;
@@ -77,95 +79,78 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)>
tokenstream::TokenTree::Token(token) => token,
};
- macro_rules! tt {
- ($ty:ident { $($field:ident $(: $value:expr)*),+ $(,)? }) => (
- trees.push(TokenTree::$ty(self::$ty {
- $($field $(: $value)*,)+
- span,
- }))
- );
- ($ty:ident::$method:ident($($value:expr),*)) => (
- trees.push(TokenTree::$ty(self::$ty::$method($($value,)* span)))
- );
- }
- macro_rules! op {
- ($a:expr) => {{
- tt!(Punct { ch: $a, joint });
- }};
- ($a:expr, $b:expr) => {{
- tt!(Punct { ch: $a, joint: true });
- tt!(Punct { ch: $b, joint });
- }};
- ($a:expr, $b:expr, $c:expr) => {{
- tt!(Punct { ch: $a, joint: true });
- tt!(Punct { ch: $b, joint: true });
- tt!(Punct { ch: $c, joint });
- }};
- }
+ let mut op = |s: &str| {
+ assert!(s.is_ascii());
+ trees.extend(s.as_bytes().iter().enumerate().map(|(idx, &ch)| {
+ TokenTree::Punct(Punct { ch, joint: joint || idx != s.len() - 1, span })
+ }));
+ };
match kind {
- Eq => op!('='),
- Lt => op!('<'),
- Le => op!('<', '='),
- EqEq => op!('=', '='),
- Ne => op!('!', '='),
- Ge => op!('>', '='),
- Gt => op!('>'),
- AndAnd => op!('&', '&'),
- OrOr => op!('|', '|'),
- Not => op!('!'),
- Tilde => op!('~'),
- BinOp(Plus) => op!('+'),
- BinOp(Minus) => op!('-'),
- BinOp(Star) => op!('*'),
- BinOp(Slash) => op!('/'),
- BinOp(Percent) => op!('%'),
- BinOp(Caret) => op!('^'),
- BinOp(And) => op!('&'),
- BinOp(Or) => op!('|'),
- BinOp(Shl) => op!('<', '<'),
- BinOp(Shr) => op!('>', '>'),
- BinOpEq(Plus) => op!('+', '='),
- BinOpEq(Minus) => op!('-', '='),
- BinOpEq(Star) => op!('*', '='),
- BinOpEq(Slash) => op!('/', '='),
- BinOpEq(Percent) => op!('%', '='),
- BinOpEq(Caret) => op!('^', '='),
- BinOpEq(And) => op!('&', '='),
- BinOpEq(Or) => op!('|', '='),
- BinOpEq(Shl) => op!('<', '<', '='),
- BinOpEq(Shr) => op!('>', '>', '='),
- At => op!('@'),
- Dot => op!('.'),
- DotDot => op!('.', '.'),
- DotDotDot => op!('.', '.', '.'),
- DotDotEq => op!('.', '.', '='),
- Comma => op!(','),
- Semi => op!(';'),
- Colon => op!(':'),
- ModSep => op!(':', ':'),
- RArrow => op!('-', '>'),
- LArrow => op!('<', '-'),
- FatArrow => op!('=', '>'),
- Pound => op!('#'),
- Dollar => op!('$'),
- Question => op!('?'),
- SingleQuote => op!('\''),
-
- Ident(name, false) if name == kw::DollarCrate => tt!(Ident::dollar_crate()),
- Ident(name, is_raw) => tt!(Ident::new(rustc.sess(), name, is_raw)),
+ Eq => op("="),
+ Lt => op("<"),
+ Le => op("<="),
+ EqEq => op("=="),
+ Ne => op("!="),
+ Ge => op(">="),
+ Gt => op(">"),
+ AndAnd => op("&&"),
+ OrOr => op("||"),
+ Not => op("!"),
+ Tilde => op("~"),
+ BinOp(Plus) => op("+"),
+ BinOp(Minus) => op("-"),
+ BinOp(Star) => op("*"),
+ BinOp(Slash) => op("/"),
+ BinOp(Percent) => op("%"),
+ BinOp(Caret) => op("^"),
+ BinOp(And) => op("&"),
+ BinOp(Or) => op("|"),
+ BinOp(Shl) => op("<<"),
+ BinOp(Shr) => op(">>"),
+ BinOpEq(Plus) => op("+="),
+ BinOpEq(Minus) => op("-="),
+ BinOpEq(Star) => op("*="),
+ BinOpEq(Slash) => op("/="),
+ BinOpEq(Percent) => op("%="),
+ BinOpEq(Caret) => op("^="),
+ BinOpEq(And) => op("&="),
+ BinOpEq(Or) => op("|="),
+ BinOpEq(Shl) => op("<<="),
+ BinOpEq(Shr) => op(">>="),
+ At => op("@"),
+ Dot => op("."),
+ DotDot => op(".."),
+ DotDotDot => op("..."),
+ DotDotEq => op("..="),
+ Comma => op(","),
+ Semi => op(";"),
+ Colon => op(":"),
+ ModSep => op("::"),
+ RArrow => op("->"),
+ LArrow => op("<-"),
+ FatArrow => op("=>"),
+ Pound => op("#"),
+ Dollar => op("$"),
+ Question => op("?"),
+ SingleQuote => op("'"),
+
+ Ident(name, false) if name == kw::DollarCrate => trees.push(TokenTree::Ident(Ident::dollar_crate(span))),
+ Ident(name, is_raw) => trees.push(TokenTree::Ident(Ident::new(rustc.sess(), name, is_raw, span))),
Lifetime(name) => {
let ident = symbol::Ident::new(name, span).without_first_quote();
- tt!(Punct { ch: '\'', joint: true });
- tt!(Ident::new(rustc.sess(), ident.name, false));
+ trees.extend([
+ TokenTree::Punct(Punct { ch: b'\'', joint: true, span }),
+ TokenTree::Ident(Ident::new(rustc.sess(), ident.name, false, span)),
+ ]);
}
- Literal(lit) => tt!(Literal { lit }),
+ Literal(lit) => trees.push(TokenTree::Literal(self::Literal { lit, span })),
DocComment(_, attr_style, data) => {
let mut escaped = String::new();
for ch in data.as_str().chars() {
escaped.extend(ch.escape_debug());
}
- let stream = vec![
+ let stream = [
Ident(sym::doc, false),
Eq,
TokenKind::lit(token::Str, Symbol::intern(&escaped), None),
@@ -173,9 +158,9 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)>
.into_iter()
.map(|kind| tokenstream::TokenTree::token(kind, span))
.collect();
- tt!(Punct { ch: '#', joint: false });
+ trees.push(TokenTree::Punct(Punct { ch: b'#', joint: false, span }));
if attr_style == ast::AttrStyle::Inner {
- tt!(Punct { ch: '!', joint: false });
+ trees.push(TokenTree::Punct(Punct { ch: b'!', joint: false, span }));
}
trees.push(TokenTree::Group(Group {
delimiter: pm::Delimiter::Bracket,
@@ -190,6 +175,12 @@ impl FromInternal<(TokenStream, &mut Rustc<'_, '_>)>
Interpolated(nt) => {
let stream = TokenStream::from_nonterminal_ast(&nt);
+ // A hack used to pass AST fragments to attribute and derive
+ // macros as a single nonterminal token instead of a token
+ // stream. Such token needs to be "unwrapped" and not
+ // represented as a delimited group.
+ // FIXME: It needs to be removed, but there are some
+ // compatibility issues (see #73345).
if crate::base::nt_pretty_printing_compatibility_hack(&nt, rustc.sess()) {
trees.extend(Self::from_internal((stream, rustc)));
} else {
@@ -254,28 +245,28 @@ impl ToInternal<TokenStream> for TokenTree<TokenStream, Span, Ident, Literal> {
};
let kind = match ch {
- '=' => Eq,
- '<' => Lt,
- '>' => Gt,
- '!' => Not,
- '~' => Tilde,
- '+' => BinOp(Plus),
- '-' => BinOp(Minus),
- '*' => BinOp(Star),
- '/' => BinOp(Slash),
- '%' => BinOp(Percent),
- '^' => BinOp(Caret),
- '&' => BinOp(And),
- '|' => BinOp(Or),
- '@' => At,
- '.' => Dot,
- ',' => Comma,
- ';' => Semi,
- ':' => Colon,
- '#' => Pound,
- '$' => Dollar,
- '?' => Question,
- '\'' => SingleQuote,
+ b'=' => Eq,
+ b'<' => Lt,
+ b'>' => Gt,
+ b'!' => Not,
+ b'~' => Tilde,
+ b'+' => BinOp(Plus),
+ b'-' => BinOp(Minus),
+ b'*' => BinOp(Star),
+ b'/' => BinOp(Slash),
+ b'%' => BinOp(Percent),
+ b'^' => BinOp(Caret),
+ b'&' => BinOp(And),
+ b'|' => BinOp(Or),
+ b'@' => At,
+ b'.' => Dot,
+ b',' => Comma,
+ b';' => Semi,
+ b':' => Colon,
+ b'#' => Pound,
+ b'$' => Dollar,
+ b'?' => Question,
+ b'\'' => SingleQuote,
_ => unreachable!(),
};
diff --git a/library/proc_macro/src/bridge/mod.rs b/library/proc_macro/src/bridge/mod.rs
index 8995b5de475..048ba3a8fdb 100644
--- a/library/proc_macro/src/bridge/mod.rs
+++ b/library/proc_macro/src/bridge/mod.rs
@@ -325,6 +325,7 @@ mark_noop! {
&'_ [u8],
&'_ str,
String,
+ u8,
usize,
Delimiter,
Level,
@@ -431,48 +432,48 @@ compound_traits!(
);
#[derive(Copy, Clone)]
-pub struct DelimSpan<S> {
- pub open: S,
- pub close: S,
- pub entire: S,
+pub struct DelimSpan<Span> {
+ pub open: Span,
+ pub close: Span,
+ pub entire: Span,
}
-impl<S: Copy> DelimSpan<S> {
- pub fn from_single(span: S) -> Self {
+impl<Span: Copy> DelimSpan<Span> {
+ pub fn from_single(span: Span) -> Self {
DelimSpan { open: span, close: span, entire: span }
}
}
-compound_traits!(struct DelimSpan<Sp> { open, close, entire });
+compound_traits!(struct DelimSpan<Span> { open, close, entire });
#[derive(Clone)]
-pub struct Group<T, S> {
+pub struct Group<TokenStream, Span> {
pub delimiter: Delimiter,
- pub stream: Option<T>,
- pub span: DelimSpan<S>,
+ pub stream: Option<TokenStream>,
+ pub span: DelimSpan<Span>,
}
-compound_traits!(struct Group<T, Sp> { delimiter, stream, span });
+compound_traits!(struct Group<TokenStream, Span> { delimiter, stream, span });
#[derive(Clone)]
-pub struct Punct<S> {
- pub ch: char,
+pub struct Punct<Span> {
+ pub ch: u8,
pub joint: bool,
- pub span: S,
+ pub span: Span,
}
-compound_traits!(struct Punct<Sp> { ch, joint, span });
+compound_traits!(struct Punct<Span> { ch, joint, span });
#[derive(Clone)]
-pub enum TokenTree<T, S, I, L> {
- Group(Group<T, S>),
- Punct(Punct<S>),
- Ident(I),
- Literal(L),
+pub enum TokenTree<TokenStream, Span, Ident, Literal> {
+ Group(Group<TokenStream, Span>),
+ Punct(Punct<Span>),
+ Ident(Ident),
+ Literal(Literal),
}
compound_traits!(
- enum TokenTree<T, Sp, I, L> {
+ enum TokenTree<TokenStream, Span, Ident, Literal> {
Group(tt),
Punct(tt),
Ident(tt),
@@ -483,12 +484,12 @@ compound_traits!(
/// Globals provided alongside the initial inputs for a macro expansion.
/// Provides values such as spans which are used frequently to avoid RPC.
#[derive(Clone)]
-pub struct ExpnGlobals<S> {
- pub def_site: S,
- pub call_site: S,
- pub mixed_site: S,
+pub struct ExpnGlobals<Span> {
+ pub def_site: Span,
+ pub call_site: Span,
+ pub mixed_site: Span,
}
compound_traits!(
- struct ExpnGlobals<Sp> { def_site, call_site, mixed_site }
+ struct ExpnGlobals<Span> { def_site, call_site, mixed_site }
);
diff --git a/library/proc_macro/src/lib.rs b/library/proc_macro/src/lib.rs
index 7f6356953ca..9ab5061c668 100644
--- a/library/proc_macro/src/lib.rs
+++ b/library/proc_macro/src/lib.rs
@@ -969,13 +969,17 @@ impl Punct {
if !LEGAL_CHARS.contains(&ch) {
panic!("unsupported character `{:?}`", ch);
}
- Punct(bridge::Punct { ch, joint: spacing == Spacing::Joint, span: Span::call_site().0 })
+ Punct(bridge::Punct {
+ ch: ch as u8,
+ joint: spacing == Spacing::Joint,
+ span: Span::call_site().0,
+ })
}
/// Returns the value of this punctuation character as `char`.
#[stable(feature = "proc_macro_lib2", since = "1.29.0")]
pub fn as_char(&self) -> char {
- self.0.ch
+ self.0.ch as char
}
/// Returns the spacing of this punctuation character, indicating whether it's immediately