@@ -124,29 +124,33 @@ impl Definition {
124124
125125 let vis = self . visibility ( db) ;
126126
127- // FIXME:
128- // The following logic are wrong that it does not search
129- // for submodules within other files recursively.
130-
131127 if let Some ( Visibility :: Module ( module) ) = vis. and_then ( |it| it. into ( ) ) {
132128 let module: Module = module. into ( ) ;
133129 let mut res = FxHashMap :: default ( ) ;
134- let src = module. definition_source ( db) ;
135- let file_id = src. file_id . original_file ( db) ;
136130
137- match src. value {
138- ModuleSource :: Module ( m) => {
139- let range = Some ( m. syntax ( ) . text_range ( ) ) ;
140- res. insert ( file_id, range) ;
141- }
142- ModuleSource :: SourceFile ( _) => {
143- res. insert ( file_id, None ) ;
144- res. extend ( module. children ( db) . map ( |m| {
145- let src = m. definition_source ( db) ;
146- ( src. file_id . original_file ( db) , None )
147- } ) ) ;
148- }
131+ let mut to_visit = vec ! [ module] ;
132+ let mut is_first = true ;
133+ while let Some ( module) = to_visit. pop ( ) {
134+ let src = module. definition_source ( db) ;
135+ let file_id = src. file_id . original_file ( db) ;
136+ match src. value {
137+ ModuleSource :: Module ( m) => {
138+ if is_first {
139+ let range = Some ( m. syntax ( ) . text_range ( ) ) ;
140+ res. insert ( file_id, range) ;
141+ } else {
142+ // We have already added the enclosing file to the search scope,
143+ // so do nothing.
144+ }
145+ }
146+ ModuleSource :: SourceFile ( _) => {
147+ res. insert ( file_id, None ) ;
148+ }
149+ } ;
150+ is_first = false ;
151+ to_visit. extend ( module. children ( db) ) ;
149152 }
153+
150154 return SearchScope :: new ( res) ;
151155 }
152156
0 commit comments