@@ -288,6 +288,13 @@ impl Expression {
288288 span,
289289 }
290290 }
291+
292+ pub fn error ( span : Span ) -> Self {
293+ Self {
294+ inner : ExpressionInner :: Error ,
295+ span,
296+ }
297+ }
291298}
292299
293300impl_eq_hash ! ( Expression ; inner) ;
@@ -301,6 +308,10 @@ pub enum ExpressionInner {
301308 /// Then, the block returns the value of its final expression.
302309 /// The block returns nothing (unit) if there is no final expression.
303310 Block ( Arc < [ Statement ] > , Option < Arc < Expression > > ) ,
311+ /// An error expression state, which indicates that parser cannot recognize this expression.
312+ /// Also tells an analyzer that we should skip analyzing this expression to not emmit more
313+ /// errors.
314+ Error ,
304315}
305316
306317/// A single expression directly returns a value.
@@ -399,7 +410,7 @@ impl Match {
399410 }
400411 ( MatchPattern :: None , MatchPattern :: Some ( _, ty_r) ) => AliasedType :: option ( ty_r. clone ( ) ) ,
401412 ( MatchPattern :: False , MatchPattern :: True ) => AliasedType :: boolean ( ) ,
402- _ => unreachable ! ( "Match expressions have valid left and right arms" ) ,
413+ _ => AliasedType :: error ( ) ,
403414 }
404415 }
405416}
@@ -614,6 +625,7 @@ impl TreeLike for ExprTree<'_> {
614625 Tree :: Unary ( Self :: Block ( statements, maybe_expr) )
615626 }
616627 ExpressionInner :: Single ( single) => Tree :: Unary ( Self :: Single ( single) ) ,
628+ ExpressionInner :: Error => Tree :: Nullary ,
617629 } ,
618630 Self :: Block ( statements, maybe_expr) => Tree :: Nary (
619631 statements
@@ -935,13 +947,7 @@ impl<A: ChumskyParse + std::fmt::Debug> ParseFromStrWithErrors for A {
935947
936948 handler. update ( parse_errs) ;
937949
938- // TODO: We should return parsed result if we found errors, but because analyzing in `ast` module
939- // is not handling poisoned tree right now, we don't return parsed result
940- if handler. get ( ) . is_empty ( ) {
941- ast
942- } else {
943- None
944- }
950+ ast
945951 }
946952}
947953
@@ -1042,12 +1048,7 @@ impl ChumskyParse for AliasedType {
10421048 . then ( ty. clone ( ) ) ,
10431049 Token :: LAngle ,
10441050 Token :: RAngle ,
1045- |_| {
1046- (
1047- AliasedType :: alias ( AliasName :: from_str_unchecked ( "error" ) ) ,
1048- AliasedType :: alias ( AliasName :: from_str_unchecked ( "error" ) ) ,
1049- )
1050- } ,
1051+ |_| ( AliasedType :: error ( ) , AliasedType :: error ( ) ) ,
10511052 ) ;
10521053
10531054 let sum_type = just ( Token :: Ident ( "Either" ) )
@@ -1073,7 +1074,7 @@ impl ChumskyParse for AliasedType {
10731074 . map ( |s : Vec < AliasedType > | AliasedType :: tuple ( s) ) ,
10741075 Token :: LParen ,
10751076 Token :: RParen ,
1076- |_| AliasedType :: tuple ( Vec :: new ( ) ) ,
1077+ |_| AliasedType :: error ( ) ,
10771078 )
10781079 . labelled ( "tuple" ) ;
10791080
@@ -1086,12 +1087,7 @@ impl ChumskyParse for AliasedType {
10861087 } ) ,
10871088 Token :: LBracket ,
10881089 Token :: RBracket ,
1089- |_| {
1090- AliasedType :: array (
1091- AliasedType :: alias ( AliasName :: from_str_unchecked ( "error" ) ) ,
1092- 0 ,
1093- )
1094- } ,
1090+ |_| AliasedType :: error ( ) ,
10951091 )
10961092 . labelled ( "array" ) ;
10971093
@@ -1113,19 +1109,12 @@ impl ChumskyParse for AliasedType {
11131109 } ) ) ,
11141110 Token :: LAngle ,
11151111 Token :: RAngle ,
1116- |_| {
1117- (
1118- AliasedType :: alias ( AliasName :: from_str_unchecked ( "error" ) ) ,
1119- NonZeroPow2Usize :: TWO ,
1120- )
1121- } ,
1112+ |_| ( AliasedType :: error ( ) , NonZeroPow2Usize :: TWO ) ,
11221113 ) )
11231114 . map ( |( ty, size) | AliasedType :: list ( ty, size) )
11241115 . labelled ( "List" ) ;
11251116
1126- choice ( ( sum_type, option_type, tuple, array, list, atom) )
1127- . map_with ( |inner, _| inner)
1128- . labelled ( "type" )
1117+ choice ( ( sum_type, option_type, tuple, array, list, atom) ) . labelled ( "type" )
11291118 } )
11301119 }
11311120}
@@ -1164,7 +1153,7 @@ impl ChumskyParse for Item {
11641153 let type_parser = TypeAlias :: parser ( ) . map ( Item :: TypeAlias ) ;
11651154 let mod_parser = Module :: parser ( ) . map ( |_| Item :: Module ) ;
11661155
1167- choice ( ( func_parser, type_parser, mod_parser) )
1156+ choice ( ( func_parser, type_parser, mod_parser) ) . labelled ( "item" )
11681157 }
11691158}
11701159
@@ -1200,7 +1189,7 @@ impl ChumskyParse for Function {
12001189 ( Token :: LParen , Token :: RParen ) ,
12011190 ( Token :: LBracket , Token :: RBracket ) ,
12021191 ] ,
1203- Expression :: empty ,
1192+ Expression :: error ,
12041193 ) ) )
12051194 . labelled ( "function body" ) ;
12061195
@@ -1493,7 +1482,7 @@ impl ChumskyParse for Expression {
14931482 ( Token :: RAngle , Token :: RAngle ) ,
14941483 ( Token :: LBracket , Token :: RBracket ) ,
14951484 ] ,
1496- |span| Expression :: empty ( span) . inner ( ) . clone ( ) ,
1485+ |span| Expression :: error ( span) . inner ( ) . clone ( ) ,
14971486 ) ;
14981487
14991488 let statements = statement
@@ -1754,7 +1743,7 @@ impl Match {
17541743 }
17551744 _ => {
17561745 let match_arm_fallback = MatchArm {
1757- expression : Arc :: new ( Expression :: empty ( Span :: new ( 0 , 0 ) ) ) ,
1746+ expression : Arc :: new ( Expression :: error ( Span :: new ( 0 , 0 ) ) ) ,
17581747 pattern : MatchPattern :: False ,
17591748 } ;
17601749
0 commit comments