@@ -2,17 +2,17 @@ import util::interner;
2
2
import util:: interner:: intern;
3
3
import diagnostic;
4
4
import ast:: { tt_delim, tt_flat} ;
5
+ import codemap:: span;
5
6
6
7
export reader, string_reader, new_string_reader, is_whitespace;
7
8
export tt_reader, new_tt_reader, dup_tt_reader;
8
- export nextch, is_eof, bump, get_str_from;
9
+ export nextch, is_eof, bump, get_str_from, new_low_level_string_reader ;
9
10
export string_reader_as_reader, tt_reader_as_reader;
10
11
11
12
iface reader {
12
13
fn is_eof( ) -> bool;
13
- fn next_token ( ) -> { tok : token:: token , chpos : uint } ;
14
+ fn next_token ( ) -> { tok : token:: token , sp : span } ;
14
15
fn fatal ( str ) -> !;
15
- fn chpos ( ) -> uint ;
16
16
fn interner ( ) -> @interner:: interner < @str > ;
17
17
}
18
18
@@ -33,7 +33,7 @@ type tt_reader = ~{
33
33
mut cur : tt_frame ,
34
34
/* cached: */
35
35
mut cur_tok : token:: token ,
36
- mut cur_chpos : uint
36
+ mut cur_span : span
37
37
} ;
38
38
39
39
fn new_tt_reader ( span_diagnostic : diagnostic:: span_handler ,
@@ -42,10 +42,11 @@ fn new_tt_reader(span_diagnostic: diagnostic::span_handler,
42
42
let r = ~{ span_diagnostic: span_diagnostic, interner: itr,
43
43
mut cur : @{ readme : src, mut idx : 0 u,
44
44
up : tt_frame_up ( option:: none) } ,
45
- mut cur_tok: token:: EOF , /* dummy value, never read */
46
- mut cur_chpos: 0 u /* dummy value, never read */
45
+ /* dummy values, never read: */
46
+ mut cur_tok: token:: EOF ,
47
+ mut cur_span: ast_util:: mk_sp ( 0 u, 0 u)
47
48
} ;
48
- tt_next_token ( r) ; /* get cur_tok and cur_chpos set up */
49
+ tt_next_token ( r) ; /* get cur_tok and cur_span set up */
49
50
ret r;
50
51
}
51
52
@@ -63,7 +64,7 @@ pure fn dup_tt_frame(&&f: tt_frame) -> tt_frame {
63
64
pure fn dup_tt_reader ( & & r: tt_reader ) -> tt_reader {
64
65
~{ span_diagnostic: r. span_diagnostic , interner: r. interner ,
65
66
mut cur: dup_tt_frame ( r. cur ) ,
66
- mut cur_tok: r. cur_tok , mut cur_chpos : r. cur_chpos }
67
+ mut cur_tok: r. cur_tok , mut cur_span : r. cur_span }
67
68
}
68
69
69
70
type string_reader = @{
@@ -80,6 +81,15 @@ type string_reader = @{
80
81
fn new_string_reader ( span_diagnostic : diagnostic:: span_handler ,
81
82
filemap : codemap:: filemap ,
82
83
itr : @interner:: interner < @str > ) -> string_reader {
84
+ let r = new_low_level_string_reader ( span_diagnostic, filemap, itr) ;
85
+ ret r;
86
+ }
87
+
88
+ /* For comments.rs, which hackily pokes into 'pos' and 'curr' */
89
+ fn new_low_level_string_reader ( span_diagnostic : diagnostic:: span_handler ,
90
+ filemap : codemap:: filemap ,
91
+ itr : @interner:: interner < @str > )
92
+ -> string_reader {
83
93
let r = @{ span_diagnostic: span_diagnostic, src: filemap. src ,
84
94
mut col: 0 u, mut pos: 0 u, mut curr: -1 as char ,
85
95
mut chpos: filemap. start_pos . ch ,
@@ -94,27 +104,26 @@ fn new_string_reader(span_diagnostic: diagnostic::span_handler,
94
104
95
105
impl string_reader_as_reader of reader for string_reader {
96
106
fn is_eof ( ) -> bool { is_eof ( self ) }
97
- fn next_token ( ) -> { tok : token:: token , chpos : uint } {
107
+ fn next_token ( ) -> { tok : token:: token , sp : span } {
98
108
consume_whitespace_and_comments ( self ) ;
99
109
let start_chpos = self . chpos ;
100
110
let tok = if is_eof ( self ) {
101
111
token:: EOF
102
112
} else {
103
113
next_token_inner ( self )
104
114
} ;
105
- ret { tok : tok, chpos : start_chpos} ;
115
+ ret { tok : tok, sp : ast_util :: mk_sp ( start_chpos, self . chpos ) } ;
106
116
}
107
117
fn fatal ( m : str ) -> ! {
108
118
self . span_diagnostic . span_fatal (
109
119
ast_util:: mk_sp ( self . chpos , self . chpos ) , m)
110
120
}
111
- fn chpos ( ) -> uint { self . chpos }
112
121
fn interner ( ) -> @interner:: interner < @str > { self . interner }
113
122
}
114
123
115
124
impl tt_reader_as_reader of reader for tt_reader {
116
125
fn is_eof ( ) -> bool { self . cur_tok == token:: EOF }
117
- fn next_token ( ) -> { tok : token:: token , chpos : uint } {
126
+ fn next_token ( ) -> { tok : token:: token , sp : span } {
118
127
/* weird resolve bug: if the following `if`, or any of its
119
128
statements are removed, we get resolution errors */
120
129
if false {
@@ -124,15 +133,19 @@ impl tt_reader_as_reader of reader for tt_reader {
124
133
tt_next_token ( self )
125
134
}
126
135
fn fatal ( m : str ) -> ! {
127
- self . span_diagnostic . span_fatal (
128
- ast_util:: mk_sp ( self . chpos ( ) , self . chpos ( ) ) , m) ;
136
+ self . span_diagnostic . span_fatal ( copy self . cur_span , m) ;
129
137
}
130
- fn chpos ( ) -> uint { self . cur_chpos }
131
138
fn interner ( ) -> @interner:: interner < @str > { self . interner }
132
139
}
133
140
134
- fn tt_next_token ( & & r: tt_reader ) -> { tok : token:: token , chpos : uint } {
135
- let ret_val = { tok: r. cur_tok , chpos: r. cur_chpos } ;
141
+ fn string_advance_token ( & & r: string_reader ) {
142
+ consume_whitespace_and_comments ( r) ;
143
+
144
+ next_token_inner ( r) ;
145
+ }
146
+
147
+ fn tt_next_token ( & & r: tt_reader ) -> { tok : token:: token , sp : span } {
148
+ let ret_val = { tok: r. cur_tok , sp: r. cur_span } ;
136
149
if r. cur . idx >= vec:: len ( r. cur . readme ) {
137
150
/* done with this set; pop */
138
151
alt r. cur . up {
@@ -158,8 +171,8 @@ fn tt_next_token(&&r: tt_reader) -> {tok: token::token, chpos: uint} {
158
171
r. cur = @{ readme: tts, mut idx: 0 u,
159
172
up: tt_frame_up ( option:: some ( copy r. cur ) ) } ;
160
173
}
161
- tt_flat ( chpos , tok) {
162
- r. cur_chpos = chpos ; r. cur_tok = tok;
174
+ tt_flat ( sp , tok) {
175
+ r. cur_span = sp ; r. cur_tok = tok;
163
176
r. cur . idx += 1 u;
164
177
ret ret_val;
165
178
}
0 commit comments