diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-06-07 12:53:33 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-06-07 18:01:50 +0300 |
| commit | 2af47facc3fd7eda3fb4e52f0589bb6f48eff15c (patch) | |
| tree | 46549007a191f5676a28704a3da1cfbd5eacdf7d /src/libsyntax | |
| parent | c1c60d292e2dd2deff7084208274f9a02f750d43 (diff) | |
| download | rust-2af47facc3fd7eda3fb4e52f0589bb6f48eff15c.tar.gz rust-2af47facc3fd7eda3fb4e52f0589bb6f48eff15c.zip | |
syntax: Treat error literals in more principled way
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ast.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/mut_visit.rs | 3 | ||||
| -rw-r--r-- | src/libsyntax/parse/literal.rs | 6 | ||||
| -rw-r--r-- | src/libsyntax/print/pprust.rs | 8 | ||||
| -rw-r--r-- | src/libsyntax/visit.rs | 3 |
5 files changed, 14 insertions, 12 deletions
diff --git a/src/libsyntax/ast.rs b/src/libsyntax/ast.rs index 598232f9f8f..02fbcb14fa5 100644 --- a/src/libsyntax/ast.rs +++ b/src/libsyntax/ast.rs @@ -1368,7 +1368,7 @@ pub enum LitKind { FloatUnsuffixed(Symbol), /// A boolean literal. Bool(bool), - /// A recovered character literal that contains mutliple `char`s, most likely a typo. + /// Placeholder for a literal that wasn't well-formed in some way. Err(Symbol), } @@ -1406,10 +1406,10 @@ impl LitKind { | LitKind::ByteStr(..) | LitKind::Byte(..) | LitKind::Char(..) - | LitKind::Err(..) | LitKind::Int(_, LitIntType::Unsuffixed) | LitKind::FloatUnsuffixed(..) - | LitKind::Bool(..) => true, + | LitKind::Bool(..) + | LitKind::Err(..) => true, // suffixed variants LitKind::Int(_, LitIntType::Signed(..)) | LitKind::Int(_, LitIntType::Unsigned(..)) diff --git a/src/libsyntax/mut_visit.rs b/src/libsyntax/mut_visit.rs index d2a614c4a54..2889f8edfc6 100644 --- a/src/libsyntax/mut_visit.rs +++ b/src/libsyntax/mut_visit.rs @@ -1101,7 +1101,6 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { node, id, span, attrs }: &mut Expr, vis.visit_expr(rhs); } ExprKind::Unary(_unop, ohs) => vis.visit_expr(ohs), - ExprKind::Lit(_lit) => {} ExprKind::Cast(expr, ty) => { vis.visit_expr(expr); vis.visit_ty(ty); @@ -1225,7 +1224,7 @@ pub fn noop_visit_expr<T: MutVisitor>(Expr { node, id, span, attrs }: &mut Expr, } ExprKind::Try(expr) => vis.visit_expr(expr), ExprKind::TryBlock(body) => vis.visit_block(body), - ExprKind::Err => {} + ExprKind::Lit(_) | ExprKind::Err => {} } vis.visit_id(id); vis.visit_span(span); diff --git a/src/libsyntax/parse/literal.rs b/src/libsyntax/parse/literal.rs index 7d5356ffe4d..467ad6ccfbe 100644 --- a/src/libsyntax/parse/literal.rs +++ b/src/libsyntax/parse/literal.rs @@ -311,7 +311,11 @@ impl<'a> Parser<'a> { let (lit, span) = (token.expect_lit(), token.span); self.bump(); err.report(&self.sess.span_diagnostic, lit, span); - let lit = token::Lit::new(token::Err, lit.symbol, lit.suffix); + // Pack possible quotes and prefixes from the original literal into + // the error literal's symbol so they can be pretty-printed faithfully. + let suffixless_lit = token::Lit::new(lit.kind, lit.symbol, None); + let symbol = Symbol::intern(&pprust::literal_to_string(suffixless_lit)); + let lit = token::Lit::new(token::Err, symbol, lit.suffix); Lit::from_lit_token(lit, span).map_err(|_| unreachable!()) } } diff --git a/src/libsyntax/print/pprust.rs b/src/libsyntax/print/pprust.rs index 07acfb5dc86..d922e1896cc 100644 --- a/src/libsyntax/print/pprust.rs +++ b/src/libsyntax/print/pprust.rs @@ -168,9 +168,6 @@ pub fn literal_to_string(lit: token::Lit) -> String { let mut out = match kind { token::Byte => format!("b'{}'", symbol), token::Char => format!("'{}'", symbol), - token::Bool | - token::Float | - token::Integer => symbol.to_string(), token::Str => format!("\"{}\"", symbol), token::StrRaw(n) => format!("r{delim}\"{string}\"{delim}", delim="#".repeat(n as usize), @@ -179,7 +176,10 @@ pub fn literal_to_string(lit: token::Lit) -> String { token::ByteStrRaw(n) => format!("br{delim}\"{string}\"{delim}", delim="#".repeat(n as usize), string=symbol), - token::Err => format!("'{}'", symbol), + token::Integer | + token::Float | + token::Bool | + token::Err => symbol.to_string(), }; if let Some(suffix) = suffix { diff --git a/src/libsyntax/visit.rs b/src/libsyntax/visit.rs index 4e6a8274a47..24b0c372471 100644 --- a/src/libsyntax/visit.rs +++ b/src/libsyntax/visit.rs @@ -714,7 +714,6 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { ExprKind::AddrOf(_, ref subexpression) | ExprKind::Unary(_, ref subexpression) => { visitor.visit_expr(subexpression) } - ExprKind::Lit(_) => {} ExprKind::Cast(ref subexpression, ref typ) | ExprKind::Type(ref subexpression, ref typ) => { visitor.visit_expr(subexpression); visitor.visit_ty(typ) @@ -826,7 +825,7 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { ExprKind::TryBlock(ref body) => { visitor.visit_block(body) } - ExprKind::Err => {} + ExprKind::Lit(_) | ExprKind::Err => {} } visitor.visit_expr_post(expression) |
