@@ -422,33 +422,17 @@ where
422422 Id : Clone + AsRef < str > + std:: fmt:: Debug ,
423423 S : ?Sized + ParserSource ,
424424{
425- let layout = Layout :: new ( Tokenizer :: new ( input) ) ;
426-
427- let mut parse_errors = Errors :: new ( ) ;
428-
429- let result = grammar:: TopExprParser :: new ( ) . parse (
430- & input,
431- type_cache,
432- arena,
433- symbols,
434- & mut parse_errors,
435- & mut TempVecs :: new ( ) ,
436- layout,
437- ) ;
438-
439- match result {
440- Ok ( expr) => {
441- if parse_errors. has_errors ( ) {
442- Err ( ( Some ( expr) , transform_errors ( input. span ( ) , parse_errors) ) )
443- } else {
444- Ok ( expr)
445- }
446- }
447- Err ( err) => {
448- parse_errors. push ( err) ;
449- Err ( ( None , transform_errors ( input. span ( ) , parse_errors) ) )
450- }
451- }
425+ parse_with ( input, & mut |parse_errors, layout| {
426+ grammar:: TopExprParser :: new ( ) . parse (
427+ & input,
428+ type_cache,
429+ arena,
430+ symbols,
431+ parse_errors,
432+ & mut TempVecs :: new ( ) ,
433+ layout,
434+ )
435+ } )
452436}
453437
454438pub fn parse_expr < ' ast > (
@@ -475,34 +459,65 @@ where
475459 Id : Clone + Eq + Hash + AsRef < str > + :: std:: fmt:: Debug ,
476460 S : ?Sized + ParserSource ,
477461{
478- let layout = Layout :: new ( Tokenizer :: new ( input) ) ;
462+ parse_with ( input, & mut |parse_errors, layout| {
463+ let type_cache = TypeCache :: default ( ) ;
464+
465+ grammar:: ReplLineParser :: new ( )
466+ . parse (
467+ & input,
468+ & type_cache,
469+ arena,
470+ symbols,
471+ parse_errors,
472+ & mut TempVecs :: new ( ) ,
473+ layout,
474+ )
475+ . map ( |o| o. map ( |b| * b) )
476+ } )
477+ . map_err ( |( opt, err) | ( opt. and_then ( |opt| opt) , err) )
478+ }
479+
480+ fn parse_with < ' ast , ' input , S , T > (
481+ input : & ' input S ,
482+ parse : & mut dyn FnMut (
483+ ErrorEnv < ' _ , ' input > ,
484+ Layout < ' input , & mut Tokenizer < ' input > > ,
485+ ) -> Result <
486+ T ,
487+ lalrpop_util:: ParseError < BytePos , Token < & ' input str > , Spanned < Error , BytePos > > ,
488+ > ,
489+ ) -> Result < T , ( Option < T > , ParseErrors ) >
490+ where
491+ S : ?Sized + ParserSource ,
492+ {
493+ let mut tokenizer = Tokenizer :: new ( input) ;
494+ let layout = Layout :: new ( & mut tokenizer) ;
479495
480496 let mut parse_errors = Errors :: new ( ) ;
481497
482- let type_cache = TypeCache :: default ( ) ;
498+ let result = parse ( & mut parse_errors, layout) ;
499+
500+ let mut all_errors = transform_errors ( input. span ( ) , parse_errors) ;
483501
484- let result = grammar:: ReplLineParser :: new ( ) . parse (
485- & input,
486- & type_cache,
487- arena,
488- symbols,
489- & mut parse_errors,
490- & mut TempVecs :: new ( ) ,
491- layout,
492- ) ;
502+ all_errors. extend ( tokenizer. errors . drain ( ..) . map ( |sp_error| {
503+ pos:: spanned2 (
504+ sp_error. span . start ( ) . absolute ,
505+ sp_error. span . end ( ) . absolute ,
506+ sp_error. value . into ( ) ,
507+ )
508+ } ) ) ;
493509
494510 match result {
495- Ok ( repl_line) => {
496- let repl_line = repl_line. map ( |b| * b) ;
497- if parse_errors. has_errors ( ) {
498- Err ( ( repl_line, transform_errors ( input. span ( ) , parse_errors) ) )
511+ Ok ( value) => {
512+ if all_errors. has_errors ( ) {
513+ Err ( ( Some ( value) , all_errors) )
499514 } else {
500- Ok ( repl_line )
515+ Ok ( value )
501516 }
502517 }
503518 Err ( err) => {
504- parse_errors . push ( err) ;
505- Err ( ( None , transform_errors ( input . span ( ) , parse_errors ) ) )
519+ all_errors . push ( Error :: from_lalrpop ( input . span ( ) , err) ) ;
520+ Err ( ( None , all_errors ) )
506521 }
507522 }
508523}
0 commit comments