@@ -9,7 +9,7 @@ use url::lex_url;
9
9
use self :: email_address:: lex_email_address;
10
10
use crate :: char_ext:: CharExt ;
11
11
use crate :: punctuation:: { Punctuation , Quote } ;
12
- use crate :: { TokenKind , WordMetadata } ;
12
+ use crate :: { Number , TokenKind , WordMetadata } ;
13
13
14
14
#[ derive( Debug ) ]
15
15
pub struct FoundToken {
@@ -79,8 +79,15 @@ pub fn lex_number(source: &[char]) -> Option<FoundToken> {
79
79
// Find the longest possible valid number
80
80
while !s. is_empty ( ) {
81
81
if let Ok ( n) = s. parse :: < f64 > ( ) {
82
+ let precision = s. chars ( ) . rev ( ) . position ( |c| c == '.' ) . unwrap_or_default ( ) ;
83
+
82
84
return Some ( FoundToken {
83
- token : TokenKind :: Number ( n. into ( ) , None ) ,
85
+ token : TokenKind :: Number ( Number {
86
+ value : n. into ( ) ,
87
+ suffix : None ,
88
+ radix : 10 ,
89
+ precision,
90
+ } ) ,
84
91
next_index : s. len ( ) ,
85
92
} ) ;
86
93
}
@@ -119,7 +126,12 @@ pub fn lex_hex_number(source: &[char]) -> Option<FoundToken> {
119
126
// Should always succeed unless the logic above is broken
120
127
if let Ok ( n) = u64:: from_str_radix ( & s, 16 ) {
121
128
return Some ( FoundToken {
122
- token : TokenKind :: Number ( OrderedFloat ( n as f64 ) , None ) ,
129
+ token : TokenKind :: Number ( Number {
130
+ value : OrderedFloat ( n as f64 ) ,
131
+ suffix : None ,
132
+ radix : 16 ,
133
+ precision : 0 ,
134
+ } ) ,
123
135
next_index : s. len ( ) + 2 ,
124
136
} ) ;
125
137
}
@@ -232,7 +244,7 @@ mod tests {
232
244
assert ! ( matches!(
233
245
lex_hex_number( & source) ,
234
246
Some ( FoundToken {
235
- token: TokenKind :: Number ( _, None ) ,
247
+ token: TokenKind :: Number ( _) ,
236
248
..
237
249
} )
238
250
) ) ;
@@ -244,7 +256,7 @@ mod tests {
244
256
assert ! ( matches!(
245
257
lex_hex_number( & source) ,
246
258
Some ( FoundToken {
247
- token: TokenKind :: Number ( _, None ) ,
259
+ token: TokenKind :: Number ( _) ,
248
260
..
249
261
} )
250
262
) ) ;
@@ -256,7 +268,7 @@ mod tests {
256
268
assert ! ( matches!(
257
269
lex_hex_number( & source) ,
258
270
Some ( FoundToken {
259
- token: TokenKind :: Number ( _, None ) ,
271
+ token: TokenKind :: Number ( _) ,
260
272
..
261
273
} )
262
274
) ) ;
@@ -268,7 +280,7 @@ mod tests {
268
280
assert ! ( matches!(
269
281
lex_hex_number( & source) ,
270
282
Some ( FoundToken {
271
- token: TokenKind :: Number ( _, None ) ,
283
+ token: TokenKind :: Number ( _) ,
272
284
..
273
285
} )
274
286
) ) ;
@@ -280,7 +292,7 @@ mod tests {
280
292
assert ! ( matches!(
281
293
lex_hex_number( & source) ,
282
294
Some ( FoundToken {
283
- token: TokenKind :: Number ( _, None ) ,
295
+ token: TokenKind :: Number ( _) ,
284
296
..
285
297
} )
286
298
) ) ;
@@ -292,7 +304,7 @@ mod tests {
292
304
assert ! ( matches!(
293
305
lex_hex_number( & source) ,
294
306
Some ( FoundToken {
295
- token: TokenKind :: Number ( _, None ) ,
307
+ token: TokenKind :: Number ( _) ,
296
308
..
297
309
} )
298
310
) ) ;
0 commit comments