Point at unclosed delimiters as part of the primary MultiSpan
Both the place where the parser encounters a needed closed delimiter and the unclosed opening delimiter are important, so they should get the same level of highlighting in the output.
This commit is contained in:
parent
4a6547cca6
commit
c6d800d854
21 changed files with 82 additions and 67 deletions
|
@ -1432,12 +1432,22 @@ impl<'a> Parser<'a> {
|
|||
// the most sense, which is immediately after the last token:
|
||||
//
|
||||
// {foo(bar {}}
|
||||
// - ^
|
||||
// ^ ^
|
||||
// | |
|
||||
// | help: `)` may belong here
|
||||
// |
|
||||
// unclosed delimiter
|
||||
if let Some(sp) = unmatched.unclosed_span {
|
||||
let mut primary_span: Vec<Span> =
|
||||
err.span.primary_spans().iter().cloned().collect();
|
||||
primary_span.push(sp);
|
||||
let mut primary_span: MultiSpan = primary_span.into();
|
||||
for span_label in err.span.span_labels() {
|
||||
if let Some(label) = span_label.label {
|
||||
primary_span.push_span_label(span_label.span, label);
|
||||
}
|
||||
}
|
||||
err.set_span(primary_span);
|
||||
err.span_label(sp, "unclosed delimiter");
|
||||
}
|
||||
// Backticks should be removed to apply suggestions.
|
||||
|
|
|
@ -33,7 +33,7 @@ use rustc_data_structures::sync::Lrc;
|
|||
use rustc_errors::PResult;
|
||||
use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, FatalError};
|
||||
use rustc_session::parse::ParseSess;
|
||||
use rustc_span::source_map::{Span, DUMMY_SP};
|
||||
use rustc_span::source_map::{MultiSpan, Span, DUMMY_SP};
|
||||
use rustc_span::symbol::{kw, sym, Ident, Symbol};
|
||||
use tracing::debug;
|
||||
|
||||
|
@ -1335,8 +1335,13 @@ crate fn make_unclosed_delims_error(
|
|||
// `None` here means an `Eof` was found. We already emit those errors elsewhere, we add them to
|
||||
// `unmatched_braces` only for error recovery in the `Parser`.
|
||||
let found_delim = unmatched.found_delim?;
|
||||
let span: MultiSpan = if let Some(sp) = unmatched.unclosed_span {
|
||||
vec![unmatched.found_span, sp].into()
|
||||
} else {
|
||||
unmatched.found_span.into()
|
||||
};
|
||||
let mut err = sess.span_diagnostic.struct_span_err(
|
||||
unmatched.found_span,
|
||||
span,
|
||||
&format!(
|
||||
"mismatched closing delimiter: `{}`",
|
||||
pprust::token_kind_to_string(&token::CloseDelim(found_delim)),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue