aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide_db/src/search.rs
diff options
context:
space:
mode:
authorMikhail Rakhmanov <[email protected]>2020-06-03 19:10:54 +0100
committerMikhail Rakhmanov <[email protected]>2020-06-03 19:10:54 +0100
commiteefa10bc6bff3624ddd0bbb6bc89d8beb4bed186 (patch)
tree15c38c2993c52f4065d338090ca9185cc1fcd3da /crates/ra_ide_db/src/search.rs
parenta9d567584857b1be4ca8eaa5ef2c7d85f7b2845e (diff)
parent794f6da821c5d6e2490b996baffe162e4753262d (diff)
Merge branch 'master' into assists_extract_enum
Diffstat (limited to 'crates/ra_ide_db/src/search.rs')
-rw-r--r--crates/ra_ide_db/src/search.rs40
1 files changed, 22 insertions, 18 deletions
diff --git a/crates/ra_ide_db/src/search.rs b/crates/ra_ide_db/src/search.rs
index 589f44771..335a1ad03 100644
--- a/crates/ra_ide_db/src/search.rs
+++ b/crates/ra_ide_db/src/search.rs
@@ -124,29 +124,33 @@ impl Definition {
124 124
125 let vis = self.visibility(db); 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 if let Some(Visibility::Module(module)) = vis.and_then(|it| it.into()) { 127 if let Some(Visibility::Module(module)) = vis.and_then(|it| it.into()) {
132 let module: Module = module.into(); 128 let module: Module = module.into();
133 let mut res = FxHashMap::default(); 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 { 131 let mut to_visit = vec![module];
138 ModuleSource::Module(m) => { 132 let mut is_first = true;
139 let range = Some(m.syntax().text_range()); 133 while let Some(module) = to_visit.pop() {
140 res.insert(file_id, range); 134 let src = module.definition_source(db);
141 } 135 let file_id = src.file_id.original_file(db);
142 ModuleSource::SourceFile(_) => { 136 match src.value {
143 res.insert(file_id, None); 137 ModuleSource::Module(m) => {
144 res.extend(module.children(db).map(|m| { 138 if is_first {
145 let src = m.definition_source(db); 139 let range = Some(m.syntax().text_range());
146 (src.file_id.original_file(db), None) 140 res.insert(file_id, range);
147 })); 141 } else {
148 } 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 return SearchScope::new(res); 154 return SearchScope::new(res);
151 } 155 }
152 156