@@ -44,8 +44,7 @@ impl<'a> StreamOnce for TokenStream<'a> {
44
44
45
45
fn uncons ( & mut self ) -> Result < Self :: Item , Error < Token < ' a > , Token < ' a > > > {
46
46
let ( kind, len) = self . peek_token ( ) ?;
47
- let value = & self . buf [ self . off ..] [ ..len] ;
48
- self . update_position ( len) ;
47
+ let value = & self . buf [ self . off -len..self . off ] ;
49
48
self . skip_whitespace ( ) ;
50
49
Ok ( Token { kind, value } )
51
50
}
@@ -116,7 +115,7 @@ impl<'a> TokenStream<'a> {
116
115
me. skip_whitespace ( ) ;
117
116
return me;
118
117
}
119
- fn peek_token ( & self )
118
+ fn peek_token ( & mut self )
120
119
-> Result < ( Kind , usize ) , Error < Token < ' a > , Token < ' a > > >
121
120
{
122
121
use self :: Kind :: * ;
@@ -128,10 +127,14 @@ impl<'a> TokenStream<'a> {
128
127
match cur_char {
129
128
'!' | '$' | ':' | '=' | '@' | '|' |
130
129
'(' | ')' | '[' | ']' | '{' | '}' => {
130
+ self . position . column += 1 ;
131
+ self . off += 1 ;
131
132
return Ok ( ( Punctuator , 1 ) ) ;
132
133
}
133
134
'.' => {
134
135
if iter. as_str ( ) . starts_with ( ".." ) {
136
+ self . position . column += 3 ;
137
+ self . off += 3 ;
135
138
return Ok ( ( Punctuator , 3 ) )
136
139
} else {
137
140
return Err ( Error :: unexpected_message (
@@ -144,11 +147,16 @@ impl<'a> TokenStream<'a> {
144
147
match cur_char {
145
148
'_' | 'a' ...'z' | 'A' ...'Z' | '0' ...'9' => continue ,
146
149
_ => {
150
+ self . position . column += idx;
151
+ self . off += idx;
147
152
return Ok ( ( Name , idx) ) ;
148
153
}
149
154
}
150
155
}
151
- return Ok ( ( Name , self . buf . len ( ) - self . off ) ) ;
156
+ let len = self . buf . len ( ) - self . off ;
157
+ self . position . column += len;
158
+ self . off += len;
159
+ return Ok ( ( Name , len) ) ;
152
160
}
153
161
'-' | '0' ...'9' => {
154
162
let mut exponent = None ;
@@ -175,13 +183,17 @@ impl<'a> TokenStream<'a> {
175
183
return Err ( Error :: unexpected_message (
176
184
format_args ! ( "unsupported float {:?}" , value) ) ) ;
177
185
}
186
+ self . position . column += len;
187
+ self . off += len;
178
188
return Ok ( ( FloatValue , len) ) ;
179
189
} else {
180
190
let value = & self . buf [ self . off ..] [ ..len] ;
181
191
if !check_int ( value) {
182
192
return Err ( Error :: unexpected_message (
183
193
format_args ! ( "unsupported integer {:?}" , value) ) ) ;
184
194
}
195
+ self . position . column += len;
196
+ self . off += len;
185
197
return Ok ( ( IntValue , len) ) ;
186
198
}
187
199
}
@@ -190,24 +202,31 @@ impl<'a> TokenStream<'a> {
190
202
let tail = & iter. as_str ( ) [ 2 ..] ;
191
203
for ( endidx, _) in tail. match_indices ( "\" \" \" " ) {
192
204
if !tail[ ..endidx] . ends_with ( '\\' ) {
205
+ self . update_position ( endidx+6 ) ;
193
206
return Ok ( ( BlockString , endidx+6 ) ) ;
194
207
}
195
208
}
196
209
return Err ( Error :: unexpected_message (
197
210
"unterminated block string value" ) ) ;
198
211
} else {
199
212
let mut prev_char = cur_char;
213
+ let mut nchars = 1 ;
200
214
while let Some ( ( idx, cur_char) ) = iter. next ( ) {
215
+ nchars += 1 ;
201
216
match cur_char {
202
217
'"' if prev_char == '\\' => { }
203
218
'"' => {
219
+ self . position . column += nchars;
220
+ self . off += idx+1 ;
204
221
return Ok ( ( StringValue , idx+1 ) ) ;
205
222
}
206
223
'\n' => {
207
224
return Err ( Error :: unexpected_message (
208
225
"unterminated string value" ) ) ;
209
226
}
210
- _ => { }
227
+ _ => {
228
+
229
+ }
211
230
}
212
231
prev_char = cur_char;
213
232
}
0 commit comments