diff options
-rw-r--r-- | crates/ra_assists/src/assist_ctx.rs | 8 | ||||
-rw-r--r-- | crates/ra_assists/src/handlers/add_function.rs | 24 | ||||
-rw-r--r-- | crates/ra_text_edit/src/lib.rs | 4 |
3 files changed, 17 insertions, 19 deletions
diff --git a/crates/ra_assists/src/assist_ctx.rs b/crates/ra_assists/src/assist_ctx.rs index 600e5689c..cbf1963b7 100644 --- a/crates/ra_assists/src/assist_ctx.rs +++ b/crates/ra_assists/src/assist_ctx.rs | |||
@@ -256,10 +256,10 @@ impl<'a, 'b> ActionBuilder<'a, 'b> { | |||
256 | } | 256 | } |
257 | 257 | ||
258 | fn build(self) -> AssistAction { | 258 | fn build(self) -> AssistAction { |
259 | AssistAction { | 259 | let edit = self.edit.finish(); |
260 | edit: self.edit.finish(), | 260 | if edit.is_empty() && self.cursor_position.is_none() { |
261 | cursor_position: self.cursor_position, | 261 | panic!("Only call `add_assist` if the assist can be applied") |
262 | file: self.file, | ||
263 | } | 262 | } |
263 | AssistAction { edit, cursor_position: self.cursor_position, file: self.file } | ||
264 | } | 264 | } |
265 | } | 265 | } |
diff --git a/crates/ra_assists/src/handlers/add_function.rs b/crates/ra_assists/src/handlers/add_function.rs index 76c0f9783..1d9d4e638 100644 --- a/crates/ra_assists/src/handlers/add_function.rs +++ b/crates/ra_assists/src/handlers/add_function.rs | |||
@@ -58,13 +58,11 @@ pub(crate) fn add_function(ctx: AssistCtx) -> Option<Assist> { | |||
58 | let function_builder = FunctionBuilder::from_call(&ctx, &call, &path, target_module)?; | 58 | let function_builder = FunctionBuilder::from_call(&ctx, &call, &path, target_module)?; |
59 | 59 | ||
60 | let target = call.syntax().text_range(); | 60 | let target = call.syntax().text_range(); |
61 | // TODO: assert here? | ||
62 | ctx.add_assist(AssistId("add_function"), "Add function", target, |edit| { | 61 | ctx.add_assist(AssistId("add_function"), "Add function", target, |edit| { |
63 | if let Some(function_template) = function_builder.render() { | 62 | let function_template = function_builder.render(); |
64 | edit.set_file(function_template.file); | 63 | edit.set_file(function_template.file); |
65 | edit.set_cursor(function_template.cursor_offset); | 64 | edit.set_cursor(function_template.cursor_offset); |
66 | edit.insert(function_template.insert_offset, function_template.fn_def.to_string()); | 65 | edit.insert(function_template.insert_offset, function_template.fn_def.to_string()); |
67 | } | ||
68 | }) | 66 | }) |
69 | } | 67 | } |
70 | 68 | ||
@@ -107,7 +105,7 @@ impl FunctionBuilder { | |||
107 | Some(Self { target, fn_name, type_params, params, file, needs_pub }) | 105 | Some(Self { target, fn_name, type_params, params, file, needs_pub }) |
108 | } | 106 | } |
109 | 107 | ||
110 | fn render(self) -> Option<FunctionTemplate> { | 108 | fn render(self) -> FunctionTemplate { |
111 | let placeholder_expr = ast::make::expr_todo(); | 109 | let placeholder_expr = ast::make::expr_todo(); |
112 | let fn_body = ast::make::block_expr(vec![], Some(placeholder_expr)); | 110 | let fn_body = ast::make::block_expr(vec![], Some(placeholder_expr)); |
113 | let mut fn_def = ast::make::fn_def(self.fn_name, self.type_params, self.params, fn_body); | 111 | let mut fn_def = ast::make::fn_def(self.fn_name, self.type_params, self.params, fn_body); |
@@ -133,15 +131,11 @@ impl FunctionBuilder { | |||
133 | } | 131 | } |
134 | }; | 132 | }; |
135 | 133 | ||
136 | let cursor_offset_from_fn_start = fn_def | 134 | let placeholder_expr = |
137 | .syntax() | 135 | fn_def.syntax().descendants().find_map(ast::MacroCall::cast).unwrap(); |
138 | .descendants() | 136 | let cursor_offset_from_fn_start = placeholder_expr.syntax().text_range().start(); |
139 | .find_map(ast::MacroCall::cast)? | ||
140 | .syntax() | ||
141 | .text_range() | ||
142 | .start(); | ||
143 | let cursor_offset = insert_offset + cursor_offset_from_fn_start; | 137 | let cursor_offset = insert_offset + cursor_offset_from_fn_start; |
144 | Some(FunctionTemplate { insert_offset, cursor_offset, fn_def, file: self.file }) | 138 | FunctionTemplate { insert_offset, cursor_offset, fn_def, file: self.file } |
145 | } | 139 | } |
146 | } | 140 | } |
147 | 141 | ||
diff --git a/crates/ra_text_edit/src/lib.rs b/crates/ra_text_edit/src/lib.rs index 64b67f2ad..3409713ff 100644 --- a/crates/ra_text_edit/src/lib.rs +++ b/crates/ra_text_edit/src/lib.rs | |||
@@ -71,6 +71,10 @@ impl TextEdit { | |||
71 | TextEdit { indels } | 71 | TextEdit { indels } |
72 | } | 72 | } |
73 | 73 | ||
74 | pub fn is_empty(&self) -> bool { | ||
75 | self.indels.is_empty() | ||
76 | } | ||
77 | |||
74 | pub fn as_indels(&self) -> &[Indel] { | 78 | pub fn as_indels(&self) -> &[Indel] { |
75 | &self.indels | 79 | &self.indels |
76 | } | 80 | } |