add search scope stuct

This commit is contained in:
Aleksey Kladov 2019-10-24 13:41:25 +03:00
parent 018b621f61
commit 6d186ec3be

View File

@ -13,8 +13,26 @@ use crate::db::RootDatabase;
use super::{NameDefinition, NameKind};
pub struct SearchScope {
entries: FxHashSet<(FileId, Option<TextRange>)>,
}
impl SearchScope {
fn new(entries: FxHashSet<(FileId, Option<TextRange>)>) -> SearchScope {
SearchScope { entries }
}
}
impl IntoIterator for SearchScope {
type Item = (FileId, Option<TextRange>);
type IntoIter = std::collections::hash_set::IntoIter<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
self.entries.into_iter()
}
}
impl NameDefinition {
pub(crate) fn search_scope(&self, db: &RootDatabase) -> FxHashSet<(FileId, Option<TextRange>)> {
pub(crate) fn search_scope(&self, db: &RootDatabase) -> SearchScope {
let _p = profile("search_scope");
let module_src = self.container.definition_source(db);
@ -28,7 +46,7 @@ impl NameDefinition {
DefWithBody::Static(s) => s.source(db).ast.syntax().text_range(),
};
res.insert((file_id, Some(range)));
return res;
return SearchScope::new(res);
}
let vis =
@ -36,37 +54,36 @@ impl NameDefinition {
if vis.as_str() == "pub(super)" {
if let Some(parent_module) = self.container.parent(db) {
let mut files = FxHashSet::default();
let mut res = FxHashSet::default();
let parent_src = parent_module.definition_source(db);
let file_id = parent_src.file_id.original_file(db);
match parent_src.ast {
ModuleSource::Module(m) => {
let range = Some(m.syntax().text_range());
files.insert((file_id, range));
res.insert((file_id, range));
}
ModuleSource::SourceFile(_) => {
files.insert((file_id, None));
files.extend(parent_module.children(db).map(|m| {
res.insert((file_id, None));
res.extend(parent_module.children(db).map(|m| {
let src = m.definition_source(db);
(src.file_id.original_file(db), None)
}));
}
}
return files;
return SearchScope::new(res);
}
}
if vis.as_str() != "" {
let source_root_id = db.file_source_root(file_id);
let source_root = db.source_root(source_root_id);
let mut files =
source_root.walk().map(|id| (id.into(), None)).collect::<FxHashSet<_>>();
let mut res = source_root.walk().map(|id| (id.into(), None)).collect::<FxHashSet<_>>();
// FIXME: add "pub(in path)"
if vis.as_str() == "pub(crate)" {
return files;
return SearchScope::new(res);
}
if vis.as_str() == "pub" {
let krate = self.container.krate(db).unwrap();
@ -77,10 +94,10 @@ impl NameDefinition {
let root_file = crate_graph.crate_root(crate_id);
let source_root_id = db.file_source_root(root_file);
let source_root = db.source_root(source_root_id);
files.extend(source_root.walk().map(|id| (id.into(), None)));
res.extend(source_root.walk().map(|id| (id.into(), None)));
}
}
return files;
return SearchScope::new(res);
}
}
@ -90,6 +107,6 @@ impl NameDefinition {
ModuleSource::SourceFile(_) => None,
};
res.insert((file_id, range));
res
SearchScope::new(res)
}
}