Skip to content

Commit 61fafa9

Browse files
committed
Add tailexpr & -> &mut for generate_mut_trait_impl
1 parent 83de70f commit 61fafa9

File tree

2 files changed

+20
-5
lines changed

2 files changed

+20
-5
lines changed

src/tools/rust-analyzer/crates/ide-assists/src/handlers/generate_mut_trait_impl.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use ide_db::{famous_defs::FamousDefs, traits::resolve_target_trait};
22
use syntax::{
3-
AstNode,
3+
AstNode, T,
44
ast::{self, edit_in_place::Indent, make},
55
ted,
66
};
@@ -32,7 +32,7 @@ use crate::{AssistContext, AssistId, Assists};
3232
//
3333
// $0impl<T> core::ops::IndexMut<Axis> for [T; 3] {
3434
// fn index_mut(&mut self, index: Axis) -> &mut Self::Output {
35-
// &self[index as usize]
35+
// &mut self[index as usize]
3636
// }
3737
// }
3838
//
@@ -92,6 +92,7 @@ pub(crate) fn generate_mut_trait_impl(acc: &mut Assists, ctx: &AssistContext<'_>
9292
ast::AssocItem::Fn(f) => Some(f),
9393
_ => None,
9494
})?;
95+
let _ = process_ref_mut(&fn_);
9596

9697
let assoc_list = make::assoc_item_list().clone_for_update();
9798
ted::replace(impl_def.assoc_item_list()?.syntax(), assoc_list.syntax());
@@ -108,6 +109,20 @@ pub(crate) fn generate_mut_trait_impl(acc: &mut Assists, ctx: &AssistContext<'_>
108109
)
109110
}
110111

112+
fn process_ref_mut(fn_: &ast::Fn) -> Option<()> {
113+
let expr = fn_.body()?.tail_expr()?;
114+
match &expr {
115+
ast::Expr::RefExpr(ref_expr) if ref_expr.mut_token().is_none() => {
116+
ted::insert_all_raw(
117+
ted::Position::after(ref_expr.amp_token()?),
118+
vec![make::token(T![mut]).into(), make::tokens::whitespace(" ").into()],
119+
);
120+
}
121+
_ => {}
122+
}
123+
None
124+
}
125+
111126
fn get_trait_mut(apply_trait: &hir::Trait, famous: FamousDefs<'_, '_>) -> Option<&'static str> {
112127
let trait_ = Some(apply_trait);
113128
if trait_ == famous.core_convert_Index().as_ref() {
@@ -167,7 +182,7 @@ pub enum Axis { X = 0, Y = 1, Z = 2 }
167182
168183
$0impl<T> core::ops::IndexMut<Axis> for [T; 3] {
169184
fn index_mut(&mut self, index: Axis) -> &mut Self::Output {
170-
&self[index as usize]
185+
&mut self[index as usize]
171186
}
172187
}
173188
@@ -234,7 +249,7 @@ struct Foo(i32);
234249
235250
$0impl core::convert::AsMut<i32> for Foo {
236251
fn as_mut(&mut self) -> &mut i32 {
237-
&self.0
252+
&mut self.0
238253
}
239254
}
240255

src/tools/rust-analyzer/crates/ide-assists/src/tests/generated.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1933,7 +1933,7 @@ pub enum Axis { X = 0, Y = 1, Z = 2 }
19331933
19341934
$0impl<T> core::ops::IndexMut<Axis> for [T; 3] {
19351935
fn index_mut(&mut self, index: Axis) -> &mut Self::Output {
1936-
&self[index as usize]
1936+
&mut self[index as usize]
19371937
}
19381938
}
19391939

0 commit comments

Comments
 (0)