Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/span/src/ast_id.rs')
-rw-r--r--crates/span/src/ast_id.rs39
1 files changed, 32 insertions, 7 deletions
diff --git a/crates/span/src/ast_id.rs b/crates/span/src/ast_id.rs
index b61baa2244..0ebd72e151 100644
--- a/crates/span/src/ast_id.rs
+++ b/crates/span/src/ast_id.rs
@@ -18,7 +18,28 @@ use syntax::{ast, AstNode, AstPtr, SyntaxNode, SyntaxNodePtr};
/// See crates\hir-expand\src\ast_id_map.rs
/// This is a type erased FileAstId.
-pub type ErasedFileAstId = la_arena::Idx<syntax::SyntaxNodePtr>;
+#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
+pub struct ErasedFileAstId(u32);
+
+impl ErasedFileAstId {
+ pub const fn into_raw(self) -> u32 {
+ self.0
+ }
+ pub const fn from_raw(u32: u32) -> Self {
+ Self(u32)
+ }
+}
+
+impl fmt::Display for ErasedFileAstId {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.0.fmt(f)
+ }
+}
+impl fmt::Debug for ErasedFileAstId {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ self.0.fmt(f)
+ }
+}
/// `AstId` points to an AST node in a specific file.
pub struct FileAstId<N: AstIdNode> {
@@ -47,7 +68,7 @@ impl<N: AstIdNode> Hash for FileAstId<N> {
impl<N: AstIdNode> fmt::Debug for FileAstId<N> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- write!(f, "FileAstId::<{}>({})", type_name::<N>(), self.raw.into_raw())
+ write!(f, "FileAstId::<{}>({})", type_name::<N>(), self.raw)
}
}
@@ -176,7 +197,10 @@ impl AstIdMap {
let ptr = ptr.syntax_node_ptr();
let hash = hash_ptr(&ptr);
match self.map.raw_entry().from_hash(hash, |&idx| self.arena[idx] == ptr) {
- Some((&raw, &())) => FileAstId { raw, covariant: PhantomData },
+ Some((&raw, &())) => FileAstId {
+ raw: ErasedFileAstId(raw.into_raw().into_u32()),
+ covariant: PhantomData,
+ },
None => panic!(
"Can't find {:?} in AstIdMap:\n{:?}",
ptr,
@@ -186,18 +210,19 @@ impl AstIdMap {
}
pub fn get<N: AstIdNode>(&self, id: FileAstId<N>) -> AstPtr<N> {
- AstPtr::try_from_raw(self.arena[id.raw]).unwrap()
+ AstPtr::try_from_raw(self.arena[Idx::from_raw(RawIdx::from_u32(id.raw.into_raw()))])
+ .unwrap()
}
pub fn get_erased(&self, id: ErasedFileAstId) -> SyntaxNodePtr {
- self.arena[id]
+ self.arena[Idx::from_raw(RawIdx::from_u32(id.into_raw()))]
}
fn erased_ast_id(&self, item: &SyntaxNode) -> ErasedFileAstId {
let ptr = SyntaxNodePtr::new(item);
let hash = hash_ptr(&ptr);
match self.map.raw_entry().from_hash(hash, |&idx| self.arena[idx] == ptr) {
- Some((&idx, &())) => idx,
+ Some((&idx, &())) => ErasedFileAstId(idx.into_raw().into_u32()),
None => panic!(
"Can't find {:?} in AstIdMap:\n{:?}",
item,
@@ -207,7 +232,7 @@ impl AstIdMap {
}
fn alloc(&mut self, item: &SyntaxNode) -> ErasedFileAstId {
- self.arena.alloc(SyntaxNodePtr::new(item))
+ ErasedFileAstId(self.arena.alloc(SyntaxNodePtr::new(item)).into_raw().into_u32())
}
}