1
1
use crate :: errors;
2
2
use crate :: lexer:: unicode_chars:: UNICODE_ARRAY ;
3
+ use crate :: make_unclosed_delims_error;
3
4
use rustc_ast:: ast:: { self , AttrStyle } ;
4
5
use rustc_ast:: token:: { self , CommentKind , Delimiter , Token , TokenKind } ;
5
6
use rustc_ast:: tokenstream:: TokenStream ;
6
7
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 } ;
8
9
use rustc_lexer:: unescape:: { self , Mode } ;
9
10
use rustc_lexer:: Cursor ;
10
11
use rustc_lexer:: { Base , DocStyle , RawStrError } ;
@@ -44,7 +45,7 @@ pub(crate) fn parse_token_trees<'a>(
44
45
mut src : & ' a str ,
45
46
mut start_pos : BytePos ,
46
47
override_span : Option < Span > ,
47
- ) -> ( PResult < ' a , TokenStream > , Vec < UnmatchedDelim > ) {
48
+ ) -> Result < TokenStream , Vec < Diagnostic > > {
48
49
// Skip `#!`, if present.
49
50
if let Some ( shebang_len) = rustc_lexer:: strip_shebang ( src) {
50
51
src = & src[ shebang_len..] ;
@@ -61,7 +62,29 @@ pub(crate) fn parse_token_trees<'a>(
61
62
override_span,
62
63
nbsp_is_whitespace : false ,
63
64
} ;
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
+ }
65
88
}
66
89
67
90
struct StringReader < ' a > {
0 commit comments