@@ -276,7 +276,8 @@ impl<'a> Visitor<'a> {
276276
277277 fn record_parse_error_for_node (
278278 & mut self ,
279- error_message : String ,
279+ message : & str ,
280+ args : & [ & str ] ,
280281 node : Node ,
281282 status_page : bool ,
282283 ) {
@@ -291,26 +292,31 @@ impl<'a> Visitor<'a> {
291292 ) ;
292293 let mut mesg = self
293294 . 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 )
296298 . location ( self . path , start_line, start_column, end_line, end_column)
297- . text ( & error_message ) ;
299+ . message ( message , args ) ;
298300 if status_page {
299301 & mesg. status_page ( ) ;
300302 }
301303 self . record_parse_error ( loc, & mesg) ;
302304 }
303305
304306 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+ ) ;
312314 return false ;
313315 }
316+ if node. is_error ( ) {
317+ self . record_parse_error_for_node ( "parse error" , & [ ] , node, true ) ;
318+ return false ;
319+ } ;
314320
315321 let id = self . trap_writer . fresh_id ( ) ;
316322
@@ -390,14 +396,13 @@ impl<'a> Visitor<'a> {
390396 }
391397 }
392398 _ => {
393- let error_message = format ! ( "unknown table type: '{}'" , node. kind( ) ) ;
394399 self . record_parse_error (
395400 loc,
396401 self . diagnostics_writer
397- . message ( "parse-error" , "Parse error" )
402+ . new_entry ( "parse-error" , "Parse error" )
398403 . severity ( diagnostics:: Severity :: Error )
399404 . location ( self . path , start_line, start_column, end_line, end_column)
400- . text ( & error_message ) ,
405+ . message ( "unknown table type: {}" , & [ node . kind ( ) ] ) ,
401406 ) ;
402407
403408 valid = false ;
@@ -445,23 +450,29 @@ impl<'a> Visitor<'a> {
445450 values. push ( trap:: Arg :: Label ( child_node. label ) ) ;
446451 }
447452 } 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 ,
454463 ) ;
455- self . record_parse_error_for_node ( error_message, * node, false ) ;
456464 }
457465 } 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 ,
463475 ) ;
464- self . record_parse_error_for_node ( error_message, * node, false ) ;
465476 }
466477 }
467478 let mut args = Vec :: new ( ) ;
@@ -484,7 +495,7 @@ impl<'a> Visitor<'a> {
484495 node. kind( ) ,
485496 column_name
486497 ) ;
487- self . record_parse_error_for_node ( error_message, * node, false ) ;
498+ self . record_parse_error_for_node ( & error_message, & [ ] , * node, false ) ;
488499 }
489500 }
490501 Storage :: Table {
@@ -494,13 +505,12 @@ impl<'a> Visitor<'a> {
494505 } => {
495506 for ( index, child_value) in child_values. iter ( ) . enumerate ( ) {
496507 if !* has_index && index > 0 {
497- let error_message = format ! (
508+ self . record_parse_error_for_node (
498509 "too many values for field: {}::{}" ,
499- node. kind( ) ,
500- table_name,
510+ & [ node. kind ( ) , table_name] ,
511+ * node,
512+ false ,
501513 ) ;
502-
503- self . record_parse_error_for_node ( error_message, * node, false ) ;
504514 break ;
505515 }
506516 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)
597607 visitor. diagnostics_writer . write (
598608 visitor
599609 . 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" , & [ ] )
602612 . severity ( diagnostics:: Severity :: Error ) ,
603613 ) ;
604614 }
@@ -612,12 +622,11 @@ fn location_for(visitor: &mut Visitor, n: Node) -> (usize, usize, usize, usize)
612622 visitor. diagnostics_writer . write (
613623 visitor
614624 . diagnostics_writer
615- . message ( "internal-error" , "Internal error" )
616- . text ( & format ! (
625+ . new_entry ( "internal-error" , "Internal error" )
626+ . message (
617627 "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+ )
621630 . severity ( diagnostics:: Severity :: Error ) ,
622631 ) ;
623632 }
0 commit comments