aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenČ›iu Nicola <[email protected]>2020-06-23 07:41:43 +0100
committerLaurenČ›iu Nicola <[email protected]>2020-06-23 14:51:07 +0100
commit76ddface089886c88b8b29e3893119f38ef26aab (patch)
tree9df8e5f774a385d64669f3883a9fef1b6aebb9a2
parent98c3e4e887dcc5a8242c3e67c04a3cedbb1b9c58 (diff)
Fix panic in split and merge import assists
-rw-r--r--crates/ra_assists/src/handlers/merge_imports.rs12
-rw-r--r--crates/ra_assists/src/handlers/split_import.rs10
-rw-r--r--crates/ra_parser/src/grammar/paths.rs8
-rw-r--r--crates/ra_syntax/test_data/parser/err/0004_use_path_bad_segment.rast5
-rw-r--r--crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rast15
-rw-r--r--crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rs1
-rw-r--r--docs/dev/README.md2
7 files changed, 49 insertions, 4 deletions
diff --git a/crates/ra_assists/src/handlers/merge_imports.rs b/crates/ra_assists/src/handlers/merge_imports.rs
index 972d16241..ac0b3035c 100644
--- a/crates/ra_assists/src/handlers/merge_imports.rs
+++ b/crates/ra_assists/src/handlers/merge_imports.rs
@@ -127,7 +127,7 @@ fn first_path(path: &ast::Path) -> ast::Path {
127 127
128#[cfg(test)] 128#[cfg(test)]
129mod tests { 129mod tests {
130 use crate::tests::check_assist; 130 use crate::tests::{check_assist, check_assist_not_applicable};
131 131
132 use super::*; 132 use super::*;
133 133
@@ -276,4 +276,14 @@ bar::baz};
276", 276",
277 ) 277 )
278 } 278 }
279
280 #[test]
281 fn test_empty_use() {
282 check_assist_not_applicable(
283 merge_imports,
284 r"
285use std::<|>
286fn main() {}",
287 );
288 }
279} 289}
diff --git a/crates/ra_assists/src/handlers/split_import.rs b/crates/ra_assists/src/handlers/split_import.rs
index c7a874480..38aa199a0 100644
--- a/crates/ra_assists/src/handlers/split_import.rs
+++ b/crates/ra_assists/src/handlers/split_import.rs
@@ -66,4 +66,14 @@ mod tests {
66 fn issue4044() { 66 fn issue4044() {
67 check_assist_not_applicable(split_import, "use crate::<|>:::self;") 67 check_assist_not_applicable(split_import, "use crate::<|>:::self;")
68 } 68 }
69
70 #[test]
71 fn test_empty_use() {
72 check_assist_not_applicable(
73 split_import,
74 r"
75use std::<|>
76fn main() {}",
77 );
78 }
69} 79}
diff --git a/crates/ra_parser/src/grammar/paths.rs b/crates/ra_parser/src/grammar/paths.rs
index 428aa711e..fd51189d5 100644
--- a/crates/ra_parser/src/grammar/paths.rs
+++ b/crates/ra_parser/src/grammar/paths.rs
@@ -73,8 +73,10 @@ fn path_segment(p: &mut Parser, mode: Mode, first: bool) {
73 } 73 }
74 p.expect(T![>]); 74 p.expect(T![>]);
75 } else { 75 } else {
76 let mut empty = true;
76 if first { 77 if first {
77 p.eat(T![::]); 78 p.eat(T![::]);
79 empty = false;
78 } 80 }
79 match p.current() { 81 match p.current() {
80 IDENT => { 82 IDENT => {
@@ -86,6 +88,12 @@ fn path_segment(p: &mut Parser, mode: Mode, first: bool) {
86 T![self] | T![super] | T![crate] => p.bump_any(), 88 T![self] | T![super] | T![crate] => p.bump_any(),
87 _ => { 89 _ => {
88 p.err_recover("expected identifier", items::ITEM_RECOVERY_SET); 90 p.err_recover("expected identifier", items::ITEM_RECOVERY_SET);
91 if empty {
92 // test_err empty_segment
93 // use crate::;
94 m.abandon(p);
95 return;
96 }
89 } 97 }
90 }; 98 };
91 } 99 }
diff --git a/crates/ra_syntax/test_data/parser/err/0004_use_path_bad_segment.rast b/crates/ra_syntax/test_data/parser/err/0004_use_path_bad_segment.rast
index 8c6b89dc2..b3bcf472a 100644
--- a/crates/ra_syntax/test_data/parser/err/0004_use_path_bad_segment.rast
+++ b/crates/ra_syntax/test_data/parser/err/0004_use_path_bad_segment.rast
@@ -9,8 +9,7 @@ [email protected]
9 [email protected] 9 [email protected]
10 [email protected] "foo" 10 [email protected] "foo"
11 [email protected] "::" 11 [email protected] "::"
12 [email protected] 12 [email protected]
13 [email protected] 13 [email protected] "92"
14 [email protected] "92"
15 [email protected] ";" 14 [email protected] ";"
16error 9..9: expected identifier 15error 9..9: expected identifier
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rast b/crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rast
new file mode 100644
index 000000000..da8505607
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rast
@@ -0,0 +1,15 @@
1[email protected]
2 [email protected]
3 [email protected] "use"
4 [email protected] " "
5 [email protected]
6 [email protected]
7 [email protected]
8 [email protected]
9 [email protected] "crate"
10 [email protected] "::"
11 [email protected]
12 [email protected] ";"
13 [email protected] "\n"
14error 11..11: expected identifier
15error 12..12: expected SEMICOLON
diff --git a/crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rs b/crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rs
new file mode 100644
index 000000000..7510664e1
--- /dev/null
+++ b/crates/ra_syntax/test_data/parser/inline/err/0015_empty_segment.rs
@@ -0,0 +1 @@
use crate::;
diff --git a/docs/dev/README.md b/docs/dev/README.md
index 1b63d8223..76e1da6cf 100644
--- a/docs/dev/README.md
+++ b/docs/dev/README.md
@@ -348,6 +348,8 @@ To update test data, run with `UPDATE_EXPECTATIONS` variable:
348env UPDATE_EXPECTATIONS=1 cargo qt 348env UPDATE_EXPECTATIONS=1 cargo qt
349``` 349```
350 350
351After adding a new inline test you need to run `cargo xtest codegen` and also update the test data as described above.
352
351# Logging 353# Logging
352 354
353Logging is done by both rust-analyzer and VS Code, so it might be tricky to 355Logging is done by both rust-analyzer and VS Code, so it might be tricky to