Clarify the meaning of the span within mbe::TokenTree::MetaVar.

This commit is contained in:
Nicholas Nethercote 2024-05-20 08:45:54 +10:00
parent 39e02f1bd1
commit c8844dfdc0
2 changed files with 13 additions and 9 deletions

View File

@ -73,7 +73,8 @@ enum TokenTree {
Delimited(DelimSpan, DelimSpacing, Delimited), Delimited(DelimSpan, DelimSpacing, Delimited),
/// A kleene-style repetition sequence, e.g. `$($e:expr)*` (RHS) or `$($e),*` (LHS). /// A kleene-style repetition sequence, e.g. `$($e:expr)*` (RHS) or `$($e),*` (LHS).
Sequence(DelimSpan, SequenceRepetition), Sequence(DelimSpan, SequenceRepetition),
/// e.g., `$var`. /// e.g., `$var`. The span covers the leading dollar and the ident. (The span within the ident
/// only covers the ident, e.g. `var`.)
MetaVar(Span, Ident), MetaVar(Span, Ident),
/// e.g., `$var:expr`. Only appears on the LHS. /// e.g., `$var:expr`. Only appears on the LHS.
MetaVarDecl(Span, Ident /* name to bind */, Option<NonterminalKind>), MetaVarDecl(Span, Ident /* name to bind */, Option<NonterminalKind>),

View File

@ -176,7 +176,7 @@ fn parse_tree<'a>(
// Depending on what `tree` is, we could be parsing different parts of a macro // Depending on what `tree` is, we could be parsing different parts of a macro
match tree { match tree {
// `tree` is a `$` token. Look at the next token in `trees` // `tree` is a `$` token. Look at the next token in `trees`
&tokenstream::TokenTree::Token(Token { kind: token::Dollar, span }, _) => { &tokenstream::TokenTree::Token(Token { kind: token::Dollar, span: dollar_span }, _) => {
// FIXME: Handle `Invisible`-delimited groups in a more systematic way // FIXME: Handle `Invisible`-delimited groups in a more systematic way
// during parsing. // during parsing.
let mut next = outer_trees.next(); let mut next = outer_trees.next();
@ -209,7 +209,7 @@ fn parse_tree<'a>(
err.emit(); err.emit();
// Returns early the same read `$` to avoid spanning // Returns early the same read `$` to avoid spanning
// unrelated diagnostics that could be performed afterwards // unrelated diagnostics that could be performed afterwards
return TokenTree::token(token::Dollar, span); return TokenTree::token(token::Dollar, dollar_span);
} }
Ok(elem) => { Ok(elem) => {
maybe_emit_macro_metavar_expr_feature( maybe_emit_macro_metavar_expr_feature(
@ -251,7 +251,7 @@ fn parse_tree<'a>(
// special metavariable that names the crate of the invocation. // special metavariable that names the crate of the invocation.
Some(tokenstream::TokenTree::Token(token, _)) if token.is_ident() => { Some(tokenstream::TokenTree::Token(token, _)) if token.is_ident() => {
let (ident, is_raw) = token.ident().unwrap(); let (ident, is_raw) = token.ident().unwrap();
let span = ident.span.with_lo(span.lo()); let span = ident.span.with_lo(dollar_span.lo());
if ident.name == kw::Crate && matches!(is_raw, IdentIsRaw::No) { if ident.name == kw::Crate && matches!(is_raw, IdentIsRaw::No) {
TokenTree::token(token::Ident(kw::DollarCrate, is_raw), span) TokenTree::token(token::Ident(kw::DollarCrate, is_raw), span)
} else { } else {
@ -260,16 +260,19 @@ fn parse_tree<'a>(
} }
// `tree` is followed by another `$`. This is an escaped `$`. // `tree` is followed by another `$`. This is an escaped `$`.
Some(&tokenstream::TokenTree::Token(Token { kind: token::Dollar, span }, _)) => { Some(&tokenstream::TokenTree::Token(
Token { kind: token::Dollar, span: dollar_span2 },
_,
)) => {
if parsing_patterns { if parsing_patterns {
span_dollar_dollar_or_metavar_in_the_lhs_err( span_dollar_dollar_or_metavar_in_the_lhs_err(
sess, sess,
&Token { kind: token::Dollar, span }, &Token { kind: token::Dollar, span: dollar_span2 },
); );
} else { } else {
maybe_emit_macro_metavar_expr_feature(features, sess, span); maybe_emit_macro_metavar_expr_feature(features, sess, dollar_span2);
} }
TokenTree::token(token::Dollar, span) TokenTree::token(token::Dollar, dollar_span2)
} }
// `tree` is followed by some other token. This is an error. // `tree` is followed by some other token. This is an error.
@ -281,7 +284,7 @@ fn parse_tree<'a>(
} }
// There are no more tokens. Just return the `$` we already have. // There are no more tokens. Just return the `$` we already have.
None => TokenTree::token(token::Dollar, span), None => TokenTree::token(token::Dollar, dollar_span),
} }
} }