Skip to content

Commit 74d42f4

Browse files
committed
Introduce InvisibleOrigin on invisible delimiters.
It's not used meaningfully yet, but will be needed to get rid of interpolated tokens.
1 parent 0b16c27 commit 74d42f4

File tree

9 files changed

+60
-28
lines changed

9 files changed

+60
-28
lines changed

compiler/rustc_ast/src/attr/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ impl MetaItemKind {
383383
tokens: &mut impl Iterator<Item = &'a TokenTree>,
384384
) -> Option<MetaItemKind> {
385385
match tokens.next() {
386-
Some(TokenTree::Delimited(.., Delimiter::Invisible, inner_tokens)) => {
386+
Some(TokenTree::Delimited(.., Delimiter::Invisible(_), inner_tokens)) => {
387387
MetaItemKind::name_value_from_tokens(&mut inner_tokens.trees())
388388
}
389389
Some(TokenTree::Token(token, _)) => {
@@ -521,7 +521,7 @@ impl NestedMetaItem {
521521
tokens.next();
522522
return Some(NestedMetaItem::Lit(lit));
523523
}
524-
Some(TokenTree::Delimited(.., Delimiter::Invisible, inner_tokens)) => {
524+
Some(TokenTree::Delimited(.., Delimiter::Invisible(_), inner_tokens)) => {
525525
tokens.next();
526526
return NestedMetaItem::from_tokens(&mut inner_tokens.trees().peekable());
527527
}

compiler/rustc_ast/src/token.rs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,20 @@ pub enum BinOpToken {
3939
Shr,
4040
}
4141

42+
#[derive(Copy, Clone, Debug, PartialEq, Eq, Encodable, Decodable, Hash, HashStable_Generic)]
43+
pub enum InvisibleOrigin {
44+
// From the expansion of a metavariable in a declarative macro.
45+
MetaVar(NonterminalKind),
46+
47+
// Converted from `proc_macro::Delimiter` in
48+
// `proc_macro::Delimiter::to_internal`, i.e. returned by a proc macro.
49+
ProcMacro,
50+
51+
// Converted from `TokenKind::Interpolated` in
52+
// `TokenStream::flatten_token`. Treated similarly to `ProcMacro`.
53+
FlattenToken,
54+
}
55+
4256
/// Describes how a sequence of token trees is delimited.
4357
/// Cannot use `proc_macro::Delimiter` directly because this
4458
/// structure should implement some additional traits.
@@ -56,7 +70,22 @@ pub enum Delimiter {
5670
/// "macro variable" `$var`. It is important to preserve operator priorities in cases like
5771
/// `$var * 3` where `$var` is `1 + 2`.
5872
/// Invisible delimiters might not survive roundtrip of a token stream through a string.
59-
Invisible,
73+
Invisible(InvisibleOrigin),
74+
}
75+
76+
impl Delimiter {
77+
// Should the parser skip these delimiters? Only happens for certain kinds
78+
// of invisible delimiters. Ideally this function will eventually disappear
79+
// and no invisible delimiters will be skipped.
80+
#[inline]
81+
pub fn skip(&self) -> bool {
82+
use InvisibleOrigin::*;
83+
match self {
84+
Delimiter::Parenthesis | Delimiter::Bracket | Delimiter::Brace => false,
85+
Delimiter::Invisible(MetaVar(_)) => false,
86+
Delimiter::Invisible(FlattenToken | ProcMacro) => true,
87+
}
88+
}
6089
}
6190

6291
// Note that the suffix is *not* considered when deciding the `LitKind` in this
@@ -869,7 +898,7 @@ pub enum Nonterminal {
869898
NtVis(P<ast::Visibility>),
870899
}
871900

872-
#[derive(Debug, Copy, Clone, PartialEq, Encodable, Decodable)]
901+
#[derive(Debug, Copy, Clone, PartialEq, Eq, Encodable, Decodable, Hash, HashStable_Generic)]
873902
pub enum NonterminalKind {
874903
Item,
875904
Block,

compiler/rustc_ast/src/tokenstream.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
1616
use crate::ast::{AttrStyle, StmtKind};
1717
use crate::ast_traits::{HasAttrs, HasSpan, HasTokens};
18-
use crate::token::{self, Delimiter, Nonterminal, Token, TokenKind};
18+
use crate::token::{self, Delimiter, InvisibleOrigin, Nonterminal, Token, TokenKind};
1919
use crate::AttrVec;
2020

2121
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
@@ -490,13 +490,13 @@ impl TokenStream {
490490
token::NtLifetime(ident) => TokenTree::Delimited(
491491
DelimSpan::from_single(token.span),
492492
DelimSpacing::new(Spacing::JointHidden, spacing),
493-
Delimiter::Invisible,
493+
Delimiter::Invisible(InvisibleOrigin::FlattenToken),
494494
TokenStream::token_alone(token::Lifetime(ident.name), ident.span),
495495
),
496496
token::Interpolated(ref nt) => TokenTree::Delimited(
497497
DelimSpan::from_single(token.span),
498498
DelimSpacing::new(Spacing::JointHidden, spacing),
499-
Delimiter::Invisible,
499+
Delimiter::Invisible(InvisibleOrigin::FlattenToken),
500500
TokenStream::from_nonterminal_ast(&nt).flattened(),
501501
),
502502
_ => TokenTree::Token(token.clone(), spacing),

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,10 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
524524
}
525525
}
526526

527-
fn peek_comment<'b>(&'b self) -> Option<&'b Comment> where 'a: 'b {
527+
fn peek_comment<'b>(&'b self) -> Option<&'b Comment>
528+
where
529+
'a: 'b,
530+
{
528531
self.comments().and_then(|c| c.peek())
529532
}
530533

@@ -907,9 +910,8 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
907910
token::CloseDelim(Delimiter::Bracket) => "]".into(),
908911
token::OpenDelim(Delimiter::Brace) => "{".into(),
909912
token::CloseDelim(Delimiter::Brace) => "}".into(),
910-
token::OpenDelim(Delimiter::Invisible) | token::CloseDelim(Delimiter::Invisible) => {
911-
"".into()
912-
}
913+
token::OpenDelim(Delimiter::Invisible(_))
914+
| token::CloseDelim(Delimiter::Invisible(_)) => "".into(),
913915
token::Pound => "#".into(),
914916
token::Dollar => "$".into(),
915917
token::Question => "?".into(),

compiler/rustc_expand/src/mbe/macro_rules.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -702,7 +702,7 @@ fn has_compile_error_macro(rhs: &mbe::TokenTree) -> bool {
702702
&& let mbe::TokenTree::Token(bang) = bang
703703
&& let TokenKind::Not = bang.kind
704704
&& let mbe::TokenTree::Delimited(.., del) = args
705-
&& del.delim != Delimiter::Invisible
705+
&& !del.delim.skip()
706706
{
707707
true
708708
} else {

compiler/rustc_expand/src/mbe/quoted.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,12 @@ fn parse_tree<'a>(
152152
// during parsing.
153153
let mut next = outer_trees.next();
154154
let mut trees: Box<dyn Iterator<Item = &tokenstream::TokenTree>>;
155-
if let Some(tokenstream::TokenTree::Delimited(.., Delimiter::Invisible, tts)) = next {
156-
trees = Box::new(tts.trees());
157-
next = trees.next();
158-
} else {
159-
trees = Box::new(outer_trees);
155+
match next {
156+
Some(tokenstream::TokenTree::Delimited(.., delim, tts)) if delim.skip() => {
157+
trees = Box::new(tts.trees());
158+
next = trees.next();
159+
}
160+
_ => trees = Box::new(outer_trees),
160161
}
161162

162163
match next {

compiler/rustc_expand/src/proc_macro_server.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ impl FromInternal<token::Delimiter> for Delimiter {
3535
token::Delimiter::Parenthesis => Delimiter::Parenthesis,
3636
token::Delimiter::Brace => Delimiter::Brace,
3737
token::Delimiter::Bracket => Delimiter::Bracket,
38-
token::Delimiter::Invisible => Delimiter::None,
38+
token::Delimiter::Invisible(_) => Delimiter::None,
3939
}
4040
}
4141
}
@@ -46,7 +46,7 @@ impl ToInternal<token::Delimiter> for Delimiter {
4646
Delimiter::Parenthesis => token::Delimiter::Parenthesis,
4747
Delimiter::Brace => token::Delimiter::Brace,
4848
Delimiter::Bracket => token::Delimiter::Bracket,
49-
Delimiter::None => token::Delimiter::Invisible,
49+
Delimiter::None => token::Delimiter::Invisible(token::InvisibleOrigin::ProcMacro),
5050
}
5151
}
5252
}

compiler/rustc_parse/src/parser/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ impl TokenCursor {
286286
spacing,
287287
delim,
288288
));
289-
if delim != Delimiter::Invisible {
289+
if !delim.skip() {
290290
return (Token::new(token::OpenDelim(delim), sp.open), spacing.open);
291291
}
292292
// No open delimiter to return; continue on to the next iteration.
@@ -295,7 +295,7 @@ impl TokenCursor {
295295
} else if let Some((tree_cursor, span, spacing, delim)) = self.stack.pop() {
296296
// We have exhausted this token stream. Move back to its parent token stream.
297297
self.tree_cursor = tree_cursor;
298-
if delim != Delimiter::Invisible {
298+
if !delim.skip() {
299299
return (Token::new(token::CloseDelim(delim), span.close), spacing.close);
300300
}
301301
// No close delimiter to return; continue on to the next iteration.
@@ -1113,7 +1113,7 @@ impl<'a> Parser<'a> {
11131113
}
11141114
debug_assert!(!matches!(
11151115
next.0.kind,
1116-
token::OpenDelim(Delimiter::Invisible) | token::CloseDelim(Delimiter::Invisible)
1116+
token::OpenDelim(delim) | token::CloseDelim(delim) if delim.skip()
11171117
));
11181118
self.inlined_bump_with(next)
11191119
}
@@ -1127,17 +1127,17 @@ impl<'a> Parser<'a> {
11271127
}
11281128

11291129
if let Some(&(_, span, _, delim)) = self.token_cursor.stack.last()
1130-
&& delim != Delimiter::Invisible
1130+
&& !delim.skip()
11311131
{
11321132
// We are not in the outermost token stream, and the token stream
11331133
// we are in has non-skipped delimiters. Look for skipped
11341134
// delimiters in the lookahead range.
11351135
let tree_cursor = &self.token_cursor.tree_cursor;
1136-
let all_normal = (0..dist).all(|i| {
1136+
let any_skip = (0..dist).any(|i| {
11371137
let token = tree_cursor.look_ahead(i);
1138-
!matches!(token, Some(TokenTree::Delimited(.., Delimiter::Invisible, _)))
1138+
matches!(token, Some(TokenTree::Delimited(.., delim, _)) if delim.skip())
11391139
});
1140-
if all_normal {
1140+
if !any_skip {
11411141
// There were no skipped delimiters. Do lookahead by plain indexing.
11421142
return match tree_cursor.look_ahead(dist - 1) {
11431143
Some(tree) => {
@@ -1168,7 +1168,7 @@ impl<'a> Parser<'a> {
11681168
token = cursor.next().0;
11691169
if matches!(
11701170
token.kind,
1171-
token::OpenDelim(Delimiter::Invisible) | token::CloseDelim(Delimiter::Invisible)
1171+
token::OpenDelim(delim) | token::CloseDelim(delim) if delim.skip()
11721172
) {
11731173
continue;
11741174
}

src/tools/rustfmt/src/macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ fn delim_token_to_str(
587587
("{ ", " }")
588588
}
589589
}
590-
Delimiter::Invisible => unreachable!(),
590+
Delimiter::Invisible(_) => unreachable!(),
591591
};
592592
if use_multiple_lines {
593593
let indent_str = shape.indent.to_string_with_newline(context.config);

0 commit comments

Comments
 (0)