diff options
Diffstat (limited to 'crates/ra_syntax/src')
-rw-r--r-- | crates/ra_syntax/src/ast/expr_extensions.rs | 50 |
1 files changed, 20 insertions, 30 deletions
diff --git a/crates/ra_syntax/src/ast/expr_extensions.rs b/crates/ra_syntax/src/ast/expr_extensions.rs index 6da4b1309..e609e02dc 100644 --- a/crates/ra_syntax/src/ast/expr_extensions.rs +++ b/crates/ra_syntax/src/ast/expr_extensions.rs | |||
@@ -305,44 +305,34 @@ impl ast::Literal { | |||
305 | .unwrap() | 305 | .unwrap() |
306 | } | 306 | } |
307 | 307 | ||
308 | pub fn kind(&self) -> LiteralKind { | 308 | fn find_suffix(text: &str, possible_suffixes: &[&str]) -> Option<SmolStr> { |
309 | match self.token().kind() { | 309 | possible_suffixes |
310 | INT_NUMBER => { | 310 | .iter() |
311 | let int_suffix_list = [ | 311 | .find(|&suffix| text.ends_with(suffix)) |
312 | "isize", "i128", "i64", "i32", "i16", "i8", "usize", "u128", "u64", "u32", | 312 | .map(|&suffix| SmolStr::new(suffix)) |
313 | "u16", "u8", | 313 | } |
314 | ]; | ||
315 | 314 | ||
316 | // The lexer treats e.g. `1f64` as an integer literal. See | 315 | pub fn kind(&self) -> LiteralKind { |
317 | // https://github.com/rust-analyzer/rust-analyzer/issues/1592 | 316 | const INT_SUFFIXES: [&'static str; 12] = [ |
318 | // and the comments on the linked PR. | 317 | "u64", "u32", "u16", "u8", "usize", "isize", "i64", "i32", "i16", "i8", "u128", "i128", |
319 | let float_suffix_list = ["f32", "f64"]; | 318 | ]; |
319 | const FLOAT_SUFFIXES: [&'static str; 2] = ["f32", "f64"]; | ||
320 | 320 | ||
321 | let text = self.token().text().to_string(); | 321 | let token = self.token(); |
322 | 322 | ||
323 | let float_suffix = float_suffix_list | 323 | match token.kind() { |
324 | .iter() | 324 | INT_NUMBER => { |
325 | .find(|&s| text.ends_with(s)) | 325 | let text = token.text(); |
326 | .map(|&suf| SmolStr::new(suf)); | ||
327 | 326 | ||
328 | if float_suffix.is_some() { | 327 | if let suffix @ Some(_) = Self::find_suffix(&text, &FLOAT_SUFFIXES) { |
329 | LiteralKind::FloatNumber { suffix: float_suffix } | 328 | LiteralKind::FloatNumber { suffix } |
330 | } else { | 329 | } else { |
331 | let suffix = int_suffix_list | 330 | LiteralKind::IntNumber { suffix: Self::find_suffix(&text, &INT_SUFFIXES) } |
332 | .iter() | ||
333 | .find(|&s| text.ends_with(s)) | ||
334 | .map(|&suf| SmolStr::new(suf)); | ||
335 | LiteralKind::IntNumber { suffix } | ||
336 | } | 331 | } |
337 | } | 332 | } |
338 | FLOAT_NUMBER => { | 333 | FLOAT_NUMBER => { |
339 | let allowed_suffix_list = ["f64", "f32"]; | 334 | let text = token.text(); |
340 | let text = self.token().text().to_string(); | 335 | LiteralKind::FloatNumber { suffix: Self::find_suffix(&text, &FLOAT_SUFFIXES) } |
341 | let suffix = allowed_suffix_list | ||
342 | .iter() | ||
343 | .find(|&s| text.ends_with(s)) | ||
344 | .map(|&suf| SmolStr::new(suf)); | ||
345 | LiteralKind::FloatNumber { suffix } | ||
346 | } | 336 | } |
347 | STRING | RAW_STRING => LiteralKind::String, | 337 | STRING | RAW_STRING => LiteralKind::String, |
348 | T![true] | T![false] => LiteralKind::Bool, | 338 | T![true] | T![false] => LiteralKind::Bool, |