@@ -4,6 +4,7 @@ use either::Either;
44use hir:: { original_range, AssocItem , FieldSource , HasSource , InFile , ModuleSource } ;
55use ra_db:: { FileId , SourceDatabase } ;
66use ra_ide_db:: { defs:: Definition , RootDatabase } ;
7+ use ra_syntax:: ast:: AstToken ;
78use ra_syntax:: {
89 ast:: { self , DocCommentsOwner , NameOwner } ,
910 match_ast, AstNode , SmolStr ,
@@ -135,8 +136,8 @@ impl NavigationTarget {
135136 db : & RootDatabase ,
136137 node : InFile < & dyn ast:: NameOwner > ,
137138 ) -> NavigationTarget {
138- //FIXME: use `_` instead of empty string
139- let name = node. value . name ( ) . map ( |it| it. text ( ) . clone ( ) ) . unwrap_or_default ( ) ;
139+ let name =
140+ node. value . name ( ) . map ( |it| it. text ( ) . clone ( ) ) . unwrap_or_else ( || SmolStr :: new ( "_" ) ) ;
140141 let focus_range =
141142 node. value . name ( ) . map ( |it| original_range ( db, node. with_value ( it. syntax ( ) ) ) . range ) ;
142143 let frange = original_range ( db, node. map ( |it| it. syntax ( ) ) ) ;
@@ -150,6 +151,26 @@ impl NavigationTarget {
150151 )
151152 }
152153
154+ /// Allows `NavigationTarget` to be created from a `DocCommentsOwner` and a `NameOwner`
155+ pub ( crate ) fn from_doc_commented (
156+ db : & RootDatabase ,
157+ named : InFile < & dyn ast:: NameOwner > ,
158+ node : InFile < & dyn ast:: DocCommentsOwner > ,
159+ ) -> NavigationTarget {
160+ let name =
161+ named. value . name ( ) . map ( |it| it. text ( ) . clone ( ) ) . unwrap_or_else ( || SmolStr :: new ( "_" ) ) ;
162+ let focus_range = node. value . doc_comments ( ) . next ( ) . map ( |it| it. syntax ( ) . text_range ( ) ) ;
163+ let frange = original_range ( db, node. map ( |it| it. syntax ( ) ) ) ;
164+
165+ NavigationTarget :: from_syntax (
166+ frange. file_id ,
167+ name,
168+ focus_range,
169+ frange. range ,
170+ node. value . syntax ( ) . kind ( ) ,
171+ )
172+ }
173+
153174 fn from_syntax (
154175 file_id : FileId ,
155176 name : SmolStr ,
0 commit comments