Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-expand/src/span_map.rs')
| -rw-r--r-- | crates/hir-expand/src/span_map.rs | 58 |
1 files changed, 14 insertions, 44 deletions
diff --git a/crates/hir-expand/src/span_map.rs b/crates/hir-expand/src/span_map.rs index aa8603341b..6a94df8b5a 100644 --- a/crates/hir-expand/src/span_map.rs +++ b/crates/hir-expand/src/span_map.rs @@ -2,7 +2,6 @@ use span::Span; use syntax::{AstNode, TextRange, ast}; -use triomphe::Arc; pub use span::RealSpanMap; @@ -11,35 +10,21 @@ use crate::{HirFileId, MacroCallId, db::ExpandDatabase}; pub type ExpansionSpanMap = span::SpanMap; /// Spanmap for a macro file or a real file -#[derive(Clone, Debug, PartialEq, Eq)] -pub enum SpanMap { +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum SpanMap<'db> { /// Spanmap for a macro file - ExpansionSpanMap(Arc<ExpansionSpanMap>), + ExpansionSpanMap(&'db ExpansionSpanMap), /// Spanmap for a real file - RealSpanMap(Arc<RealSpanMap>), + RealSpanMap(&'db RealSpanMap), } -#[derive(Copy, Clone)] -pub enum SpanMapRef<'a> { - /// Spanmap for a macro file - ExpansionSpanMap(&'a ExpansionSpanMap), - /// Spanmap for a real file - RealSpanMap(&'a RealSpanMap), -} - -impl syntax_bridge::SpanMapper for SpanMap { - fn span_for(&self, range: TextRange) -> Span { - self.span_for_range(range) - } -} - -impl syntax_bridge::SpanMapper for SpanMapRef<'_> { +impl syntax_bridge::SpanMapper for SpanMap<'_> { fn span_for(&self, range: TextRange) -> Span { self.span_for_range(range) } } -impl SpanMap { +impl<'db> SpanMap<'db> { pub fn span_for_range(&self, range: TextRange) -> Span { match self { // FIXME: Is it correct for us to only take the span at the start? This feels somewhat @@ -51,37 +36,22 @@ impl SpanMap { } } - pub fn as_ref(&self) -> SpanMapRef<'_> { - match self { - Self::ExpansionSpanMap(span_map) => SpanMapRef::ExpansionSpanMap(span_map), - Self::RealSpanMap(span_map) => SpanMapRef::RealSpanMap(span_map), - } - } - #[inline] - pub(crate) fn new(db: &dyn ExpandDatabase, file_id: HirFileId) -> SpanMap { + pub(crate) fn new(db: &'db dyn ExpandDatabase, file_id: HirFileId) -> SpanMap<'db> { match file_id { HirFileId::FileId(file_id) => SpanMap::RealSpanMap(db.real_span_map(file_id)), HirFileId::MacroFile(m) => { - SpanMap::ExpansionSpanMap(db.parse_macro_expansion(m).value.1) + SpanMap::ExpansionSpanMap(&db.parse_macro_expansion(m).value.1) } } } } -impl SpanMapRef<'_> { - pub fn span_for_range(self, range: TextRange) -> Span { - match self { - Self::ExpansionSpanMap(span_map) => span_map.span_at(range.start()), - Self::RealSpanMap(span_map) => span_map.span_for_range(range), - } - } -} - +#[salsa_macros::tracked(returns(ref))] pub(crate) fn real_span_map( db: &dyn ExpandDatabase, editioned_file_id: base_db::EditionedFileId, -) -> Arc<RealSpanMap> { +) -> RealSpanMap { use syntax::ast::HasModuleItem; let mut pairs = vec![(syntax::TextSize::new(0), span::ROOT_ERASED_FILE_AST_ID)]; let ast_id_map = db.ast_id_map(editioned_file_id.into()); @@ -134,16 +104,16 @@ pub(crate) fn real_span_map( _ => (), }); - Arc::new(RealSpanMap::from_file( + RealSpanMap::from_file( editioned_file_id.span_file_id(db), pairs.into_boxed_slice(), tree.syntax().text_range().end(), - )) + ) } pub(crate) fn expansion_span_map( db: &dyn ExpandDatabase, file_id: MacroCallId, -) -> Arc<ExpansionSpanMap> { - db.parse_macro_expansion(file_id).value.1 +) -> &ExpansionSpanMap { + &db.parse_macro_expansion(file_id).value.1 } |