diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-07-29 20:02:39 +0100 |
---|---|---|
committer | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-07-29 20:02:39 +0100 |
commit | a5fe9f7a877bdb4dc35226d1cbac2b4870fde276 (patch) | |
tree | 578ec5757edfb8771a4c910479230db14055b020 | |
parent | 359b3376b32b38548c71e2b6e3a7393c4396ccf6 (diff) | |
parent | d79dc38e99f522be79b776b4b10090ecf175013c (diff) |
Merge #1604
1604: Fix failing type interference for floating point literal r=matklad a=theotherphil
Fixes https://github.com/rust-analyzer/rust-analyzer/issues/1592
Co-authored-by: Phil Ellison <[email protected]>
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 26 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/expr_extensions.rs | 22 |
2 files changed, 34 insertions, 14 deletions
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index 676711d0a..36dea17a3 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs | |||
@@ -334,6 +334,8 @@ fn infer_literals() { | |||
334 | infer(r##" | 334 | infer(r##" |
335 | fn test() { | 335 | fn test() { |
336 | 5i32; | 336 | 5i32; |
337 | 5f32; | ||
338 | 5f64; | ||
337 | "hello"; | 339 | "hello"; |
338 | b"bytes"; | 340 | b"bytes"; |
339 | 'c'; | 341 | 'c'; |
@@ -351,18 +353,20 @@ fn test() { | |||
351 | } | 353 | } |
352 | "##), | 354 | "##), |
353 | @r###" | 355 | @r###" |
354 | [11; 201) '{ ...o"#; }': () | 356 | [11; 221) '{ ...o"#; }': () |
355 | [17; 21) '5i32': i32 | 357 | [17; 21) '5i32': i32 |
356 | [27; 34) '"hello"': &str | 358 | [27; 31) '5f32': f32 |
357 | [40; 48) 'b"bytes"': &[u8] | 359 | [37; 41) '5f64': f64 |
358 | [54; 57) ''c'': char | 360 | [47; 54) '"hello"': &str |
359 | [63; 67) 'b'b'': u8 | 361 | [60; 68) 'b"bytes"': &[u8] |
360 | [73; 77) '3.14': f64 | 362 | [74; 77) ''c'': char |
361 | [83; 87) '5000': i32 | 363 | [83; 87) 'b'b'': u8 |
362 | [93; 98) 'false': bool | 364 | [93; 97) '3.14': f64 |
363 | [104; 108) 'true': bool | 365 | [103; 107) '5000': i32 |
364 | [114; 182) 'r#" ... "#': &str | 366 | [113; 118) 'false': bool |
365 | [188; 198) 'br#"yolo"#': &[u8]"### | 367 | [124; 128) 'true': bool |
368 | [134; 202) 'r#" ... "#': &str | ||
369 | [208; 218) 'br#"yolo"#': &[u8]"### | ||
366 | ); | 370 | ); |
367 | } | 371 | } |
368 | 372 | ||
diff --git a/crates/ra_syntax/src/ast/expr_extensions.rs b/crates/ra_syntax/src/ast/expr_extensions.rs index f9190d877..8284f1b25 100644 --- a/crates/ra_syntax/src/ast/expr_extensions.rs +++ b/crates/ra_syntax/src/ast/expr_extensions.rs | |||
@@ -239,16 +239,32 @@ impl ast::Literal { | |||
239 | pub fn kind(&self) -> LiteralKind { | 239 | pub fn kind(&self) -> LiteralKind { |
240 | match self.token().kind() { | 240 | match self.token().kind() { |
241 | INT_NUMBER => { | 241 | INT_NUMBER => { |
242 | let allowed_suffix_list = [ | 242 | let int_suffix_list = [ |
243 | "isize", "i128", "i64", "i32", "i16", "i8", "usize", "u128", "u64", "u32", | 243 | "isize", "i128", "i64", "i32", "i16", "i8", "usize", "u128", "u64", "u32", |
244 | "u16", "u8", | 244 | "u16", "u8", |
245 | ]; | 245 | ]; |
246 | |||
247 | // The lexer treats e.g. `1f64` as an integer literal. See | ||
248 | // https://github.com/rust-analyzer/rust-analyzer/issues/1592 | ||
249 | // and the comments on the linked PR. | ||
250 | let float_suffix_list = ["f32", "f64"]; | ||
251 | |||
246 | let text = self.token().text().to_string(); | 252 | let text = self.token().text().to_string(); |
247 | let suffix = allowed_suffix_list | 253 | |
254 | let float_suffix = float_suffix_list | ||
248 | .iter() | 255 | .iter() |
249 | .find(|&s| text.ends_with(s)) | 256 | .find(|&s| text.ends_with(s)) |
250 | .map(|&suf| SmolStr::new(suf)); | 257 | .map(|&suf| SmolStr::new(suf)); |
251 | LiteralKind::IntNumber { suffix } | 258 | |
259 | if float_suffix.is_some() { | ||
260 | LiteralKind::FloatNumber { suffix: float_suffix } | ||
261 | } else { | ||
262 | let suffix = int_suffix_list | ||
263 | .iter() | ||
264 | .find(|&s| text.ends_with(s)) | ||
265 | .map(|&suf| SmolStr::new(suf)); | ||
266 | LiteralKind::IntNumber { suffix } | ||
267 | } | ||
252 | } | 268 | } |
253 | FLOAT_NUMBER => { | 269 | FLOAT_NUMBER => { |
254 | let allowed_suffix_list = ["f64", "f32"]; | 270 | let allowed_suffix_list = ["f64", "f32"]; |