@@ -7,6 +7,7 @@ use ra_syntax::{
77use 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) ]
202183mod tests {
203184 use super :: * ;
0 commit comments