@@ -124,29 +124,33 @@ impl Definition {
124
124
125
125
let vis = self . visibility ( db) ;
126
126
127
- // FIXME:
128
- // The following logic are wrong that it does not search
129
- // for submodules within other files recursively.
130
-
131
127
if let Some ( Visibility :: Module ( module) ) = vis. and_then ( |it| it. into ( ) ) {
132
128
let module: Module = module. into ( ) ;
133
129
let mut res = FxHashMap :: default ( ) ;
134
- let src = module. definition_source ( db) ;
135
- let file_id = src. file_id . original_file ( db) ;
136
130
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) ) ;
149
152
}
153
+
150
154
return SearchScope :: new ( res) ;
151
155
}
152
156
0 commit comments