1
+ #![ allow( non_snake_case) ]
1
2
use colored:: Colorize ;
2
3
use inkwell:: targets:: * ;
3
4
use inkwell:: execution_engine:: FunctionLookupError ;
@@ -32,8 +33,7 @@ const INIT_NEEDED: InitializationConfig = InitializationConfig {
32
33
info : true ,
33
34
machine_code : true
34
35
} ;
35
- #[ allow( non_snake_case) ]
36
- fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
36
+ fn driver ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
37
37
let ERROR = & "error" . bright_red ( ) . bold ( ) ;
38
38
let WARNING = & "warning" . bright_yellow ( ) . bold ( ) ;
39
39
let MODULE = & "module" . blue ( ) . bold ( ) ;
@@ -89,16 +89,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
89
89
let file = cobalt:: errors:: files:: add_file ( "<command line>" . to_string ( ) , arg. clone ( ) ) ;
90
90
let files = & * cobalt:: errors:: files:: FILES . read ( ) . unwrap ( ) ;
91
91
let ( toks, errs) = cobalt:: parser:: lex ( arg. as_str ( ) , ( file, 0 ) , & flags) ;
92
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; }
93
- for tok in toks { term:: emit ( & mut stdout, & config, files, & Diagnostic :: note ( ) . with_message ( format ! ( "{tok}" ) ) . with_labels ( vec ! [ Label :: primary( tok. loc. 0 , tok. loc. 1 ) ] ) ) . unwrap ( ) ; }
92
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; }
93
+ for tok in toks { term:: emit ( & mut stdout, & config, files, & Diagnostic :: note ( ) . with_message ( format ! ( "{tok}" ) ) . with_labels ( vec ! [ Label :: primary( tok. loc. 0 , tok. loc. 1 ) ] ) ) ? ; }
94
94
}
95
95
else {
96
96
let code = std:: fs:: read_to_string ( arg. as_str ( ) ) ?;
97
97
let file = cobalt:: errors:: files:: add_file ( arg. clone ( ) , code. clone ( ) ) ;
98
98
let files = & * cobalt:: errors:: files:: FILES . read ( ) . unwrap ( ) ;
99
99
let ( toks, errs) = cobalt:: parser:: lex ( code. as_str ( ) , ( file, 0 ) , & flags) ;
100
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; }
101
- for tok in toks { term:: emit ( & mut stdout, & config, files, & Diagnostic :: note ( ) . with_message ( format ! ( "{tok}" ) ) . with_labels ( vec ! [ Label :: primary( tok. loc. 0 , tok. loc. 1 ) ] ) ) . unwrap ( ) ; }
100
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; }
101
+ for tok in toks { term:: emit ( & mut stdout, & config, files, & Diagnostic :: note ( ) . with_message ( format ! ( "{tok}" ) ) . with_labels ( vec ! [ Label :: primary( tok. loc. 0 , tok. loc. 1 ) ] ) ) ? ; }
102
102
}
103
103
}
104
104
if nfcl {
@@ -139,7 +139,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
139
139
let ( toks, mut errs) = cobalt:: parser:: lex ( arg. as_str ( ) , ( file, 0 ) , & flags) ;
140
140
let ( ast, mut es) = cobalt:: parser:: parse ( toks. as_slice ( ) , & flags) ;
141
141
errs. append ( & mut es) ;
142
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; }
142
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; }
143
143
if loc { print ! ( "{:#}" , ast) }
144
144
else { print ! ( "{}" , ast) }
145
145
}
@@ -150,7 +150,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
150
150
let ( toks, mut errs) = cobalt:: parser:: lex ( code. as_str ( ) , ( file, 0 ) , & flags) ;
151
151
let ( ast, mut es) = cobalt:: parser:: parse ( toks. as_slice ( ) , & flags) ;
152
152
errs. append ( & mut es) ;
153
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; }
153
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; }
154
154
if loc { print ! ( "{:#}" , ast) }
155
155
else { print ! ( "{}" , ast) }
156
156
}
@@ -210,14 +210,14 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
210
210
let file = cobalt:: errors:: files:: add_file ( in_file. to_string ( ) , code. clone ( ) ) ;
211
211
let files = & * cobalt:: errors:: files:: FILES . read ( ) . unwrap ( ) ;
212
212
let ( toks, errs) = cobalt:: parser:: lex ( code. as_str ( ) , ( file, 0 ) , & flags) ;
213
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; }
213
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; }
214
214
let ( ast, errs) = cobalt:: parser:: ast:: parse ( toks. as_slice ( ) , & flags) ;
215
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; }
215
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; }
216
216
let ink_ctx = inkwell:: context:: Context :: create ( ) ;
217
217
let ctx = cobalt:: context:: CompCtx :: new ( & ink_ctx, in_file) ;
218
218
ctx. module . set_triple ( & TargetMachine :: get_default_triple ( ) ) ;
219
219
let ( _, errs) = ast. codegen ( & ctx) ;
220
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; }
220
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; }
221
221
if let Err ( msg) = ctx. module . verify ( ) {
222
222
eprintln ! ( "{ERROR}: {MODULE}: {}" , msg. to_string( ) ) ;
223
223
fail = true ;
@@ -483,19 +483,19 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
483
483
let file = cobalt:: errors:: files:: add_file ( in_file. to_string ( ) , code. clone ( ) ) ;
484
484
let files = & * cobalt:: errors:: files:: FILES . read ( ) . unwrap ( ) ;
485
485
let ( toks, errs) = cobalt:: parser:: lex ( code. as_str ( ) , ( file, 0 ) , & ctx. flags ) ;
486
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
486
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
487
487
overall_fail |= fail;
488
488
fail = false ;
489
489
if fail && !continue_if_err { exit ( 101 ) }
490
490
let ( ast, errs) = cobalt:: parser:: ast:: parse ( toks. as_slice ( ) , & ctx. flags ) ;
491
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
491
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
492
492
overall_fail |= fail;
493
493
fail = false ;
494
494
if fail && !continue_if_err { exit ( 101 ) }
495
495
let ( _, errs) = ast. codegen ( & ctx) ;
496
496
overall_fail |= fail;
497
497
fail = false ;
498
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
498
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
499
499
if fail && !continue_if_err { exit ( 101 ) }
500
500
if let Err ( msg) = ctx. module . verify ( ) {
501
501
eprintln ! ( "{ERROR}: {MODULE}: {}" , msg. to_string( ) ) ;
@@ -733,19 +733,19 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
733
733
let file = cobalt:: errors:: files:: add_file ( in_file. to_string ( ) , code. clone ( ) ) ;
734
734
let files = & * cobalt:: errors:: files:: FILES . read ( ) . unwrap ( ) ;
735
735
let ( toks, errs) = cobalt:: parser:: lex ( code. as_str ( ) , ( file, 0 ) , & flags) ;
736
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
736
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
737
737
overall_fail |= fail;
738
738
fail = false ;
739
739
if fail && !continue_if_err { exit ( 101 ) }
740
740
let ( ast, errs) = cobalt:: parser:: ast:: parse ( toks. as_slice ( ) , & flags) ;
741
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
741
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
742
742
overall_fail |= fail;
743
743
fail = false ;
744
744
if fail && !continue_if_err { exit ( 101 ) }
745
745
let ( _, errs) = ast. codegen ( & ctx) ;
746
746
overall_fail |= fail;
747
747
fail = false ;
748
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
748
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
749
749
if fail && !continue_if_err { exit ( 101 ) }
750
750
if let Err ( msg) = ctx. module . verify ( ) {
751
751
eprintln ! ( "{ERROR}: {MODULE}: {}" , msg. to_string( ) ) ;
@@ -899,11 +899,11 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
899
899
let file = cobalt:: errors:: files:: add_file ( in_file. to_string ( ) , code. clone ( ) ) ;
900
900
let files = & * cobalt:: errors:: files:: FILES . read ( ) . unwrap ( ) ;
901
901
let ( toks, errs) = cobalt:: parser:: lex ( code. as_str ( ) , ( file, 0 ) , & ctx. flags ) ;
902
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
902
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
903
903
let ( ast, errs) = cobalt:: parser:: ast:: parse ( toks. as_slice ( ) , & ctx. flags ) ;
904
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
904
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
905
905
let ( _, errs) = ast. codegen ( & ctx) ;
906
- for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) . unwrap ( ) ; fail |= err. is_err ( ) ; }
906
+ for err in errs { term:: emit ( & mut stdout, & config, files, & err. 0 ) ? ; fail |= err. is_err ( ) ; }
907
907
if let Err ( msg) = ctx. module . verify ( ) {
908
908
eprintln ! ( "{ERROR}: {MODULE}: {}" , msg. to_string( ) ) ;
909
909
exit ( 101 )
@@ -1218,3 +1218,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
1218
1218
} ;
1219
1219
Ok ( ( ) )
1220
1220
}
1221
+ fn main ( ) {
1222
+ if let Err ( err) = driver ( ) {
1223
+ let ERROR = & "error" . bright_red ( ) . bold ( ) ;
1224
+ eprintln ! ( "{ERROR}: {err}" ) ;
1225
+ exit ( 100 ) ;
1226
+ }
1227
+ }
0 commit comments