Skip to content

Commit f808877

Browse files
committed
refactor parse_token_trees to not return unmatched_delims
1 parent 88de2e1 commit f808877

File tree

4 files changed

+29
-30
lines changed

4 files changed

+29
-30
lines changed

compiler/rustc_parse/src/lexer/mod.rs

+26-3
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
use crate::errors;
22
use crate::lexer::unicode_chars::UNICODE_ARRAY;
3+
use crate::make_unclosed_delims_error;
34
use rustc_ast::ast::{self, AttrStyle};
45
use rustc_ast::token::{self, CommentKind, Delimiter, Token, TokenKind};
56
use rustc_ast::tokenstream::TokenStream;
67
use rustc_ast::util::unicode::contains_text_flow_control_chars;
7-
use rustc_errors::{error_code, Applicability, DiagnosticBuilder, PResult, StashKey};
8+
use rustc_errors::{error_code, Applicability, Diagnostic, DiagnosticBuilder, StashKey};
89
use rustc_lexer::unescape::{self, Mode};
910
use rustc_lexer::Cursor;
1011
use rustc_lexer::{Base, DocStyle, RawStrError};
@@ -44,7 +45,7 @@ pub(crate) fn parse_token_trees<'a>(
4445
mut src: &'a str,
4546
mut start_pos: BytePos,
4647
override_span: Option<Span>,
47-
) -> (PResult<'a, TokenStream>, Vec<UnmatchedDelim>) {
48+
) -> Result<TokenStream, Vec<Diagnostic>> {
4849
// Skip `#!`, if present.
4950
if let Some(shebang_len) = rustc_lexer::strip_shebang(src) {
5051
src = &src[shebang_len..];
@@ -61,7 +62,29 @@ pub(crate) fn parse_token_trees<'a>(
6162
override_span,
6263
nbsp_is_whitespace: false,
6364
};
64-
tokentrees::TokenTreesReader::parse_all_token_trees(string_reader)
65+
let (token_trees, unmatched_delims) =
66+
tokentrees::TokenTreesReader::parse_all_token_trees(string_reader);
67+
match token_trees {
68+
Ok(stream) if unmatched_delims.is_empty() => Ok(stream),
69+
_ => {
70+
// Return error if there are unmatched delimiters or unclosng delimiters.
71+
// We emit delimiter mismatch errors first, then emit the unclosing delimiter mismatch
72+
// because the delimiter mismatch is more likely to be the root cause of error
73+
74+
let mut buffer = Vec::with_capacity(1);
75+
// Not using `emit_unclosed_delims` to use `db.buffer`
76+
for unmatched in unmatched_delims {
77+
if let Some(err) = make_unclosed_delims_error(unmatched, &sess) {
78+
err.buffer(&mut buffer);
79+
}
80+
}
81+
if let Err(err) = token_trees {
82+
// Add unclosing delimiter error
83+
err.buffer(&mut buffer);
84+
}
85+
Err(buffer)
86+
}
87+
}
6588
}
6689

6790
struct StringReader<'a> {

compiler/rustc_parse/src/lexer/tokentrees.rs

-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,6 @@ impl<'a> TokenTreesReader<'a> {
161161
}
162162
}
163163
let (tok, _) = self.diag_info.open_braces.pop().unwrap();
164-
debug!("anan now: open {:#?} close {:#?}", open_delim, close_delim);
165164
self.diag_info.unmatched_delims.push(UnmatchedDelim {
166165
expected_delim: tok,
167166
found_delim: Some(close_delim),

compiler/rustc_parse/src/lib.rs

+1-24
Original file line numberDiff line numberDiff line change
@@ -196,30 +196,7 @@ pub fn maybe_file_to_stream(
196196
));
197197
});
198198

199-
let (token_trees, unmatched_delims) =
200-
lexer::parse_token_trees(sess, src.as_str(), source_file.start_pos, override_span);
201-
202-
match token_trees {
203-
Ok(stream) if unmatched_delims.is_empty() => Ok(stream),
204-
_ => {
205-
// Return error if there are unmatched delimiters or unclosng delimiters.
206-
// We emit delimiter mismatch errors first, then emit the unclosing delimiter mismatch
207-
// because the delimiter mismatch is more likely to be the root cause of the
208-
209-
let mut buffer = Vec::with_capacity(1);
210-
// Not using `emit_unclosed_delims` to use `db.buffer`
211-
for unmatched in unmatched_delims {
212-
if let Some(err) = make_unclosed_delims_error(unmatched, &sess) {
213-
err.buffer(&mut buffer);
214-
}
215-
}
216-
if let Err(err) = token_trees {
217-
// Add unclosing delimiter error
218-
err.buffer(&mut buffer);
219-
}
220-
Err(buffer)
221-
}
222-
}
199+
lexer::parse_token_trees(sess, src.as_str(), source_file.start_pos, override_span)
223200
}
224201

225202
/// Given a stream and the `ParseSess`, produces a parser.

compiler/rustc_parse/src/parser/diagnostics.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ use crate::errors::{
1919
};
2020

2121
use crate::fluent_generated as fluent;
22-
use rustc_ast as ast;
23-
use crate::parser;
2422
use crate::lexer::UnmatchedDelim;
23+
use crate::parser;
24+
use rustc_ast as ast;
2525
use rustc_ast::ptr::P;
2626
use rustc_ast::token::{self, Delimiter, Lit, LitKind, TokenKind};
2727
use rustc_ast::util::parser::AssocOp;

0 commit comments

Comments
 (0)