wip
This commit is contained in:
parent
f8d419ee89
commit
4a3f76d3bb
@ -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)
|
||||||
});
|
});
|
||||||
|
@ -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))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user