Skip to content

Commit ca43bb3

Browse files
committed
Updated the add_missing_impl_members to use the shared utility.
1 parent f0f242c commit ca43bb3

File tree

2 files changed

+15
-34
lines changed

2 files changed

+15
-34
lines changed

crates/ra_assists/src/handlers/add_missing_impl_members.rs

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use ra_syntax::{
77
use crate::{
88
ast_transform::{self, AstTransform, QualifyPaths, SubstituteTypeParams},
99
Assist, AssistCtx, AssistId,
10+
utils::{get_missing_impl_items, resolve_target_trait},
1011
};
1112

1213
#[derive(PartialEq)]
@@ -103,11 +104,9 @@ fn add_missing_impl_members_inner(
103104
let impl_node = ctx.find_node_at_offset::<ast::ImplBlock>()?;
104105
let impl_item_list = impl_node.item_list()?;
105106

106-
let (trait_, trait_def) = {
107-
let analyzer = ctx.source_analyzer(impl_node.syntax(), None);
107+
let analyzer = ctx.source_analyzer(impl_node.syntax(), None);
108108

109-
resolve_target_trait_def(ctx.db, &analyzer, &impl_node)?
110-
};
109+
let trait_ = resolve_target_trait(ctx.db, &analyzer, &impl_node)?;
111110

112111
let def_name = |item: &ast::ImplItem| -> Option<SmolStr> {
113112
match item {
@@ -118,20 +117,23 @@ fn add_missing_impl_members_inner(
118117
.map(|it| it.text().clone())
119118
};
120119

121-
let trait_items = trait_def.item_list()?.impl_items();
122-
let impl_items = impl_item_list.impl_items().collect::<Vec<_>>();
123-
124-
let missing_items: Vec<_> = trait_items
125-
.filter(|t| def_name(t).is_some())
120+
let missing_items = get_missing_impl_items(ctx.db, &analyzer, &impl_node)
121+
.iter()
122+
.map(|i| match i {
123+
hir::AssocItem::Function(i) => ast::ImplItem::FnDef(i.source(ctx.db).value),
124+
hir::AssocItem::TypeAlias(i) => ast::ImplItem::TypeAliasDef(i.source(ctx.db).value),
125+
hir::AssocItem::Const(i) => ast::ImplItem::ConstDef(i.source(ctx.db).value),
126+
})
127+
.filter(|t| def_name(&t).is_some())
126128
.filter(|t| match t {
127129
ast::ImplItem::FnDef(def) => match mode {
128130
AddMissingImplMembersMode::DefaultMethodsOnly => def.body().is_some(),
129131
AddMissingImplMembersMode::NoDefaultMethods => def.body().is_none(),
130-
},
132+
}
131133
_ => mode == AddMissingImplMembersMode::NoDefaultMethods,
132134
})
133-
.filter(|t| impl_items.iter().all(|i| def_name(i) != def_name(t)))
134-
.collect();
135+
.collect::<Vec<_>>();
136+
135137
if missing_items.is_empty() {
136138
return None;
137139
}
@@ -177,27 +179,6 @@ fn add_body(fn_def: ast::FnDef) -> ast::FnDef {
177179
}
178180
}
179181

180-
/// Given an `ast::ImplBlock`, resolves the target trait (the one being
181-
/// implemented) to a `ast::TraitDef`.
182-
fn resolve_target_trait_def(
183-
db: &impl HirDatabase,
184-
analyzer: &hir::SourceAnalyzer,
185-
impl_block: &ast::ImplBlock,
186-
) -> Option<(hir::Trait, ast::TraitDef)> {
187-
let ast_path = impl_block
188-
.target_trait()
189-
.map(|it| it.syntax().clone())
190-
.and_then(ast::PathType::cast)?
191-
.path()?;
192-
193-
match analyzer.resolve_path(db, &ast_path) {
194-
Some(hir::PathResolution::Def(hir::ModuleDef::Trait(def))) => {
195-
Some((def, def.source(db).value))
196-
}
197-
_ => None,
198-
}
199-
}
200-
201182
#[cfg(test)]
202183
mod tests {
203184
use super::*;

crates/ra_assists/src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ pub fn get_missing_impl_items(
6262
})
6363
}
6464

65-
fn resolve_target_trait(
65+
pub(crate) fn resolve_target_trait(
6666
db: &impl HirDatabase,
6767
analyzer: &hir::SourceAnalyzer,
6868
impl_block: &ast::ImplBlock,

0 commit comments

Comments
 (0)