@@ -7,6 +7,7 @@ import std.Map.hashmap;
7
7
import std. Option ;
8
8
import std. Option . some ;
9
9
import std. Option . none ;
10
+ import driver. session . session ;
10
11
import util. common ;
11
12
import util. common . new_str_hash ;
12
13
@@ -24,11 +25,14 @@ state type reader = state obj {
24
25
fn get_keywords ( ) -> hashmap [ str, token. token ] ;
25
26
fn get_reserved ( ) -> hashmap [ str, ( ) ] ;
26
27
fn get_filemap ( ) -> codemap . filemap;
28
+ fn err ( str m) ;
27
29
} ;
28
30
29
- fn new_reader ( IO . reader rdr , str filename , codemap. filemap filemap )
30
- -> reader {
31
- state obj reader ( str file,
31
+ fn new_reader ( session sess, IO . reader rdr , str filename ,
32
+ codemap. filemap filemap ) -> reader {
33
+
34
+ state obj reader ( session sess,
35
+ str file,
32
36
uint len,
33
37
mutable uint pos,
34
38
mutable char ch,
@@ -98,10 +102,14 @@ fn new_reader(IO.reader rdr, str filename, codemap.filemap filemap)
98
102
fn get_filemap ( ) -> codemap . filemap {
99
103
ret fm;
100
104
}
105
+
106
+ fn err ( str m) {
107
+ sess. span_err ( rec ( lo=chpos, hi=chpos) , m) ;
108
+ }
101
109
}
102
110
auto file = Str . unsafe_from_bytes ( rdr. read_whole_stream ( ) ) ;
103
111
let vec[ str] strs = vec ( ) ;
104
- auto rd = reader ( file, Str . byte_len ( file) , 0 u, -1 as char ,
112
+ auto rd = reader ( sess , file, Str . byte_len ( file) , 0 u, -1 as char ,
105
113
filemap. start_pos , filemap. start_pos ,
106
114
strs, keyword_table ( ) ,
107
115
reserved_word_table ( ) ,
@@ -333,7 +341,7 @@ fn consume_block_comment(reader rdr) {
333
341
}
334
342
}
335
343
if ( rdr. is_eof ( ) ) {
336
- log_err "unterminated block comment" ;
344
+ rdr . err ( "unterminated block comment" ) ;
337
345
fail;
338
346
}
339
347
}
@@ -371,7 +379,7 @@ fn scan_exponent(reader rdr) -> Option.t[str] {
371
379
ret ( some ( res + exponent) ) ;
372
380
}
373
381
else {
374
- log_err ( "scan_exponent: bad fp literal" ) ;
382
+ rdr . err ( "scan_exponent: bad fp literal" ) ;
375
383
fail;
376
384
}
377
385
}
@@ -550,7 +558,7 @@ fn scan_numeric_escape(reader rdr) -> char {
550
558
case ( 'u' ) { n_hex_digits = 4 ; }
551
559
case ( 'U' ) { n_hex_digits = 8 ; }
552
560
case ( ?c) {
553
- log_err #fmt( "unknown numeric character escape: %d" , c as int ) ;
561
+ rdr . err ( #fmt ( "unknown numeric character escape: %d" , c as int ) ) ;
554
562
fail;
555
563
}
556
564
}
@@ -562,7 +570,7 @@ fn scan_numeric_escape(reader rdr) -> char {
562
570
563
571
while ( n_hex_digits != 0 ) {
564
572
if ( !is_hex_digit ( n) ) {
565
- log_err #fmt( "illegal numeric character escape: %d" , n as int ) ;
573
+ rdr . err ( #fmt ( "illegal numeric character escape: %d" , n as int ) ) ;
566
574
fail;
567
575
}
568
576
accum_int *= 16 ;
@@ -603,7 +611,7 @@ fn next_token(reader rdr) -> token.token {
603
611
604
612
auto rsvd = rdr. get_reserved ( ) ;
605
613
if ( rsvd. contains_key ( accum_str) ) {
606
- log_err #fmt( "reserved keyword: %s" , accum_str) ;
614
+ rdr . err ( #fmt ( "reserved keyword: %s" , accum_str) ) ;
607
615
fail;
608
616
}
609
617
@@ -726,16 +734,16 @@ fn next_token(reader rdr) -> token.token {
726
734
case ( 'U' ) { c2 = scan_numeric_escape ( rdr) ; }
727
735
728
736
case ( ?c2) {
729
- log_err #fmt( "unknown character escape: %d" ,
730
- c2 as int ) ;
737
+ rdr . err ( #fmt ( "unknown character escape: %d" ,
738
+ c2 as int ) ) ;
731
739
fail;
732
740
}
733
741
}
734
742
rdr. bump ( ) ;
735
743
}
736
744
737
745
if ( rdr. next ( ) != '\'' ) {
738
- log_err "unterminated character constant" ;
746
+ rdr . err ( "unterminated character constant" ) ;
739
747
fail;
740
748
}
741
749
rdr. bump ( ) ; // advance curr to closing '
@@ -786,8 +794,8 @@ fn next_token(reader rdr) -> token.token {
786
794
}
787
795
788
796
case ( ?c2) {
789
- log_err #fmt( "unknown string escape: %d" ,
790
- c2 as int ) ;
797
+ rdr . err ( #fmt ( "unknown string escape: %d" ,
798
+ c2 as int ) ) ;
791
799
fail;
792
800
}
793
801
}
@@ -853,7 +861,7 @@ fn next_token(reader rdr) -> token.token {
853
861
}
854
862
855
863
case ( ?c) {
856
- log_err #fmt( "unkown start of token: %d" , c as int ) ;
864
+ rdr . err ( #fmt ( "unkown start of token: %d" , c as int ) ) ;
857
865
fail;
858
866
}
859
867
}
@@ -917,16 +925,19 @@ fn read_block_comment(reader rdr) -> cmnt {
917
925
Str . push_char ( val, rdr. curr ( ) ) ;
918
926
rdr. bump ( ) ;
919
927
}
920
- if ( rdr. is_eof ( ) ) { fail; }
928
+ if ( rdr. is_eof ( ) ) {
929
+ rdr. err ( "Unexpected end of file in block comment" ) ;
930
+ fail;
931
+ }
921
932
}
922
933
ret rec( val=cmnt_block ( lines) ,
923
934
pos=p,
924
935
space_after=consume_whitespace ( rdr) > 1 u) ;
925
936
}
926
937
927
- fn gather_comments ( str path ) -> vec[ cmnt ] {
938
+ fn gather_comments ( session sess , str path ) -> vec[ cmnt ] {
928
939
auto srdr = IO . file_reader ( path) ;
929
- auto rdr = new_reader ( srdr, path, codemap. new_filemap ( path, 0 u) ) ;
940
+ auto rdr = new_reader ( sess , srdr, path, codemap. new_filemap ( path, 0 u) ) ;
930
941
let vec[ cmnt] comments = vec ( ) ;
931
942
while ( !rdr. is_eof ( ) ) {
932
943
while ( true ) {
0 commit comments