From 8e1a14a098b77b1be8888605f852eada029c816a Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Sun, 28 Jul 2019 18:41:29 +0100 Subject: Add failing test --- crates/ra_assists/src/add_explicit_type.rs | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'crates') diff --git a/crates/ra_assists/src/add_explicit_type.rs b/crates/ra_assists/src/add_explicit_type.rs index 88970929f..7c6080640 100644 --- a/crates/ra_assists/src/add_explicit_type.rs +++ b/crates/ra_assists/src/add_explicit_type.rs @@ -69,6 +69,16 @@ mod tests { ); } + // https://github.com/rust-analyzer/rust-analyzer/issues/1592 + #[test] + fn add_explicit_type_infers_correct_type_for_floating_point_literal() { + check_assist( + add_explicit_type, + "fn f() { let a<|> = 42f64; }", + "fn f() { let a<|>: f64 = 42f64; }", + ); + } + #[test] fn add_explicit_type_not_applicable_if_ty_not_inferred() { check_assist_not_applicable(add_explicit_type, "fn f() { let a<|> = None; }"); -- cgit v1.2.3 From fe1b1dd7d9edde081c4c95facc19e801863beaff Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Sun, 28 Jul 2019 19:52:30 +0100 Subject: More direct failing test --- crates/ra_syntax/src/parsing/lexer.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'crates') diff --git a/crates/ra_syntax/src/parsing/lexer.rs b/crates/ra_syntax/src/parsing/lexer.rs index 2a4343b0a..f75e321c3 100644 --- a/crates/ra_syntax/src/parsing/lexer.rs +++ b/crates/ra_syntax/src/parsing/lexer.rs @@ -145,3 +145,16 @@ pub fn classify_literal(text: &str) -> Option { }; Some(Token { kind, len: TextUnit::from_usize(t.len) }) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn lex_float_literal() { + assert_eq!( + tokenize("42f64")[0], + Token { kind: FLOAT_NUMBER, len: TextUnit::from_usize(5)} + ); + } +} \ No newline at end of file -- cgit v1.2.3 From 578bc05ca41e095c61c64bdef255760c26736a11 Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Sun, 28 Jul 2019 20:25:06 +0100 Subject: Add issue link and trailing newline --- crates/ra_syntax/src/parsing/lexer.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'crates') diff --git a/crates/ra_syntax/src/parsing/lexer.rs b/crates/ra_syntax/src/parsing/lexer.rs index f75e321c3..45ef88ac0 100644 --- a/crates/ra_syntax/src/parsing/lexer.rs +++ b/crates/ra_syntax/src/parsing/lexer.rs @@ -150,6 +150,7 @@ pub fn classify_literal(text: &str) -> Option { mod tests { use super::*; + // https://github.com/rust-analyzer/rust-analyzer/issues/1592 #[test] fn lex_float_literal() { assert_eq!( @@ -157,4 +158,4 @@ mod tests { Token { kind: FLOAT_NUMBER, len: TextUnit::from_usize(5)} ); } -} \ No newline at end of file +} -- cgit v1.2.3 From 4fd7ad908b6e7cee0ee7853fcf29fb5a38a19aa2 Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Sun, 28 Jul 2019 20:47:44 +0100 Subject: Add special case for f32 and f43 suffices on Literal.kind --- crates/ra_assists/src/add_explicit_type.rs | 5 +++++ crates/ra_syntax/src/ast/expr_extensions.rs | 24 +++++++++++++++++++++--- crates/ra_syntax/src/parsing/lexer.rs | 14 -------------- 3 files changed, 26 insertions(+), 17 deletions(-) (limited to 'crates') diff --git a/crates/ra_assists/src/add_explicit_type.rs b/crates/ra_assists/src/add_explicit_type.rs index 7c6080640..2ed03e5e9 100644 --- a/crates/ra_assists/src/add_explicit_type.rs +++ b/crates/ra_assists/src/add_explicit_type.rs @@ -77,6 +77,11 @@ mod tests { "fn f() { let a<|> = 42f64; }", "fn f() { let a<|>: f64 = 42f64; }", ); + check_assist( + add_explicit_type, + "fn f() { let a<|> = 42f32; }", + "fn f() { let a<|>: f32 = 42f32; }", + ); } #[test] diff --git a/crates/ra_syntax/src/ast/expr_extensions.rs b/crates/ra_syntax/src/ast/expr_extensions.rs index f9190d877..745dece98 100644 --- a/crates/ra_syntax/src/ast/expr_extensions.rs +++ b/crates/ra_syntax/src/ast/expr_extensions.rs @@ -239,16 +239,34 @@ impl ast::Literal { pub fn kind(&self) -> LiteralKind { match self.token().kind() { INT_NUMBER => { - let allowed_suffix_list = [ + let int_suffix_list = [ "isize", "i128", "i64", "i32", "i16", "i8", "usize", "u128", "u64", "u32", "u16", "u8", ]; + + // The lexer treats e.g. `1f64` as an integer literal. See + // https://github.com/rust-analyzer/rust-analyzer/issues/1592 + // and the comments on the linked PR. + let float_suffix_list = [ + "f32", "f64" + ]; + let text = self.token().text().to_string(); - let suffix = allowed_suffix_list + + let float_suffix = float_suffix_list .iter() .find(|&s| text.ends_with(s)) .map(|&suf| SmolStr::new(suf)); - LiteralKind::IntNumber { suffix } + + if float_suffix.is_some() { + LiteralKind::FloatNumber { suffix: float_suffix } + } else { + let suffix = int_suffix_list + .iter() + .find(|&s| text.ends_with(s)) + .map(|&suf| SmolStr::new(suf)); + LiteralKind::IntNumber { suffix } + } } FLOAT_NUMBER => { let allowed_suffix_list = ["f64", "f32"]; diff --git a/crates/ra_syntax/src/parsing/lexer.rs b/crates/ra_syntax/src/parsing/lexer.rs index 45ef88ac0..2a4343b0a 100644 --- a/crates/ra_syntax/src/parsing/lexer.rs +++ b/crates/ra_syntax/src/parsing/lexer.rs @@ -145,17 +145,3 @@ pub fn classify_literal(text: &str) -> Option { }; Some(Token { kind, len: TextUnit::from_usize(t.len) }) } - -#[cfg(test)] -mod tests { - use super::*; - - // https://github.com/rust-analyzer/rust-analyzer/issues/1592 - #[test] - fn lex_float_literal() { - assert_eq!( - tokenize("42f64")[0], - Token { kind: FLOAT_NUMBER, len: TextUnit::from_usize(5)} - ); - } -} -- cgit v1.2.3 From fab8e9bb8a2657d397a5d52595a83d428dcbd7b8 Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Sun, 28 Jul 2019 20:54:37 +0100 Subject: cargo format --- crates/ra_syntax/src/ast/expr_extensions.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'crates') diff --git a/crates/ra_syntax/src/ast/expr_extensions.rs b/crates/ra_syntax/src/ast/expr_extensions.rs index 745dece98..8284f1b25 100644 --- a/crates/ra_syntax/src/ast/expr_extensions.rs +++ b/crates/ra_syntax/src/ast/expr_extensions.rs @@ -247,9 +247,7 @@ impl ast::Literal { // The lexer treats e.g. `1f64` as an integer literal. See // https://github.com/rust-analyzer/rust-analyzer/issues/1592 // and the comments on the linked PR. - let float_suffix_list = [ - "f32", "f64" - ]; + let float_suffix_list = ["f32", "f64"]; let text = self.token().text().to_string(); -- cgit v1.2.3 From d79dc38e99f522be79b776b4b10090ecf175013c Mon Sep 17 00:00:00 2001 From: Phil Ellison Date: Mon, 29 Jul 2019 19:02:03 +0100 Subject: Move assist test, add literal type inference test --- crates/ra_assists/src/add_explicit_type.rs | 15 --------------- crates/ra_hir/src/ty/tests.rs | 26 +++++++++++++++----------- 2 files changed, 15 insertions(+), 26 deletions(-) (limited to 'crates') diff --git a/crates/ra_assists/src/add_explicit_type.rs b/crates/ra_assists/src/add_explicit_type.rs index 2ed03e5e9..88970929f 100644 --- a/crates/ra_assists/src/add_explicit_type.rs +++ b/crates/ra_assists/src/add_explicit_type.rs @@ -69,21 +69,6 @@ mod tests { ); } - // https://github.com/rust-analyzer/rust-analyzer/issues/1592 - #[test] - fn add_explicit_type_infers_correct_type_for_floating_point_literal() { - check_assist( - add_explicit_type, - "fn f() { let a<|> = 42f64; }", - "fn f() { let a<|>: f64 = 42f64; }", - ); - check_assist( - add_explicit_type, - "fn f() { let a<|> = 42f32; }", - "fn f() { let a<|>: f32 = 42f32; }", - ); - } - #[test] fn add_explicit_type_not_applicable_if_ty_not_inferred() { check_assist_not_applicable(add_explicit_type, "fn f() { let a<|> = None; }"); 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() { infer(r##" fn test() { 5i32; + 5f32; + 5f64; "hello"; b"bytes"; 'c'; @@ -351,18 +353,20 @@ fn test() { } "##), @r###" -[11; 201) '{ ...o"#; }': () +[11; 221) '{ ...o"#; }': () [17; 21) '5i32': i32 -[27; 34) '"hello"': &str -[40; 48) 'b"bytes"': &[u8] -[54; 57) ''c'': char -[63; 67) 'b'b'': u8 -[73; 77) '3.14': f64 -[83; 87) '5000': i32 -[93; 98) 'false': bool -[104; 108) 'true': bool -[114; 182) 'r#" ... "#': &str -[188; 198) 'br#"yolo"#': &[u8]"### +[27; 31) '5f32': f32 +[37; 41) '5f64': f64 +[47; 54) '"hello"': &str +[60; 68) 'b"bytes"': &[u8] +[74; 77) ''c'': char +[83; 87) 'b'b'': u8 +[93; 97) '3.14': f64 +[103; 107) '5000': i32 +[113; 118) 'false': bool +[124; 128) 'true': bool +[134; 202) 'r#" ... "#': &str +[208; 218) 'br#"yolo"#': &[u8]"### ); } -- cgit v1.2.3