Skip to content

Commit 8ef9703

Browse files
committed
recursively search submodules
1 parent c575da1 commit 8ef9703

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

crates/ra_ide_db/src/search.rs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)