ItemId based module source

This commit is contained in:
Aleksey Kladov 2018-11-28 02:09:09 +03:00
parent 9027a21f9a
commit 3922503205
3 changed files with 23 additions and 20 deletions

View File

@ -13,8 +13,8 @@ use ra_syntax::{
use relative_path::RelativePathBuf;
use crate::{
db::SyntaxDatabase, syntax_ptr::SyntaxPtr, FileId, FilePosition, Cancelable,
hir::{Path, PathKind, HirDatabase},
FileId, FilePosition, Cancelable,
hir::{Path, PathKind, HirDatabase, SourceItemId},
input::SourceRootId,
arena::{Arena, Id},
loc2id::{DefLoc, DefId},
@ -52,7 +52,7 @@ impl Module {
let file = db.file_syntax(position.file_id);
let module_source = match find_node_at_offset::<ast::Module>(file.syntax(), position.offset)
{
Some(m) if !m.has_semi() => ModuleSource::new_inline(position.file_id, m),
Some(m) if !m.has_semi() => ModuleSource::new_inline(db, position.file_id, m),
_ => ModuleSource::SourceFile(position.file_id),
};
Module::guess_from_source(db, position.file_id, module_source)
@ -218,7 +218,7 @@ impl ModuleTree {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) enum ModuleSource {
SourceFile(FileId),
Module(SyntaxPtr),
Module(SourceItemId),
}
/// An owned syntax node for a module. Unlike `ModuleSource`,
@ -273,7 +273,7 @@ impl ModuleId {
Some((link.name.clone(), module))
})
}
fn problems(self, tree: &ModuleTree, db: &impl SyntaxDatabase) -> Vec<(SyntaxNode, Problem)> {
fn problems(self, tree: &ModuleTree, db: &impl HirDatabase) -> Vec<(SyntaxNode, Problem)> {
tree.mods[self]
.children
.iter()
@ -294,7 +294,7 @@ impl LinkId {
fn name(self, tree: &ModuleTree) -> SmolStr {
tree.links[self].name.clone()
}
fn bind_source<'a>(self, tree: &ModuleTree, db: &impl SyntaxDatabase) -> ast::ModuleNode {
fn bind_source<'a>(self, tree: &ModuleTree, db: &impl HirDatabase) -> ast::ModuleNode {
let owner = self.owner(tree);
match owner.source(tree).resolve(db) {
ModuleSourceNode::SourceFile(root) => {
@ -317,10 +317,16 @@ pub(crate) struct ModuleData {
}
impl ModuleSource {
pub(crate) fn new_inline(file_id: FileId, module: ast::Module) -> ModuleSource {
pub(crate) fn new_inline(
db: &impl HirDatabase,
file_id: FileId,
module: ast::Module,
) -> ModuleSource {
assert!(!module.has_semi());
let ptr = SyntaxPtr::new(file_id, module.syntax());
ModuleSource::Module(ptr)
let items = db.file_items(file_id);
let item_id = items.id_of(module.syntax());
let id = SourceItemId { file_id, item_id };
ModuleSource::Module(id)
}
pub(crate) fn as_file(self) -> Option<FileId> {
@ -333,18 +339,18 @@ impl ModuleSource {
pub(crate) fn file_id(self) -> FileId {
match self {
ModuleSource::SourceFile(f) => f,
ModuleSource::Module(ptr) => ptr.file_id(),
ModuleSource::Module(source_item_id) => source_item_id.file_id,
}
}
pub(crate) fn resolve(self, db: &impl SyntaxDatabase) -> ModuleSourceNode {
pub(crate) fn resolve(self, db: &impl HirDatabase) -> ModuleSourceNode {
match self {
ModuleSource::SourceFile(file_id) => {
let syntax = db.file_syntax(file_id);
ModuleSourceNode::SourceFile(syntax.ast().owned())
}
ModuleSource::Module(ptr) => {
let syntax = db.resolve_syntax_ptr(ptr);
ModuleSource::Module(item_id) => {
let syntax = db.file_item(item_id);
let syntax = syntax.borrowed();
let module = ast::Module::cast(syntax).unwrap();
ModuleSourceNode::Module(module.owned())

View File

@ -63,16 +63,17 @@ pub(crate) fn submodules(
db.check_canceled()?;
let file_id = source.file_id();
let submodules = match source.resolve(db) {
ModuleSourceNode::SourceFile(it) => collect_submodules(file_id, it.borrowed()),
ModuleSourceNode::SourceFile(it) => collect_submodules(db, file_id, it.borrowed()),
ModuleSourceNode::Module(it) => it
.borrowed()
.item_list()
.map(|it| collect_submodules(file_id, it))
.map(|it| collect_submodules(db, file_id, it))
.unwrap_or_else(Vec::new),
};
return Ok(Arc::new(submodules));
fn collect_submodules<'a>(
db: &impl HirDatabase,
file_id: FileId,
root: impl ast::ModuleItemOwner<'a>,
) -> Vec<Submodule> {
@ -81,7 +82,7 @@ pub(crate) fn submodules(
if m.has_semi() {
Submodule::Declaration(name)
} else {
let src = ModuleSource::new_inline(file_id, m);
let src = ModuleSource::new_inline(db, file_id, m);
Submodule::Definition(name, src)
}
})

View File

@ -22,10 +22,6 @@ impl SyntaxPtr {
let local = LocalSyntaxPtr::new(node);
SyntaxPtr { file_id, local }
}
pub(crate) fn file_id(self) -> FileId {
self.file_id
}
}
/// A pionter to a syntax node inside a file.