This commit is contained in:
Aleksey Kladov 2019-01-01 21:17:52 +03:00
parent f8d419ee89
commit 4a3f76d3bb
2 changed files with 49 additions and 47 deletions

View File

@ -25,13 +25,12 @@ use ra_syntax::{
use ra_db::SourceRootId; use ra_db::SourceRootId;
use crate::{ use crate::{
Cancelable, FileId, Cancelable, MFileId, FileId,
DefId, DefLoc, DefKind, DefId, DefLoc, DefKind,
SourceItemId, SourceFileItemId, SourceFileItems, SourceItemId, SourceFileItemId, SourceFileItems,
Path, PathKind, Path, PathKind,
HirDatabase, Crate, HirDatabase, Crate,
Name, AsName, Name, AsName,
macros::MacroCallLoc,
module::{Module, ModuleId, ModuleTree}, module::{Module, ModuleId, ModuleTree},
}; };
@ -71,7 +70,7 @@ pub struct InputModuleItems {
#[derive(Debug, PartialEq, Eq)] #[derive(Debug, PartialEq, Eq)]
struct ModuleItem { struct ModuleItem {
id: SourceFileItemId, id: SourceItemId,
name: Name, name: Name,
kind: SyntaxKind, kind: SyntaxKind,
vis: Vis, vis: Vis,
@ -210,24 +209,28 @@ impl<T> PerNs<T> {
} }
impl InputModuleItems { impl InputModuleItems {
pub(crate) fn new<'a>( pub(crate) fn add_item(
&mut self,
mfile_id: MFileId,
file_items: &SourceFileItems, file_items: &SourceFileItems,
items: impl Iterator<Item = ast::ModuleItem<'a>>, item: ast::ModuleItem,
) -> InputModuleItems { ) -> Option<()> {
let mut res = InputModuleItems::default();
for item in items {
res.add_item(file_items, item);
}
res
}
fn add_item(&mut self, file_items: &SourceFileItems, item: ast::ModuleItem) -> Option<()> {
match item { match item {
ast::ModuleItem::StructDef(it) => self.items.push(ModuleItem::new(file_items, it)?), ast::ModuleItem::StructDef(it) => {
ast::ModuleItem::EnumDef(it) => self.items.push(ModuleItem::new(file_items, it)?), self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
ast::ModuleItem::FnDef(it) => self.items.push(ModuleItem::new(file_items, it)?), }
ast::ModuleItem::TraitDef(it) => self.items.push(ModuleItem::new(file_items, it)?), ast::ModuleItem::EnumDef(it) => {
ast::ModuleItem::TypeDef(it) => self.items.push(ModuleItem::new(file_items, it)?), self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
}
ast::ModuleItem::FnDef(it) => {
self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
}
ast::ModuleItem::TraitDef(it) => {
self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
}
ast::ModuleItem::TypeDef(it) => {
self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
}
ast::ModuleItem::ImplItem(_) => { ast::ModuleItem::ImplItem(_) => {
// impls don't define items // impls don't define items
} }
@ -235,9 +238,15 @@ impl InputModuleItems {
ast::ModuleItem::ExternCrateItem(_) => { ast::ModuleItem::ExternCrateItem(_) => {
// TODO // TODO
} }
ast::ModuleItem::ConstDef(it) => self.items.push(ModuleItem::new(file_items, it)?), ast::ModuleItem::ConstDef(it) => {
ast::ModuleItem::StaticDef(it) => self.items.push(ModuleItem::new(file_items, it)?), self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
ast::ModuleItem::Module(it) => self.items.push(ModuleItem::new(file_items, it)?), }
ast::ModuleItem::StaticDef(it) => {
self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
}
ast::ModuleItem::Module(it) => {
self.items.push(ModuleItem::new(mfile_id, file_items, it)?)
}
} }
Some(()) Some(())
} }
@ -259,11 +268,16 @@ impl InputModuleItems {
} }
impl ModuleItem { impl ModuleItem {
fn new<'a>(file_items: &SourceFileItems, item: impl ast::NameOwner<'a>) -> Option<ModuleItem> { fn new<'a>(
mfile_id: MFileId,
file_items: &SourceFileItems,
item: impl ast::NameOwner<'a>,
) -> Option<ModuleItem> {
let name = item.name()?.as_name(); let name = item.name()?.as_name();
let kind = item.syntax().kind(); let kind = item.syntax().kind();
let vis = Vis::Other; let vis = Vis::Other;
let id = file_items.id_of_unchecked(item.syntax()); let item_id = Some(file_items.id_of_unchecked(item.syntax()));
let id = SourceItemId { mfile_id, item_id };
let res = ModuleItem { let res = ModuleItem {
id, id,
name, name,
@ -303,7 +317,7 @@ where
pub(crate) fn resolve(mut self) -> Cancelable<ItemMap> { pub(crate) fn resolve(mut self) -> Cancelable<ItemMap> {
for (&module_id, items) in self.input.iter() { for (&module_id, items) in self.input.iter() {
self.populate_module(module_id, items)?; self.populate_module(module_id, Arc::clone(items))?;
} }
for &module_id in self.input.keys() { for &module_id in self.input.keys() {
@ -313,9 +327,11 @@ where
Ok(self.result) Ok(self.result)
} }
fn populate_module(&mut self, module_id: ModuleId, input: &InputModuleItems) -> Cancelable<()> { fn populate_module(
let file_id = module_id.source(&self.module_tree).file_id(); &mut self,
module_id: ModuleId,
input: Arc<InputModuleItems>,
) -> Cancelable<()> {
let mut module_items = ModuleScope::default(); let mut module_items = ModuleScope::default();
// Populate extern crates prelude // Populate extern crates prelude
@ -355,18 +371,6 @@ where
if item.kind == MODULE { if item.kind == MODULE {
continue; continue;
} }
if item.kind == MACRO_CALL {
let loc = MacroCallLoc {
source_root_id: self.source_root,
module_id,
source_item_id: SourceItemId {
mfile_id: file_id.into(),
item_id: Some(item.id),
},
};
let id = loc.id(self.db);
continue;
}
// depending on the item kind, the location can define something in // depending on the item kind, the location can define something in
// the values namespace, the types namespace, or both // the values namespace, the types namespace, or both
let kind = DefKind::for_syntax_kind(item.kind); let kind = DefKind::for_syntax_kind(item.kind);
@ -375,10 +379,7 @@ where
kind: k, kind: k,
source_root_id: self.source_root, source_root_id: self.source_root,
module_id, module_id,
source_item_id: SourceItemId { source_item_id: item.id,
mfile_id: file_id.into(),
item_id: Some(item.id),
},
}; };
def_loc.id(self.db) def_loc.id(self.db)
}); });

View File

@ -128,11 +128,12 @@ pub(super) fn input_module_items(
) -> Cancelable<Arc<InputModuleItems>> { ) -> Cancelable<Arc<InputModuleItems>> {
let module_tree = db.module_tree(source_root)?; let module_tree = db.module_tree(source_root)?;
let source = module_id.source(&module_tree); let source = module_id.source(&module_tree);
let file_items = db.file_items(source.file_id().into()); let mfile_id = source.file_id().into();
let file_items = db.file_items(mfile_id);
let res = match source.resolve(db) { let res = match source.resolve(db) {
ModuleSourceNode::SourceFile(it) => { ModuleSourceNode::SourceFile(it) => {
let items = it.borrowed().items(); let items = it.borrowed().items();
InputModuleItems::new(&file_items, items) InputModuleItems::new(mfile_id, &file_items, items)
} }
ModuleSourceNode::Module(it) => { ModuleSourceNode::Module(it) => {
let items = it let items = it
@ -140,7 +141,7 @@ pub(super) fn input_module_items(
.item_list() .item_list()
.into_iter() .into_iter()
.flat_map(|it| it.items()); .flat_map(|it| it.items());
InputModuleItems::new(&file_items, items) InputModuleItems::new(mfile_id, &file_items, items)
} }
}; };
Ok(Arc::new(res)) Ok(Arc::new(res))