add typed ids

This commit is contained in:
Aleksey Kladov 2019-03-26 17:25:14 +03:00
parent 619a4c05ba
commit fb8b354dcc
7 changed files with 88 additions and 45 deletions

View file

@ -1,10 +1,55 @@
use std::sync::Arc;
use std::{marker::PhantomData, sync::Arc};
use ra_arena::{Arena, RawId, impl_arena_id};
use ra_syntax::{SyntaxNodePtr, TreeArc, SyntaxNode, SourceFile, AstNode, ast};
use crate::{HirFileId, DefDatabase};
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct AstId<N: AstNode> {
file_id: HirFileId,
file_ast_id: FileAstId<N>,
}
impl<N: AstNode> Clone for AstId<N> {
fn clone(&self) -> AstId<N> {
*self
}
}
impl<N: AstNode> Copy for AstId<N> {}
impl<N: AstNode> AstId<N> {
pub(crate) fn file_id(&self) -> HirFileId {
self.file_id
}
pub(crate) fn to_node(&self, db: &impl DefDatabase) -> TreeArc<N> {
let syntax_node = db.file_item(self.file_ast_id.raw.with_file_id(self.file_id));
N::cast(&syntax_node).unwrap().to_owned()
}
}
#[derive(Debug, PartialEq, Eq)]
pub(crate) struct FileAstId<N: AstNode> {
raw: SourceFileItemId,
_ty: PhantomData<N>,
}
impl<N: AstNode> Clone for FileAstId<N> {
fn clone(&self) -> FileAstId<N> {
*self
}
}
impl<N: AstNode> Copy for FileAstId<N> {}
impl<N: AstNode> FileAstId<N> {
pub(crate) fn with_file_id(self, file_id: HirFileId) -> AstId<N> {
AstId { file_id, file_ast_id: self }
}
}
/// Identifier of item within a specific file. This is stable over reparses, so
/// it's OK to use it as a salsa key/value.
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
@ -90,6 +135,9 @@ impl SourceFileItems {
self.arena.iter().map(|(_id, i)| i).collect::<Vec<_>>(),
);
}
pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> FileAstId<N> {
FileAstId { raw: self.id_of_unchecked(item.syntax()), _ty: PhantomData }
}
}
impl std::ops::Index<SourceFileItemId> for SourceFileItems {