@@ -817,6 +817,7 @@ impl VM {
817817 self . stack . pop ( ) ;
818818 self . stack . push ( v. clone ( ) ) ;
819819 }
820+
820821 None => {
821822 let method = match crate :: natives:: object:: get_fn ( name. to_string ( ) ) {
822823 Some ( m) => m,
@@ -825,11 +826,13 @@ impl VM {
825826 let closest = find_closest ( name. clone ( ) , props) ;
826827
827828 if let Some ( closest) = closest {
828- return Err ( self . runtime_error_with_help (
829+ self . handle_error_with_help (
829830 format ! ( "undefined property '{}' on object" , name) ,
830831 format ! ( "did you maybe mean: '{}'?" , closest. green( ) ) ,
831832 span
832- ) ) ;
833+ ) ?;
834+
835+ continue ;
833836 } else {
834837 self . handle_error ( format ! ( "undefined property '{}' on object" , name) , span) ?;
835838 continue ;
@@ -849,11 +852,13 @@ impl VM {
849852 let closest = find_closest ( name. clone ( ) , crate :: natives:: string:: list_fns ( ) . into_iter ( ) ) ;
850853
851854 if let Some ( closest) = closest {
852- return Err ( self . runtime_error_with_help (
855+ self . handle_error_with_help (
853856 format ! ( "undefined property '{}' on string" , name) ,
854857 format ! ( "did you maybe mean: '{}'?" , closest. green( ) ) ,
855858 span
856- ) ) ;
859+ ) ?;
860+
861+ continue ;
857862 }
858863
859864 self . handle_error ( format ! ( "undefined property '{}' on string" , name) , span) ?;
@@ -871,11 +876,13 @@ impl VM {
871876 let closest = find_closest ( name. clone ( ) , crate :: natives:: int:: list_fns ( ) . into_iter ( ) ) ;
872877
873878 if let Some ( closest) = closest {
874- return Err ( self . runtime_error_with_help (
879+ self . handle_error_with_help (
875880 format ! ( "undefined property '{}' on int" , name) ,
876881 format ! ( "did you maybe mean: '{}'?" , closest. green( ) ) ,
877882 span
878- ) ) ;
883+ ) ?;
884+
885+ continue ;
879886 }
880887
881888 self . handle_error ( format ! ( "undefined property '{}' on int" , name) , span) ?;
@@ -893,11 +900,13 @@ impl VM {
893900 let closest = find_closest ( name. clone ( ) , crate :: natives:: float:: list_fns ( ) . into_iter ( ) ) ;
894901
895902 if let Some ( closest) = closest {
896- return Err ( self . runtime_error_with_help (
903+ self . handle_error_with_help (
897904 format ! ( "undefined property '{}' on float" , name) ,
898905 format ! ( "did you maybe mean: '{}'?" , closest. green( ) ) ,
899906 span
900- ) ) ;
907+ ) ?;
908+
909+ continue ;
901910 }
902911
903912 self . handle_error ( format ! ( "undefined property '{}' on float" , name) , span) ?;
@@ -915,11 +924,13 @@ impl VM {
915924 let closest = find_closest ( name. clone ( ) , crate :: natives:: array:: list_fns ( ) . into_iter ( ) ) ;
916925
917926 if let Some ( closest) = closest {
918- return Err ( self . runtime_error_with_help (
927+ self . handle_error_with_help (
919928 format ! ( "undefined property '{}' on array" , name) ,
920929 format ! ( "did you maybe mean: '{}'?" , closest. green( ) ) ,
921930 span
922- ) ) ;
931+ ) ?;
932+
933+ continue ;
923934 }
924935
925936 self . handle_error ( format ! ( "undefined property '{}' on array" , name) , span) ?;
@@ -952,11 +963,13 @@ impl VM {
952963 let closest = find_closest ( name. clone ( ) , properties. keys ( ) . cloned ( ) ) ;
953964
954965 if let Some ( closest) = closest {
955- return Err ( self . runtime_error_with_help (
966+ self . handle_error_with_help (
956967 format ! ( "undefined property '{}' on instance of {}" , name, class_name) ,
957968 format ! ( "did you maybe mean: '{}'?" , closest. green( ) ) ,
958969 span
959- ) ) ;
970+ ) ?;
971+
972+ continue ;
960973 } else {
961974 self . handle_error ( format ! ( "undefined property '{}' on instance of {}" , name, class_name) , span) ?;
962975 continue ;
@@ -1077,7 +1090,10 @@ impl VM {
10771090 }
10781091 }
10791092
1080- _ => return Err ( format ! ( "{} is not iterable" , iter. type_name( ) ) ) ,
1093+ _ => {
1094+ self . handle_error ( format ! ( "{} is not iterable" , iter. type_name( ) ) , span) ?;
1095+ continue ;
1096+ }
10811097 }
10821098 }
10831099
@@ -1102,7 +1118,8 @@ impl VM {
11021118 self . globals . insert ( path. clone ( ) , module) ;
11031119 }
11041120 } else {
1105- return Err ( format ! ( "unknown stdlib module '{}'" , path) ) ;
1121+ self . handle_error ( format ! ( "unknown stdlib module '{}'" , path) , span) ?;
1122+ continue ;
11061123 }
11071124 } else {
11081125 let current_dir = self . source_path
@@ -1146,7 +1163,8 @@ impl VM {
11461163 let ast = crate :: parser:: parse ( & source, & resolved. display ( ) . to_string ( ) ) ;
11471164
11481165 if ast. is_err ( ) {
1149- return Err ( format ! ( "failed to parse package" ) ) ;
1166+ self . handle_error ( "failed to parse package" . to_string ( ) , span) ?;
1167+ continue ;
11501168 }
11511169
11521170 let mut compiler = crate :: compiler:: compiler:: Compiler :: new ( ) ;
@@ -1222,11 +1240,12 @@ impl VM {
12221240 let closest = find_closest ( name. clone ( ) , self . globals . keys ( ) . cloned ( ) ) ;
12231241
12241242 if let Some ( closest) = closest {
1225- return Err ( self . runtime_error_with_help (
1243+ self . handle_error_with_help (
12261244 format ! ( "undefined variable '{}'" , name) ,
12271245 format ! ( "did you maybe mean: '{}'?" , closest. green( ) ) ,
12281246 span
1229- ) ) ;
1247+ ) ?;
1248+ continue ;
12301249 }
12311250
12321251 self . handle_error ( format ! ( "undefined variable '{}'" , name) , span) ?;
@@ -1344,7 +1363,7 @@ impl VM {
13441363
13451364 Ok ( ( ) )
13461365 } else {
1347- Err ( self . runtime_error ( msg, span) )
1366+ Err ( self . runtime_error_with_help ( msg, help , span) )
13481367 }
13491368 }
13501369}
0 commit comments