rustc_ast: Introduce Token::uninterpolate
This commit is contained in:
parent
f4a03c44d5
commit
43b27df5b2
@ -14,8 +14,8 @@ use rustc_macros::HashStable_Generic;
|
|||||||
use rustc_span::symbol::kw;
|
use rustc_span::symbol::kw;
|
||||||
use rustc_span::symbol::Symbol;
|
use rustc_span::symbol::Symbol;
|
||||||
use rustc_span::{self, Span, DUMMY_SP};
|
use rustc_span::{self, Span, DUMMY_SP};
|
||||||
use std::fmt;
|
use std::borrow::Cow;
|
||||||
use std::mem;
|
use std::{fmt, mem};
|
||||||
|
|
||||||
#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)]
|
#[derive(Clone, PartialEq, RustcEncodable, RustcDecodable, Hash, Debug, Copy)]
|
||||||
#[derive(HashStable_Generic)]
|
#[derive(HashStable_Generic)]
|
||||||
@ -457,6 +457,22 @@ impl Token {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Turns interpolated identifier (`$i: ident`) or lifetime (`$l: lifetime`) token
|
||||||
|
// into the regular identifier or lifetime token it refers to,
|
||||||
|
// otherwise returns the original token.
|
||||||
|
pub fn uninterpolate(&self) -> Cow<'_, Token> {
|
||||||
|
match &self.kind {
|
||||||
|
Interpolated(nt) => match **nt {
|
||||||
|
NtIdent(ident, is_raw) => {
|
||||||
|
Cow::Owned(Token::new(Ident(ident.name, is_raw), ident.span))
|
||||||
|
}
|
||||||
|
NtLifetime(ident) => Cow::Owned(Token::new(Lifetime(ident.name), ident.span)),
|
||||||
|
_ => Cow::Borrowed(self),
|
||||||
|
},
|
||||||
|
_ => Cow::Borrowed(self),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns an identifier if this token is an identifier.
|
/// Returns an identifier if this token is an identifier.
|
||||||
pub fn ident(&self) -> Option<(ast::Ident, /* is_raw */ bool)> {
|
pub fn ident(&self) -> Option<(ast::Ident, /* is_raw */ bool)> {
|
||||||
match self.kind {
|
match self.kind {
|
||||||
|
@ -435,7 +435,7 @@ impl<'a> Parser<'a> {
|
|||||||
let attrs = self.parse_or_use_outer_attributes(attrs)?;
|
let attrs = self.parse_or_use_outer_attributes(attrs)?;
|
||||||
let lo = self.token.span;
|
let lo = self.token.span;
|
||||||
// Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr()
|
// Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr()
|
||||||
let (hi, ex) = match self.normalized_token.kind {
|
let (hi, ex) = match self.token.uninterpolate().kind {
|
||||||
token::Not => self.parse_unary_expr(lo, UnOp::Not), // `!expr`
|
token::Not => self.parse_unary_expr(lo, UnOp::Not), // `!expr`
|
||||||
token::Tilde => self.recover_tilde_expr(lo), // `~expr`
|
token::Tilde => self.recover_tilde_expr(lo), // `~expr`
|
||||||
token::BinOp(token::Minus) => self.parse_unary_expr(lo, UnOp::Neg), // `-expr`
|
token::BinOp(token::Minus) => self.parse_unary_expr(lo, UnOp::Neg), // `-expr`
|
||||||
@ -755,7 +755,7 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn parse_dot_suffix_expr(&mut self, lo: Span, base: P<Expr>) -> PResult<'a, P<Expr>> {
|
fn parse_dot_suffix_expr(&mut self, lo: Span, base: P<Expr>) -> PResult<'a, P<Expr>> {
|
||||||
match self.normalized_token.kind {
|
match self.token.uninterpolate().kind {
|
||||||
token::Ident(..) => self.parse_dot_suffix(base, lo),
|
token::Ident(..) => self.parse_dot_suffix(base, lo),
|
||||||
token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) => {
|
token::Literal(token::Lit { kind: token::Integer, symbol, suffix }) => {
|
||||||
Ok(self.parse_tuple_field_access_expr(lo, base, symbol, suffix))
|
Ok(self.parse_tuple_field_access_expr(lo, base, symbol, suffix))
|
||||||
|
@ -1544,7 +1544,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
let is_name_required = match self.token.kind {
|
let is_name_required = match self.token.kind {
|
||||||
token::DotDotDot => false,
|
token::DotDotDot => false,
|
||||||
_ => req_name(self.normalized_token.span.edition()),
|
_ => req_name(self.token.uninterpolate().span.edition()),
|
||||||
};
|
};
|
||||||
let (pat, ty) = if is_name_required || self.is_named_param() {
|
let (pat, ty) = if is_name_required || self.is_named_param() {
|
||||||
debug!("parse_param_general parse_pat (is_name_required:{})", is_name_required);
|
debug!("parse_param_general parse_pat (is_name_required:{})", is_name_required);
|
||||||
@ -1648,7 +1648,7 @@ impl<'a> Parser<'a> {
|
|||||||
// Only a limited set of initial token sequences is considered `self` parameters; anything
|
// Only a limited set of initial token sequences is considered `self` parameters; anything
|
||||||
// else is parsed as a normal function parameter list, so some lookahead is required.
|
// else is parsed as a normal function parameter list, so some lookahead is required.
|
||||||
let eself_lo = self.token.span;
|
let eself_lo = self.token.span;
|
||||||
let (eself, eself_ident, eself_hi) = match self.normalized_token.kind {
|
let (eself, eself_ident, eself_hi) = match self.token.uninterpolate().kind {
|
||||||
token::BinOp(token::And) => {
|
token::BinOp(token::And) => {
|
||||||
let eself = if is_isolated_self(self, 1) {
|
let eself = if is_isolated_self(self, 1) {
|
||||||
// `&self`
|
// `&self`
|
||||||
|
Loading…
x
Reference in New Issue
Block a user