From 9c1a18a626770b60e8785aa34505dc2caf061c02 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 26 Jan 2019 22:48:04 +0300 Subject: store syntax ptr in FileItems we cache the tree in file_item query anyway --- crates/ra_hir/src/ids.rs | 29 ++++++++++------------------- crates/ra_hir/src/query_definitions.rs | 7 +++++-- 2 files changed, 15 insertions(+), 21 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir/src/ids.rs b/crates/ra_hir/src/ids.rs index 631f6f6a1..015d640e3 100644 --- a/crates/ra_hir/src/ids.rs +++ b/crates/ra_hir/src/ids.rs @@ -4,7 +4,7 @@ use std::{ }; use ra_db::{LocationIntener, FileId}; -use ra_syntax::{TreeArc, SyntaxNode, SourceFile, AstNode, ast}; +use ra_syntax::{TreeArc, SyntaxNode, SourceFile, AstNode, SyntaxNodePtr, ast}; use ra_arena::{Arena, RawId, ArenaId, impl_arena_id}; use crate::{ @@ -309,7 +309,7 @@ pub struct SourceItemId { #[derive(Debug, PartialEq, Eq)] pub struct SourceFileItems { file_id: HirFileId, - arena: Arena>, + arena: Arena, } impl SourceFileItems { @@ -329,15 +329,15 @@ impl SourceFileItems { // trait does not chage ids of top-level items, which helps caching. bfs(source_file.syntax(), |it| { if let Some(module_item) = ast::ModuleItem::cast(it) { - self.alloc(module_item.syntax().to_owned()); + self.alloc(module_item.syntax()); } else if let Some(macro_call) = ast::MacroCall::cast(it) { - self.alloc(macro_call.syntax().to_owned()); + self.alloc(macro_call.syntax()); } }) } - fn alloc(&mut self, item: TreeArc) -> SourceFileItemId { - self.arena.alloc(item) + fn alloc(&mut self, item: &SyntaxNode) -> SourceFileItemId { + self.arena.alloc(SyntaxNodePtr::new(item)) } pub(crate) fn id_of(&self, file_id: HirFileId, item: &SyntaxNode) -> SourceFileItemId { assert_eq!( @@ -348,17 +348,8 @@ impl SourceFileItems { self.id_of_unchecked(item) } pub(crate) fn id_of_unchecked(&self, item: &SyntaxNode) -> SourceFileItemId { - if let Some((id, _)) = self.arena.iter().find(|(_id, i)| *i == item) { - return id; - } - // This should not happen. Let's try to give a sensible diagnostics. - if let Some((id, i)) = self.arena.iter().find(|(_id, i)| i.range() == item.range()) { - // FIXME(#288): whyyy are we getting here? - log::error!( - "unequal syntax nodes with the same range:\n{:?}\n{:?}", - item, - i - ); + let ptr = SyntaxNodePtr::new(item); + if let Some((id, _)) = self.arena.iter().find(|(_id, i)| **i == ptr) { return id; } panic!( @@ -370,8 +361,8 @@ impl SourceFileItems { } impl std::ops::Index for SourceFileItems { - type Output = SyntaxNode; - fn index(&self, idx: SourceFileItemId) -> &SyntaxNode { + type Output = SyntaxNodePtr; + fn index(&self, idx: SourceFileItemId) -> &SyntaxNodePtr { &self.arena[idx] } } diff --git a/crates/ra_hir/src/query_definitions.rs b/crates/ra_hir/src/query_definitions.rs index 61c93a964..380c06404 100644 --- a/crates/ra_hir/src/query_definitions.rs +++ b/crates/ra_hir/src/query_definitions.rs @@ -32,9 +32,12 @@ pub(super) fn file_item( db: &impl HirDatabase, source_item_id: SourceItemId, ) -> TreeArc { + let source_file = db.hir_parse(source_item_id.file_id); match source_item_id.item_id { - Some(id) => db.file_items(source_item_id.file_id)[id].to_owned(), - None => db.hir_parse(source_item_id.file_id).syntax().to_owned(), + Some(id) => db.file_items(source_item_id.file_id)[id] + .to_node(&source_file) + .to_owned(), + None => source_file.syntax().to_owned(), } } -- cgit v1.2.3