11use crate :: errors;
22use crate :: lexer:: unicode_chars:: UNICODE_ARRAY ;
3+ use crate :: make_unclosed_delims_error;
34use rustc_ast:: ast:: { self , AttrStyle } ;
45use rustc_ast:: token:: { self , CommentKind , Delimiter , Token , TokenKind } ;
56use rustc_ast:: tokenstream:: TokenStream ;
67use 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 } ;
89use rustc_lexer:: unescape:: { self , Mode } ;
910use rustc_lexer:: Cursor ;
1011use 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
6790struct StringReader < ' a > {
0 commit comments