aboutsummaryrefslogtreecommitdiff
path: root/crates/assists
diff options
context:
space:
mode:
Diffstat (limited to 'crates/assists')
-rw-r--r--crates/assists/src/handlers/generate_impl.rs25
-rw-r--r--crates/assists/src/handlers/move_module_to_file.rs47
-rw-r--r--crates/assists/src/utils.rs9
3 files changed, 78 insertions, 3 deletions
diff --git a/crates/assists/src/handlers/generate_impl.rs b/crates/assists/src/handlers/generate_impl.rs
index 16a600e6f..a8e3c4fc2 100644
--- a/crates/assists/src/handlers/generate_impl.rs
+++ b/crates/assists/src/handlers/generate_impl.rs
@@ -122,6 +122,31 @@ mod tests {
122 $0 122 $0
123 }"#, 123 }"#,
124 ); 124 );
125
126 check_assist(
127 generate_impl,
128 r#"pub trait Trait {}
129struct Struct<T>$0
130where
131 T: Trait,
132{
133 inner: T,
134}"#,
135 r#"pub trait Trait {}
136struct Struct<T>
137where
138 T: Trait,
139{
140 inner: T,
141}
142
143impl<T> Struct<T>
144where
145 T: Trait,
146{
147 $0
148}"#,
149 );
125 } 150 }
126 151
127 #[test] 152 #[test]
diff --git a/crates/assists/src/handlers/move_module_to_file.rs b/crates/assists/src/handlers/move_module_to_file.rs
index 9d8579f47..91c395c1b 100644
--- a/crates/assists/src/handlers/move_module_to_file.rs
+++ b/crates/assists/src/handlers/move_module_to_file.rs
@@ -1,5 +1,6 @@
1use ast::edit::IndentLevel; 1use ast::{edit::IndentLevel, VisibilityOwner};
2use ide_db::base_db::AnchoredPathBuf; 2use ide_db::base_db::AnchoredPathBuf;
3use stdx::format_to;
3use syntax::{ 4use syntax::{
4 ast::{self, edit::AstNodeEdit, NameOwner}, 5 ast::{self, edit::AstNodeEdit, NameOwner},
5 AstNode, TextRange, 6 AstNode, TextRange,
@@ -59,7 +60,13 @@ pub(crate) fn move_module_to_file(acc: &mut Assists, ctx: &AssistContext) -> Opt
59 items 60 items
60 }; 61 };
61 62
62 builder.replace(module_ast.syntax().text_range(), format!("mod {};", module_name)); 63 let mut buf = String::new();
64 if let Some(v) = module_ast.visibility() {
65 format_to!(buf, "{} ", v);
66 }
67 format_to!(buf, "mod {};", module_name);
68
69 builder.replace(module_ast.syntax().text_range(), buf);
63 70
64 let dst = AnchoredPathBuf { anchor: ctx.frange.file_id, path }; 71 let dst = AnchoredPathBuf { anchor: ctx.frange.file_id, path };
65 builder.create_file(dst, contents); 72 builder.create_file(dst, contents);
@@ -138,6 +145,42 @@ fn f() {}
138 } 145 }
139 146
140 #[test] 147 #[test]
148 fn extract_public() {
149 check_assist(
150 move_module_to_file,
151 r#"
152pub mod $0tests {
153 #[test] fn t() {}
154}
155"#,
156 r#"
157//- /main.rs
158pub mod tests;
159//- /tests.rs
160#[test] fn t() {}
161"#,
162 );
163 }
164
165 #[test]
166 fn extract_public_crate() {
167 check_assist(
168 move_module_to_file,
169 r#"
170pub(crate) mod $0tests {
171 #[test] fn t() {}
172}
173"#,
174 r#"
175//- /main.rs
176pub(crate) mod tests;
177//- /tests.rs
178#[test] fn t() {}
179"#,
180 );
181 }
182
183 #[test]
141 fn available_before_curly() { 184 fn available_before_curly() {
142 mark::check!(available_before_curly); 185 mark::check!(available_before_curly);
143 check_assist_not_applicable(move_module_to_file, r#"mod m { $0 }"#); 186 check_assist_not_applicable(move_module_to_file, r#"mod m { $0 }"#);
diff --git a/crates/assists/src/utils.rs b/crates/assists/src/utils.rs
index 8418e6e12..0074da741 100644
--- a/crates/assists/src/utils.rs
+++ b/crates/assists/src/utils.rs
@@ -421,7 +421,14 @@ fn generate_impl_text_inner(adt: &ast::Adt, trait_text: Option<&str>, code: &str
421 format_to!(buf, "<{}>", lifetime_params.chain(type_params).format(", ")) 421 format_to!(buf, "<{}>", lifetime_params.chain(type_params).format(", "))
422 } 422 }
423 423
424 format_to!(buf, " {{\n{}\n}}", code); 424 match adt.where_clause() {
425 Some(where_clause) => {
426 format_to!(buf, "\n{}\n{{\n{}\n}}", where_clause, code);
427 }
428 None => {
429 format_to!(buf, " {{\n{}\n}}", code);
430 }
431 }
425 432
426 buf 433 buf
427} 434}