Skip to content

Commit 3280bc2

Browse files
authored
Unrolled build for rust-lang#140147
Rollup merge of rust-lang#140147 - xizheyin:issue-138401-1, r=compiler-errors Clean: rename `open_braces` to `open_delimiters` in lexer and move `make_unclosed_delims_error` into `diagnostics.rs`. Clean code prepared for resolving rust-lang#138401. To avoid having too many extraneous changes in one PR, I cleaned up some of the naming and method placement in lexer in this PR. 1. For the make_unclosed_delims_error function defined in mod.rs is only used in lexer, so moved into lexer, which enhances encapsulation. 2. For open_braces in TokenTreeDiagInfo the naming is not canonical, as Brace refers to `{...} ` and this variable can store all kinds of different Delimiters. so I named it open_delimiters. r? `@chenyukang`
2 parents be181dd + dce5d99 commit 3280bc2

File tree

5 files changed

+54
-50
lines changed

5 files changed

+54
-50
lines changed

compiler/rustc_parse/src/lexer/diagnostics.rs

+26-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
11
use rustc_ast::token::Delimiter;
22
use rustc_errors::Diag;
3+
use rustc_session::parse::ParseSess;
34
use rustc_span::Span;
45
use rustc_span::source_map::SourceMap;
56

67
use super::UnmatchedDelim;
8+
use crate::errors::MismatchedClosingDelimiter;
9+
use crate::pprust;
710

811
#[derive(Default)]
912
pub(super) struct TokenTreeDiagInfo {
1013
/// Stack of open delimiters and their spans. Used for error message.
11-
pub open_braces: Vec<(Delimiter, Span)>,
14+
pub open_delimiters: Vec<(Delimiter, Span)>,
1215
pub unmatched_delims: Vec<UnmatchedDelim>,
1316

1417
/// Used only for error recovery when arriving to EOF with mismatched braces.
@@ -108,11 +111,32 @@ pub(super) fn report_suspicious_mismatch_block(
108111
} else {
109112
// If there is no suspicious span, give the last properly closed block may help
110113
if let Some(parent) = diag_info.matching_block_spans.last()
111-
&& diag_info.open_braces.last().is_none()
114+
&& diag_info.open_delimiters.last().is_none()
112115
&& diag_info.empty_block_spans.iter().all(|&sp| sp != parent.0.to(parent.1))
113116
{
114117
err.span_label(parent.0, "this opening brace...");
115118
err.span_label(parent.1, "...matches this closing brace");
116119
}
117120
}
118121
}
122+
123+
pub(crate) fn make_unclosed_delims_error(
124+
unmatched: UnmatchedDelim,
125+
psess: &ParseSess,
126+
) -> Option<Diag<'_>> {
127+
// `None` here means an `Eof` was found. We already emit those errors elsewhere, we add them to
128+
// `unmatched_delims` only for error recovery in the `Parser`.
129+
let found_delim = unmatched.found_delim?;
130+
let mut spans = vec![unmatched.found_span];
131+
if let Some(sp) = unmatched.unclosed_span {
132+
spans.push(sp);
133+
};
134+
let err = psess.dcx().create_err(MismatchedClosingDelimiter {
135+
spans,
136+
delimiter: pprust::token_kind_to_string(&found_delim.as_close_token_kind()).to_string(),
137+
unmatched: unmatched.found_span,
138+
opening_candidate: unmatched.candidate_span,
139+
unclosed: unmatched.unclosed_span,
140+
});
141+
Some(err)
142+
}

compiler/rustc_parse/src/lexer/mod.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::ops::Range;
22

3+
use diagnostics::make_unclosed_delims_error;
34
use rustc_ast::ast::{self, AttrStyle};
45
use rustc_ast::token::{self, CommentKind, Delimiter, IdentIsRaw, Token, TokenKind};
56
use rustc_ast::tokenstream::TokenStream;
@@ -17,9 +18,9 @@ use rustc_session::parse::ParseSess;
1718
use rustc_span::{BytePos, Pos, Span, Symbol};
1819
use tracing::debug;
1920

21+
use crate::errors;
2022
use crate::lexer::diagnostics::TokenTreeDiagInfo;
2123
use crate::lexer::unicode_chars::UNICODE_ARRAY;
22-
use crate::{errors, make_unclosed_delims_error};
2324

2425
mod diagnostics;
2526
mod tokentrees;

compiler/rustc_parse/src/lexer/tokentrees.rs

+24-21
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
5454
let mut err = self.dcx().struct_span_err(self.token.span, msg);
5555

5656
let unclosed_delimiter_show_limit = 5;
57-
let len = usize::min(unclosed_delimiter_show_limit, self.diag_info.open_braces.len());
58-
for &(_, span) in &self.diag_info.open_braces[..len] {
57+
let len = usize::min(unclosed_delimiter_show_limit, self.diag_info.open_delimiters.len());
58+
for &(_, span) in &self.diag_info.open_delimiters[..len] {
5959
err.span_label(span, "unclosed delimiter");
6060
self.diag_info.unmatched_delims.push(UnmatchedDelim {
6161
found_delim: None,
@@ -65,19 +65,19 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
6565
});
6666
}
6767

68-
if let Some((_, span)) = self.diag_info.open_braces.get(unclosed_delimiter_show_limit)
69-
&& self.diag_info.open_braces.len() >= unclosed_delimiter_show_limit + 2
68+
if let Some((_, span)) = self.diag_info.open_delimiters.get(unclosed_delimiter_show_limit)
69+
&& self.diag_info.open_delimiters.len() >= unclosed_delimiter_show_limit + 2
7070
{
7171
err.span_label(
7272
*span,
7373
format!(
7474
"another {} unclosed delimiters begin from here",
75-
self.diag_info.open_braces.len() - unclosed_delimiter_show_limit
75+
self.diag_info.open_delimiters.len() - unclosed_delimiter_show_limit
7676
),
7777
);
7878
}
7979

80-
if let Some((delim, _)) = self.diag_info.open_braces.last() {
80+
if let Some((delim, _)) = self.diag_info.open_delimiters.last() {
8181
report_suspicious_mismatch_block(
8282
&mut err,
8383
&self.diag_info,
@@ -95,7 +95,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
9595
// The span for beginning of the delimited section.
9696
let pre_span = self.token.span;
9797

98-
self.diag_info.open_braces.push((open_delim, self.token.span));
98+
self.diag_info.open_delimiters.push((open_delim, self.token.span));
9999

100100
// Lex the token trees within the delimiters.
101101
// We stop at any delimiter so we can try to recover if the user
@@ -109,11 +109,12 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
109109
let close_spacing = if let Some(close_delim) = self.token.kind.close_delim() {
110110
if close_delim == open_delim {
111111
// Correct delimiter.
112-
let (open_brace, open_brace_span) = self.diag_info.open_braces.pop().unwrap();
113-
let close_brace_span = self.token.span;
112+
let (open_delimiter, open_delimiter_span) =
113+
self.diag_info.open_delimiters.pop().unwrap();
114+
let close_delimiter_span = self.token.span;
114115

115116
if tts.is_empty() && close_delim == Delimiter::Brace {
116-
let empty_block_span = open_brace_span.to(close_brace_span);
117+
let empty_block_span = open_delimiter_span.to(close_delimiter_span);
117118
if !sm.is_multiline(empty_block_span) {
118119
// Only track if the block is in the form of `{}`, otherwise it is
119120
// likely that it was written on purpose.
@@ -122,9 +123,11 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
122123
}
123124

124125
// only add braces
125-
if let (Delimiter::Brace, Delimiter::Brace) = (open_brace, open_delim) {
126+
if let (Delimiter::Brace, Delimiter::Brace) = (open_delimiter, open_delim) {
126127
// Add all the matching spans, we will sort by span later
127-
self.diag_info.matching_block_spans.push((open_brace_span, close_brace_span));
128+
self.diag_info
129+
.matching_block_spans
130+
.push((open_delimiter_span, close_delimiter_span));
128131
}
129132

130133
// Move past the closing delimiter.
@@ -140,26 +143,26 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
140143
// This is a conservative error: only report the last unclosed
141144
// delimiter. The previous unclosed delimiters could actually be
142145
// closed! The lexer just hasn't gotten to them yet.
143-
if let Some(&(_, sp)) = self.diag_info.open_braces.last() {
146+
if let Some(&(_, sp)) = self.diag_info.open_delimiters.last() {
144147
unclosed_delimiter = Some(sp);
145148
};
146-
for (brace, brace_span) in &self.diag_info.open_braces {
147-
if same_indentation_level(sm, self.token.span, *brace_span)
148-
&& brace == &close_delim
149+
for (delimiter, delimiter_span) in &self.diag_info.open_delimiters {
150+
if same_indentation_level(sm, self.token.span, *delimiter_span)
151+
&& delimiter == &close_delim
149152
{
150153
// high likelihood of these two corresponding
151-
candidate = Some(*brace_span);
154+
candidate = Some(*delimiter_span);
152155
}
153156
}
154-
let (_, _) = self.diag_info.open_braces.pop().unwrap();
157+
let (_, _) = self.diag_info.open_delimiters.pop().unwrap();
155158
self.diag_info.unmatched_delims.push(UnmatchedDelim {
156159
found_delim: Some(close_delim),
157160
found_span: self.token.span,
158161
unclosed_span: unclosed_delimiter,
159162
candidate_span: candidate,
160163
});
161164
} else {
162-
self.diag_info.open_braces.pop();
165+
self.diag_info.open_delimiters.pop();
163166
}
164167

165168
// If the incorrect delimiter matches an earlier opening
@@ -169,7 +172,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
169172
// fn foo() {
170173
// bar(baz(
171174
// } // Incorrect delimiter but matches the earlier `{`
172-
if !self.diag_info.open_braces.iter().any(|&(b, _)| b == close_delim) {
175+
if !self.diag_info.open_delimiters.iter().any(|&(d, _)| d == close_delim) {
173176
self.bump_minimal()
174177
} else {
175178
// The choice of value here doesn't matter.
@@ -180,7 +183,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
180183
assert_eq!(self.token.kind, token::Eof);
181184
// Silently recover, the EOF token will be seen again
182185
// and an error emitted then. Thus we don't pop from
183-
// self.open_braces here. The choice of spacing value here
186+
// self.open_delimiters here. The choice of spacing value here
184187
// doesn't matter.
185188
Spacing::Alone
186189
};

compiler/rustc_parse/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ pub const MACRO_ARGUMENTS: Option<&str> = Some("macro arguments");
3232

3333
#[macro_use]
3434
pub mod parser;
35-
use parser::{Parser, make_unclosed_delims_error};
35+
use parser::Parser;
3636
pub mod lexer;
3737
pub mod validate_attr;
3838

compiler/rustc_parse/src/parser/mod.rs

+1-25
Original file line numberDiff line numberDiff line change
@@ -43,11 +43,8 @@ use token_type::TokenTypeSet;
4343
pub use token_type::{ExpKeywordPair, ExpTokenPair, TokenType};
4444
use tracing::debug;
4545

46-
use crate::errors::{
47-
self, IncorrectVisibilityRestriction, MismatchedClosingDelimiter, NonStringAbiLiteral,
48-
};
46+
use crate::errors::{self, IncorrectVisibilityRestriction, NonStringAbiLiteral};
4947
use crate::exp;
50-
use crate::lexer::UnmatchedDelim;
5148

5249
#[cfg(test)]
5350
mod tests;
@@ -1745,27 +1742,6 @@ impl<'a> Parser<'a> {
17451742
}
17461743
}
17471744

1748-
pub(crate) fn make_unclosed_delims_error(
1749-
unmatched: UnmatchedDelim,
1750-
psess: &ParseSess,
1751-
) -> Option<Diag<'_>> {
1752-
// `None` here means an `Eof` was found. We already emit those errors elsewhere, we add them to
1753-
// `unmatched_delims` only for error recovery in the `Parser`.
1754-
let found_delim = unmatched.found_delim?;
1755-
let mut spans = vec![unmatched.found_span];
1756-
if let Some(sp) = unmatched.unclosed_span {
1757-
spans.push(sp);
1758-
};
1759-
let err = psess.dcx().create_err(MismatchedClosingDelimiter {
1760-
spans,
1761-
delimiter: pprust::token_kind_to_string(&found_delim.as_close_token_kind()).to_string(),
1762-
unmatched: unmatched.found_span,
1763-
opening_candidate: unmatched.candidate_span,
1764-
unclosed: unmatched.unclosed_span,
1765-
});
1766-
Some(err)
1767-
}
1768-
17691745
/// A helper struct used when building an `AttrTokenStream` from
17701746
/// a `LazyAttrTokenStream`. Both delimiter and non-delimited tokens
17711747
/// are stored as `FlatToken::Token`. A vector of `FlatToken`s

0 commit comments

Comments
 (0)