@@ -8,6 +8,8 @@ use super::diagnostics::{
8
8
} ;
9
9
use super :: { Lexer , UnmatchedDelim } ;
10
10
11
+ const UNCLOSED_DELIMITER_SHOW_LIMIT : usize = 5 ;
12
+
11
13
impl < ' psess , ' src > Lexer < ' psess , ' src > {
12
14
// Lex into a token stream. The `Spacing` in the result is that of the
13
15
// opening delimiter.
@@ -51,45 +53,6 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
51
53
}
52
54
}
53
55
54
- fn eof_err ( & mut self ) -> Diag < ' psess > {
55
- let msg = "this file contains an unclosed delimiter" ;
56
- let mut err = self . dcx ( ) . struct_span_err ( self . token . span , msg) ;
57
-
58
- let unclosed_delimiter_show_limit = 5 ;
59
- let len = usize:: min ( unclosed_delimiter_show_limit, self . diag_info . open_delimiters . len ( ) ) ;
60
- for & ( _, span) in & self . diag_info . open_delimiters [ ..len] {
61
- err. span_label ( span, "unclosed delimiter" ) ;
62
- self . diag_info . unmatched_delims . push ( UnmatchedDelim {
63
- found_delim : None ,
64
- found_span : self . token . span ,
65
- unclosed_span : Some ( span) ,
66
- candidate_span : None ,
67
- } ) ;
68
- }
69
-
70
- if let Some ( ( _, span) ) = self . diag_info . open_delimiters . get ( unclosed_delimiter_show_limit)
71
- && self . diag_info . open_delimiters . len ( ) >= unclosed_delimiter_show_limit + 2
72
- {
73
- err. span_label (
74
- * span,
75
- format ! (
76
- "another {} unclosed delimiters begin from here" ,
77
- self . diag_info. open_delimiters. len( ) - unclosed_delimiter_show_limit
78
- ) ,
79
- ) ;
80
- }
81
-
82
- if let Some ( ( delim, _) ) = self . diag_info . open_delimiters . last ( ) {
83
- report_suspicious_mismatch_block (
84
- & mut err,
85
- & self . diag_info ,
86
- self . psess . source_map ( ) ,
87
- * delim,
88
- )
89
- }
90
- err
91
- }
92
-
93
56
fn lex_token_tree_open_delim (
94
57
& mut self ,
95
58
open_delim : Delimiter ,
@@ -206,13 +169,7 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
206
169
} else if let Some ( glued) = self . token . glue ( & next_tok) {
207
170
self . token = glued;
208
171
} else {
209
- let this_spacing = if next_tok. is_punct ( ) {
210
- Spacing :: Joint
211
- } else if next_tok == token:: Eof {
212
- Spacing :: Alone
213
- } else {
214
- Spacing :: JointHidden
215
- } ;
172
+ let this_spacing = self . calculate_spacing ( & next_tok) ;
216
173
break ( this_spacing, next_tok) ;
217
174
}
218
175
} ;
@@ -223,23 +180,63 @@ impl<'psess, 'src> Lexer<'psess, 'src> {
223
180
// Cut-down version of `bump` used when the token kind is known in advance.
224
181
fn bump_minimal ( & mut self ) -> Spacing {
225
182
let ( next_tok, is_next_tok_preceded_by_whitespace) = self . next_token_from_cursor ( ) ;
226
-
227
183
let this_spacing = if is_next_tok_preceded_by_whitespace {
228
184
Spacing :: Alone
229
185
} else {
230
- if next_tok. is_punct ( ) {
231
- Spacing :: Joint
232
- } else if next_tok == token:: Eof {
233
- Spacing :: Alone
234
- } else {
235
- Spacing :: JointHidden
236
- }
186
+ self . calculate_spacing ( & next_tok)
237
187
} ;
238
-
239
188
self . token = next_tok;
240
189
this_spacing
241
190
}
242
191
192
+ fn calculate_spacing ( & self , next_tok : & Token ) -> Spacing {
193
+ if next_tok. is_punct ( ) {
194
+ Spacing :: Joint
195
+ } else if * next_tok == token:: Eof {
196
+ Spacing :: Alone
197
+ } else {
198
+ Spacing :: JointHidden
199
+ }
200
+ }
201
+
202
+ fn eof_err ( & mut self ) -> Diag < ' psess > {
203
+ let msg = "this file contains an unclosed delimiter" ;
204
+ let mut err = self . dcx ( ) . struct_span_err ( self . token . span , msg) ;
205
+
206
+ let len = usize:: min ( UNCLOSED_DELIMITER_SHOW_LIMIT , self . diag_info . open_delimiters . len ( ) ) ;
207
+ for & ( _, span) in & self . diag_info . open_delimiters [ ..len] {
208
+ err. span_label ( span, "unclosed delimiter" ) ;
209
+ self . diag_info . unmatched_delims . push ( UnmatchedDelim {
210
+ found_delim : None ,
211
+ found_span : self . token . span ,
212
+ unclosed_span : Some ( span) ,
213
+ candidate_span : None ,
214
+ } ) ;
215
+ }
216
+
217
+ if let Some ( ( _, span) ) = self . diag_info . open_delimiters . get ( UNCLOSED_DELIMITER_SHOW_LIMIT )
218
+ && self . diag_info . open_delimiters . len ( ) >= UNCLOSED_DELIMITER_SHOW_LIMIT + 2
219
+ {
220
+ err. span_label (
221
+ * span,
222
+ format ! (
223
+ "another {} unclosed delimiters begin from here" ,
224
+ self . diag_info. open_delimiters. len( ) - UNCLOSED_DELIMITER_SHOW_LIMIT
225
+ ) ,
226
+ ) ;
227
+ }
228
+
229
+ if let Some ( ( delim, _) ) = self . diag_info . open_delimiters . last ( ) {
230
+ report_suspicious_mismatch_block (
231
+ & mut err,
232
+ & self . diag_info ,
233
+ self . psess . source_map ( ) ,
234
+ * delim,
235
+ )
236
+ }
237
+ err
238
+ }
239
+
243
240
fn close_delim_err ( & mut self , delim : Delimiter ) -> Diag < ' psess > {
244
241
// An unexpected closing delimiter (i.e., there is no matching opening delimiter).
245
242
let token_str = token_to_string ( & self . token ) ;
0 commit comments