@@ -23,6 +23,30 @@ use super::dialect::keywords::ALL_KEYWORDS;
23
23
use super :: dialect:: Dialect ;
24
24
use std:: fmt;
25
25
26
+ #[ derive( Debug , Clone , PartialEq ) ]
27
+ pub struct LineColumn {
28
+ pub line : u64 ,
29
+ pub column : u64 ,
30
+ }
31
+
32
+ #[ derive( Debug , Clone , PartialEq ) ]
33
+ pub struct Span {
34
+ pub start : LineColumn ,
35
+ pub end : LineColumn ,
36
+ }
37
+
38
+ #[ derive( Debug , Clone , PartialEq ) ]
39
+ pub struct TokenOccurrence {
40
+ pub token : Token ,
41
+ pub span : Span ,
42
+ }
43
+
44
+ impl fmt:: Display for TokenOccurrence {
45
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
46
+ self . token . fmt ( f)
47
+ }
48
+ }
49
+
26
50
/// SQL Token enumeration
27
51
#[ derive( Debug , Clone , PartialEq ) ]
28
52
pub enum Token {
@@ -232,12 +256,17 @@ impl<'a> Tokenizer<'a> {
232
256
}
233
257
234
258
/// Tokenize the statement and produce a vector of tokens
235
- pub fn tokenize ( & mut self ) -> Result < Vec < Token > , TokenizerError > {
259
+ pub fn tokenize ( & mut self ) -> Result < Vec < TokenOccurrence > , TokenizerError > {
236
260
let mut peekable = self . query . chars ( ) . peekable ( ) ;
237
261
238
- let mut tokens: Vec < Token > = vec ! [ ] ;
262
+ let mut tokens: Vec < TokenOccurrence > = vec ! [ ] ;
239
263
240
264
while let Some ( token) = self . next_token ( & mut peekable) ? {
265
+ let token_start = LineColumn {
266
+ line : self . line ,
267
+ column : self . col ,
268
+ } ;
269
+
241
270
match & token {
242
271
Token :: Whitespace ( Whitespace :: Newline ) => {
243
272
self . line += 1 ;
@@ -252,8 +281,18 @@ impl<'a> Tokenizer<'a> {
252
281
_ => self . col += 1 ,
253
282
}
254
283
255
- tokens. push ( token) ;
284
+ tokens. push ( TokenOccurrence {
285
+ token,
286
+ span : Span {
287
+ start : token_start,
288
+ end : LineColumn {
289
+ line : self . line ,
290
+ column : self . col ,
291
+ } ,
292
+ } ,
293
+ } ) ;
256
294
}
295
+
257
296
Ok ( tokens)
258
297
}
259
298
@@ -805,7 +844,8 @@ mod tests {
805
844
compare ( expected, tokens) ;
806
845
}
807
846
808
- fn compare ( expected : Vec < Token > , actual : Vec < Token > ) {
847
+ fn compare ( expected : Vec < Token > , actual : Vec < TokenOccurrence > ) {
848
+ let actual: Vec < _ > = actual. into_iter ( ) . map ( |to| to. token ) . collect ( ) ;
809
849
//println!("------------------------------");
810
850
//println!("tokens = {:?}", actual);
811
851
//println!("expected = {:?}", expected);
0 commit comments