Skip to content

Commit 332c577

Browse files
committed
Make emit_unescape_error return Option<ErrorGuaranteed>.
And use the result in `cook_common` to decide whether to return an error token.
1 parent a513bb2 commit 332c577

File tree

2 files changed

+34
-40
lines changed

2 files changed

+34
-40
lines changed

Diff for: compiler/rustc_parse/src/lexer/mod.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -691,15 +691,14 @@ impl<'sess, 'src> StringReader<'sess, 'src> {
691691

692692
fn cook_common(
693693
&self,
694-
kind: token::LitKind,
694+
mut kind: token::LitKind,
695695
mode: Mode,
696696
start: BytePos,
697697
end: BytePos,
698698
prefix_len: u32,
699699
postfix_len: u32,
700700
unescape: fn(&str, Mode, &mut dyn FnMut(Range<usize>, Result<(), EscapeError>)),
701701
) -> (token::LitKind, Symbol) {
702-
let mut has_fatal_err = false;
703702
let content_start = start + BytePos(prefix_len);
704703
let content_end = end - BytePos(postfix_len);
705704
let lit_content = self.str_from_to(content_start, content_end);
@@ -711,24 +710,25 @@ impl<'sess, 'src> StringReader<'sess, 'src> {
711710
let lo = content_start + BytePos(start);
712711
let hi = lo + BytePos(end - start);
713712
let span = self.mk_sp(lo, hi);
714-
if err.is_fatal() {
715-
has_fatal_err = true;
716-
}
717-
emit_unescape_error(
713+
let is_fatal = err.is_fatal();
714+
if let Some(_guar) = emit_unescape_error(
718715
self.dcx(),
719716
lit_content,
720717
span_with_quotes,
721718
span,
722719
mode,
723720
range,
724721
err,
725-
);
722+
) {
723+
assert!(is_fatal);
724+
kind = token::Err;
725+
}
726726
}
727727
});
728728

729729
// We normally exclude the quotes for the symbol, but for errors we
730730
// include it because it results in clearer error messages.
731-
if !has_fatal_err {
731+
if kind != token::Err {
732732
(kind, Symbol::intern(lit_content))
733733
} else {
734734
(token::Err, self.symbol_from_to(start, end))

Diff for: compiler/rustc_parse/src/lexer/unescape_error_reporting.rs

+26-32
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::iter::once;
44
use std::ops::Range;
55

6-
use rustc_errors::{Applicability, DiagCtxt};
6+
use rustc_errors::{Applicability, DiagCtxt, ErrorGuaranteed};
77
use rustc_lexer::unescape::{EscapeError, Mode};
88
use rustc_span::{BytePos, Span};
99

@@ -21,7 +21,7 @@ pub(crate) fn emit_unescape_error(
2121
// range of the error inside `lit`
2222
range: Range<usize>,
2323
error: EscapeError,
24-
) {
24+
) -> Option<ErrorGuaranteed> {
2525
debug!(
2626
"emit_unescape_error: {:?}, {:?}, {:?}, {:?}, {:?}",
2727
lit, full_lit_span, mode, range, error
@@ -31,12 +31,12 @@ pub(crate) fn emit_unescape_error(
3131
let span = err_span.with_lo(err_span.hi() - BytePos(c.len_utf8() as u32));
3232
(c, span)
3333
};
34-
match error {
34+
Some(match error {
3535
EscapeError::LoneSurrogateUnicodeEscape => {
36-
dcx.emit_err(UnescapeError::InvalidUnicodeEscape { span: err_span, surrogate: true });
36+
dcx.emit_err(UnescapeError::InvalidUnicodeEscape { span: err_span, surrogate: true })
3737
}
3838
EscapeError::OutOfRangeUnicodeEscape => {
39-
dcx.emit_err(UnescapeError::InvalidUnicodeEscape { span: err_span, surrogate: false });
39+
dcx.emit_err(UnescapeError::InvalidUnicodeEscape { span: err_span, surrogate: false })
4040
}
4141
EscapeError::MoreThanOneChar => {
4242
use unicode_normalization::{char::is_combining_mark, UnicodeNormalization};
@@ -106,7 +106,7 @@ pub(crate) fn emit_unescape_error(
106106
span: full_lit_span,
107107
note,
108108
suggestion: sugg,
109-
});
109+
})
110110
}
111111
EscapeError::EscapeOnlyChar => {
112112
let (c, char_span) = last_char();
@@ -116,15 +116,15 @@ pub(crate) fn emit_unescape_error(
116116
escaped_sugg: c.escape_default().to_string(),
117117
escaped_msg: escaped_char(c),
118118
byte: mode == Mode::Byte,
119-
});
119+
})
120120
}
121121
EscapeError::BareCarriageReturn => {
122122
let double_quotes = mode.in_double_quotes();
123-
dcx.emit_err(UnescapeError::BareCr { span: err_span, double_quotes });
123+
dcx.emit_err(UnescapeError::BareCr { span: err_span, double_quotes })
124124
}
125125
EscapeError::BareCarriageReturnInRawString => {
126126
assert!(mode.in_double_quotes());
127-
dcx.emit_err(UnescapeError::BareCrRawString(err_span));
127+
dcx.emit_err(UnescapeError::BareCrRawString(err_span))
128128
}
129129
EscapeError::InvalidEscape => {
130130
let (c, span) = last_char();
@@ -161,16 +161,14 @@ pub(crate) fn emit_unescape_error(
161161
<https://doc.rust-lang.org/reference/tokens.html#literals>",
162162
);
163163
}
164-
diag.emit();
165-
}
166-
EscapeError::TooShortHexEscape => {
167-
dcx.emit_err(UnescapeError::TooShortHexEscape(err_span));
164+
diag.emit()
168165
}
166+
EscapeError::TooShortHexEscape => dcx.emit_err(UnescapeError::TooShortHexEscape(err_span)),
169167
EscapeError::InvalidCharInHexEscape | EscapeError::InvalidCharInUnicodeEscape => {
170168
let (c, span) = last_char();
171169
let is_hex = error == EscapeError::InvalidCharInHexEscape;
172170
let ch = escaped_char(c);
173-
dcx.emit_err(UnescapeError::InvalidCharInEscape { span, is_hex, ch });
171+
dcx.emit_err(UnescapeError::InvalidCharInEscape { span, is_hex, ch })
174172
}
175173
EscapeError::NonAsciiCharInByte => {
176174
let (c, span) = last_char();
@@ -213,23 +211,23 @@ pub(crate) fn emit_unescape_error(
213211
Applicability::MaybeIncorrect,
214212
);
215213
}
216-
err.emit();
214+
err.emit()
217215
}
218216
EscapeError::OutOfRangeHexEscape => {
219-
dcx.emit_err(UnescapeError::OutOfRangeHexEscape(err_span));
217+
dcx.emit_err(UnescapeError::OutOfRangeHexEscape(err_span))
220218
}
221219
EscapeError::LeadingUnderscoreUnicodeEscape => {
222220
let (c, span) = last_char();
223221
dcx.emit_err(UnescapeError::LeadingUnderscoreUnicodeEscape {
224222
span,
225223
ch: escaped_char(c),
226-
});
224+
})
227225
}
228226
EscapeError::OverlongUnicodeEscape => {
229-
dcx.emit_err(UnescapeError::OverlongUnicodeEscape(err_span));
227+
dcx.emit_err(UnescapeError::OverlongUnicodeEscape(err_span))
230228
}
231229
EscapeError::UnclosedUnicodeEscape => {
232-
dcx.emit_err(UnescapeError::UnclosedUnicodeEscape(err_span, err_span.shrink_to_hi()));
230+
dcx.emit_err(UnescapeError::UnclosedUnicodeEscape(err_span, err_span.shrink_to_hi()))
233231
}
234232
EscapeError::NoBraceInUnicodeEscape => {
235233
let mut suggestion = "\\u{".to_owned();
@@ -248,35 +246,31 @@ pub(crate) fn emit_unescape_error(
248246
} else {
249247
(Some(err_span), NoBraceUnicodeSub::Help)
250248
};
251-
dcx.emit_err(UnescapeError::NoBraceInUnicodeEscape { span: err_span, label, sub });
249+
dcx.emit_err(UnescapeError::NoBraceInUnicodeEscape { span: err_span, label, sub })
252250
}
253251
EscapeError::UnicodeEscapeInByte => {
254-
dcx.emit_err(UnescapeError::UnicodeEscapeInByte(err_span));
252+
dcx.emit_err(UnescapeError::UnicodeEscapeInByte(err_span))
255253
}
256254
EscapeError::EmptyUnicodeEscape => {
257-
dcx.emit_err(UnescapeError::EmptyUnicodeEscape(err_span));
258-
}
259-
EscapeError::ZeroChars => {
260-
dcx.emit_err(UnescapeError::ZeroChars(err_span));
261-
}
262-
EscapeError::LoneSlash => {
263-
dcx.emit_err(UnescapeError::LoneSlash(err_span));
264-
}
265-
EscapeError::NulInCStr => {
266-
dcx.emit_err(UnescapeError::NulInCStr { span: err_span });
255+
dcx.emit_err(UnescapeError::EmptyUnicodeEscape(err_span))
267256
}
257+
EscapeError::ZeroChars => dcx.emit_err(UnescapeError::ZeroChars(err_span)),
258+
EscapeError::LoneSlash => dcx.emit_err(UnescapeError::LoneSlash(err_span)),
259+
EscapeError::NulInCStr => dcx.emit_err(UnescapeError::NulInCStr { span: err_span }),
268260
EscapeError::UnskippedWhitespaceWarning => {
269261
let (c, char_span) = last_char();
270262
dcx.emit_warn(UnescapeError::UnskippedWhitespace {
271263
span: err_span,
272264
ch: escaped_char(c),
273265
char_span,
274266
});
267+
return None;
275268
}
276269
EscapeError::MultipleSkippedLinesWarning => {
277270
dcx.emit_warn(UnescapeError::MultipleSkippedLinesWarning(err_span));
271+
return None;
278272
}
279-
}
273+
})
280274
}
281275

282276
/// Pushes a character to a message string for error reporting

0 commit comments

Comments
 (0)