@@ -276,7 +276,8 @@ impl<'a> Visitor<'a> {
276
276
277
277
fn record_parse_error_for_node (
278
278
& mut self ,
279
- error_message : String ,
279
+ message : & str ,
280
+ args : & [ & str ] ,
280
281
node : Node ,
281
282
status_page : bool ,
282
283
) {
@@ -291,26 +292,31 @@ impl<'a> Visitor<'a> {
291
292
) ;
292
293
let mut mesg = self
293
294
. diagnostics_writer
294
- . message ( "parse-error" , "Parse error" ) ;
295
- & mesg. severity ( diagnostics:: Severity :: Error )
295
+ . new_entry ( "parse-error" , "Parse error" ) ;
296
+ & mesg
297
+ . severity ( diagnostics:: Severity :: Error )
296
298
. location ( self . path , start_line, start_column, end_line, end_column)
297
- . text ( & error_message ) ;
299
+ . message ( message , args ) ;
298
300
if status_page {
299
301
& mesg. status_page ( ) ;
300
302
}
301
303
self . record_parse_error ( loc, & mesg) ;
302
304
}
303
305
304
306
fn enter_node ( & mut self , node : Node ) -> bool {
305
- if node. is_error ( ) || node . is_missing ( ) {
306
- let error_message = if node . is_missing ( ) {
307
- format ! ( "parse error: expecting '{}'" , node . kind ( ) )
308
- } else {
309
- "parse error" . to_string ( )
310
- } ;
311
- self . record_parse_error_for_node ( error_message , node , true ) ;
307
+ if node. is_missing ( ) {
308
+ self . record_parse_error_for_node (
309
+ "parse error: expecting {}" ,
310
+ & [ node . kind ( ) ] ,
311
+ node ,
312
+ true ,
313
+ ) ;
312
314
return false ;
313
315
}
316
+ if node. is_error ( ) {
317
+ self . record_parse_error_for_node ( "parse error" , & [ ] , node, true ) ;
318
+ return false ;
319
+ } ;
314
320
315
321
let id = self . trap_writer . fresh_id ( ) ;
316
322
@@ -390,14 +396,13 @@ impl<'a> Visitor<'a> {
390
396
}
391
397
}
392
398
_ => {
393
- let error_message = format ! ( "unknown table type: '{}'" , node. kind( ) ) ;
394
399
self . record_parse_error (
395
400
loc,
396
401
self . diagnostics_writer
397
- . message ( "parse-error" , "Parse error" )
402
+ . new_entry ( "parse-error" , "Parse error" )
398
403
. severity ( diagnostics:: Severity :: Error )
399
404
. location ( self . path , start_line, start_column, end_line, end_column)
400
- . text ( & error_message ) ,
405
+ . message ( "unknown table type: {}" , & [ node . kind ( ) ] ) ,
401
406
) ;
402
407
403
408
valid = false ;
@@ -445,23 +450,29 @@ impl<'a> Visitor<'a> {
445
450
values. push ( trap:: Arg :: Label ( child_node. label ) ) ;
446
451
}
447
452
} else if field. name . is_some ( ) {
448
- let error_message = format ! (
449
- "type mismatch for field {}::{} with type {:?} != {:?}" ,
450
- node. kind( ) ,
451
- child_node. field_name. unwrap_or( "child" ) ,
452
- child_node. type_name,
453
- field. type_info
453
+ self . record_parse_error_for_node (
454
+ "type mismatch for field {}::{} with type {} != {}" ,
455
+ & [
456
+ node. kind ( ) ,
457
+ child_node. field_name . unwrap_or ( "child" ) ,
458
+ & format ! ( "{:?}" , child_node. type_name) ,
459
+ & format ! ( "{:?}" , field. type_info) ,
460
+ ] ,
461
+ * node,
462
+ false ,
454
463
) ;
455
- self . record_parse_error_for_node ( error_message, * node, false ) ;
456
464
}
457
465
} else if child_node. field_name . is_some ( ) || child_node. type_name . named {
458
- let error_message = format ! (
459
- "value for unknown field: {}::{} and type {:?}" ,
460
- node. kind( ) ,
461
- & child_node. field_name. unwrap_or( "child" ) ,
462
- & child_node. type_name
466
+ self . record_parse_error_for_node (
467
+ "value for unknown field: {}::{} and type {}" ,
468
+ & [
469
+ node. kind ( ) ,
470
+ & child_node. field_name . unwrap_or ( "child" ) ,
471
+ & format ! ( "{:?}" , child_node. type_name) ,
472
+ ] ,
473
+ * node,
474
+ false ,
463
475
) ;
464
- self . record_parse_error_for_node ( error_message, * node, false ) ;
465
476
}
466
477
}
467
478
let mut args = Vec :: new ( ) ;
@@ -484,7 +495,7 @@ impl<'a> Visitor<'a> {
484
495
node. kind( ) ,
485
496
column_name
486
497
) ;
487
- self . record_parse_error_for_node ( error_message, * node, false ) ;
498
+ self . record_parse_error_for_node ( & error_message, & [ ] , * node, false ) ;
488
499
}
489
500
}
490
501
Storage :: Table {
@@ -494,13 +505,12 @@ impl<'a> Visitor<'a> {
494
505
} => {
495
506
for ( index, child_value) in child_values. iter ( ) . enumerate ( ) {
496
507
if !* has_index && index > 0 {
497
- let error_message = format ! (
508
+ self . record_parse_error_for_node (
498
509
"too many values for field: {}::{}" ,
499
- node. kind( ) ,
500
- table_name,
510
+ & [ node. kind ( ) , table_name] ,
511
+ * node,
512
+ false ,
501
513
) ;
502
-
503
- self . record_parse_error_for_node ( error_message, * node, false ) ;
504
514
break ;
505
515
}
506
516
let mut args = vec ! [ trap:: Arg :: Label ( parent_id) ] ;
@@ -597,8 +607,8 @@ fn location_for(visitor: &mut Visitor, n: Node) -> (usize, usize, usize, usize)
597
607
visitor. diagnostics_writer . write (
598
608
visitor
599
609
. diagnostics_writer
600
- . message ( "internal-error" , "Internal error" )
601
- . text ( "expecting a line break symbol, but none found while correcting end column value" )
610
+ . new_entry ( "internal-error" , "Internal error" )
611
+ . message ( "expecting a line break symbol, but none found while correcting end column value" , & [ ] )
602
612
. severity ( diagnostics:: Severity :: Error ) ,
603
613
) ;
604
614
}
@@ -612,12 +622,11 @@ fn location_for(visitor: &mut Visitor, n: Node) -> (usize, usize, usize, usize)
612
622
visitor. diagnostics_writer . write (
613
623
visitor
614
624
. diagnostics_writer
615
- . message ( "internal-error" , "Internal error" )
616
- . text ( & format ! (
625
+ . new_entry ( "internal-error" , "Internal error" )
626
+ . message (
617
627
"cannot correct end column value: end_byte index {} is not in range [1,{}]" ,
618
- index,
619
- source. len( )
620
- ) )
628
+ & [ & index. to_string ( ) , & source. len ( ) . to_string ( ) ] ,
629
+ )
621
630
. severity ( diagnostics:: Severity :: Error ) ,
622
631
) ;
623
632
}
0 commit comments