aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-07-29 20:02:39 +0100
committerbors[bot] <26634292+bors[bot]@users.noreply.github.com>2019-07-29 20:02:39 +0100
commita5fe9f7a877bdb4dc35226d1cbac2b4870fde276 (patch)
tree578ec5757edfb8771a4c910479230db14055b020
parent359b3376b32b38548c71e2b6e3a7393c4396ccf6 (diff)
parentd79dc38e99f522be79b776b4b10090ecf175013c (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.rs26
-rw-r--r--crates/ra_syntax/src/ast/expr_extensions.rs22
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##"
335fn test() { 335fn 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"];