Move float breaking out of Parser::parse_expr_tuple_field_access_float
Purely a refactor in preparation of using it in offset_of!() parsing
This commit is contained in:
parent
a77659a1e1
commit
d74ec96e8d
@ -91,6 +91,18 @@ fn from(expr: P<Expr>) -> Self {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum DestructuredFloat {
|
||||||
|
/// 1e2
|
||||||
|
Single(Symbol, Span),
|
||||||
|
/// 1.
|
||||||
|
TrailingDot(Symbol, Span, Span),
|
||||||
|
/// 1.2 | 1.2e3
|
||||||
|
MiddleDot(Symbol, Span, Span, Symbol, Span),
|
||||||
|
/// Invalid
|
||||||
|
Error,
|
||||||
|
}
|
||||||
|
|
||||||
impl<'a> Parser<'a> {
|
impl<'a> Parser<'a> {
|
||||||
/// Parses an expression.
|
/// Parses an expression.
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -1013,13 +1025,8 @@ fn error_unexpected_after_dot(&self) {
|
|||||||
// support pushing "future tokens" (would be also helpful to `break_and_eat`), or
|
// support pushing "future tokens" (would be also helpful to `break_and_eat`), or
|
||||||
// we should break everything including floats into more basic proc-macro style
|
// we should break everything including floats into more basic proc-macro style
|
||||||
// tokens in the lexer (probably preferable).
|
// tokens in the lexer (probably preferable).
|
||||||
fn parse_expr_tuple_field_access_float(
|
// See also `TokenKind::break_two_token_op` which does similar splitting of `>>` into `>`.
|
||||||
&mut self,
|
fn break_up_float(&mut self, float: Symbol) -> DestructuredFloat {
|
||||||
lo: Span,
|
|
||||||
base: P<Expr>,
|
|
||||||
float: Symbol,
|
|
||||||
suffix: Option<Symbol>,
|
|
||||||
) -> P<Expr> {
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
enum FloatComponent {
|
enum FloatComponent {
|
||||||
IdentLike(String),
|
IdentLike(String),
|
||||||
@ -1056,7 +1063,7 @@ enum FloatComponent {
|
|||||||
match &*components {
|
match &*components {
|
||||||
// 1e2
|
// 1e2
|
||||||
[IdentLike(i)] => {
|
[IdentLike(i)] => {
|
||||||
self.parse_expr_tuple_field_access(lo, base, Symbol::intern(&i), suffix, None)
|
DestructuredFloat::Single(Symbol::intern(&i), span)
|
||||||
}
|
}
|
||||||
// 1.
|
// 1.
|
||||||
[IdentLike(i), Punct('.')] => {
|
[IdentLike(i), Punct('.')] => {
|
||||||
@ -1068,11 +1075,8 @@ enum FloatComponent {
|
|||||||
} else {
|
} else {
|
||||||
(span, span)
|
(span, span)
|
||||||
};
|
};
|
||||||
assert!(suffix.is_none());
|
|
||||||
let symbol = Symbol::intern(&i);
|
let symbol = Symbol::intern(&i);
|
||||||
self.token = Token::new(token::Ident(symbol, false), ident_span);
|
DestructuredFloat::TrailingDot(symbol, ident_span, dot_span)
|
||||||
let next_token = (Token::new(token::Dot, dot_span), self.token_spacing);
|
|
||||||
self.parse_expr_tuple_field_access(lo, base, symbol, None, Some(next_token))
|
|
||||||
}
|
}
|
||||||
// 1.2 | 1.2e3
|
// 1.2 | 1.2e3
|
||||||
[IdentLike(i1), Punct('.'), IdentLike(i2)] => {
|
[IdentLike(i1), Punct('.'), IdentLike(i2)] => {
|
||||||
@ -1088,16 +1092,8 @@ enum FloatComponent {
|
|||||||
(span, span, span)
|
(span, span, span)
|
||||||
};
|
};
|
||||||
let symbol1 = Symbol::intern(&i1);
|
let symbol1 = Symbol::intern(&i1);
|
||||||
self.token = Token::new(token::Ident(symbol1, false), ident1_span);
|
|
||||||
// This needs to be `Spacing::Alone` to prevent regressions.
|
|
||||||
// See issue #76399 and PR #76285 for more details
|
|
||||||
let next_token1 = (Token::new(token::Dot, dot_span), Spacing::Alone);
|
|
||||||
let base1 =
|
|
||||||
self.parse_expr_tuple_field_access(lo, base, symbol1, None, Some(next_token1));
|
|
||||||
let symbol2 = Symbol::intern(&i2);
|
let symbol2 = Symbol::intern(&i2);
|
||||||
let next_token2 = Token::new(token::Ident(symbol2, false), ident2_span);
|
DestructuredFloat::MiddleDot(symbol1, ident1_span, dot_span, symbol2, ident2_span)
|
||||||
self.bump_with((next_token2, self.token_spacing)); // `.`
|
|
||||||
self.parse_expr_tuple_field_access(lo, base1, symbol2, suffix, None)
|
|
||||||
}
|
}
|
||||||
// 1e+ | 1e- (recovered)
|
// 1e+ | 1e- (recovered)
|
||||||
[IdentLike(_), Punct('+' | '-')] |
|
[IdentLike(_), Punct('+' | '-')] |
|
||||||
@ -1109,12 +1105,47 @@ enum FloatComponent {
|
|||||||
[IdentLike(_), Punct('.'), IdentLike(_), Punct('+' | '-'), IdentLike(_)] => {
|
[IdentLike(_), Punct('.'), IdentLike(_), Punct('+' | '-'), IdentLike(_)] => {
|
||||||
// See the FIXME about `TokenCursor` above.
|
// See the FIXME about `TokenCursor` above.
|
||||||
self.error_unexpected_after_dot();
|
self.error_unexpected_after_dot();
|
||||||
base
|
DestructuredFloat::Error
|
||||||
}
|
}
|
||||||
_ => panic!("unexpected components in a float token: {:?}", components),
|
_ => panic!("unexpected components in a float token: {:?}", components),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_expr_tuple_field_access_float(
|
||||||
|
&mut self,
|
||||||
|
lo: Span,
|
||||||
|
base: P<Expr>,
|
||||||
|
float: Symbol,
|
||||||
|
suffix: Option<Symbol>,
|
||||||
|
) -> P<Expr> {
|
||||||
|
match self.break_up_float(float) {
|
||||||
|
// 1e2
|
||||||
|
DestructuredFloat::Single(sym, _sp) => {
|
||||||
|
self.parse_expr_tuple_field_access(lo, base, sym, suffix, None)
|
||||||
|
}
|
||||||
|
// 1.
|
||||||
|
DestructuredFloat::TrailingDot(sym, ident_span, dot_span) => {
|
||||||
|
assert!(suffix.is_none());
|
||||||
|
self.token = Token::new(token::Ident(sym, false), ident_span);
|
||||||
|
let next_token = (Token::new(token::Dot, dot_span), self.token_spacing);
|
||||||
|
self.parse_expr_tuple_field_access(lo, base, sym, None, Some(next_token))
|
||||||
|
}
|
||||||
|
// 1.2 | 1.2e3
|
||||||
|
DestructuredFloat::MiddleDot(symbol1, ident1_span, dot_span, symbol2, ident2_span) => {
|
||||||
|
self.token = Token::new(token::Ident(symbol1, false), ident1_span);
|
||||||
|
// This needs to be `Spacing::Alone` to prevent regressions.
|
||||||
|
// See issue #76399 and PR #76285 for more details
|
||||||
|
let next_token1 = (Token::new(token::Dot, dot_span), Spacing::Alone);
|
||||||
|
let base1 =
|
||||||
|
self.parse_expr_tuple_field_access(lo, base, symbol1, None, Some(next_token1));
|
||||||
|
let next_token2 = Token::new(token::Ident(symbol2, false), ident2_span);
|
||||||
|
self.bump_with((next_token2, self.token_spacing)); // `.`
|
||||||
|
self.parse_expr_tuple_field_access(lo, base1, symbol2, suffix, None)
|
||||||
|
}
|
||||||
|
DestructuredFloat::Error => base,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn parse_expr_tuple_field_access(
|
fn parse_expr_tuple_field_access(
|
||||||
&mut self,
|
&mut self,
|
||||||
lo: Span,
|
lo: Span,
|
||||||
|
Loading…
Reference in New Issue
Block a user