Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-expand/src/hygiene.rs')
| -rw-r--r-- | crates/hir-expand/src/hygiene.rs | 137 |
1 files changed, 57 insertions, 80 deletions
diff --git a/crates/hir-expand/src/hygiene.rs b/crates/hir-expand/src/hygiene.rs index fe05af0ac9..b53468ccac 100644 --- a/crates/hir-expand/src/hygiene.rs +++ b/crates/hir-expand/src/hygiene.rs @@ -22,11 +22,11 @@ // FIXME: Move this into the span crate? Not quite possible today as that depends on `MacroCallLoc` // which contains a bunch of unrelated things -use std::iter; +use std::{convert::identity, iter}; -use span::{Edition, MacroCallId, Span, SyntaxContextData, SyntaxContextId}; +use span::{Edition, MacroCallId, Span, SyntaxContextId}; -use crate::db::{ExpandDatabase, InternSyntaxContextQuery}; +use crate::db::{ExpandDatabase, MacroCallWrapper}; pub use span::Transparency; @@ -72,8 +72,8 @@ fn span_with_ctxt_from_mark( pub(super) fn apply_mark( db: &dyn ExpandDatabase, - ctxt: SyntaxContextId, - call_id: MacroCallId, + ctxt: span::SyntaxContextId, + call_id: span::MacroCallId, transparency: Transparency, edition: Edition, ) -> SyntaxContextId { @@ -114,92 +114,75 @@ fn apply_mark_internal( transparency: Transparency, edition: Edition, ) -> SyntaxContextId { - use base_db::ra_salsa; - let call_id = Some(call_id); - let syntax_context_data = db.lookup_intern_syntax_context(ctxt); - let mut opaque = syntax_context_data.opaque; - let mut opaque_and_semitransparent = syntax_context_data.opaque_and_semitransparent; + let mut opaque = ctxt.opaque(db); + let mut opaque_and_semitransparent = ctxt.opaque_and_semitransparent(db); if transparency >= Transparency::Opaque { let parent = opaque; - opaque = ra_salsa::plumbing::get_query_table::<InternSyntaxContextQuery>(db).get_or_insert( - (parent, call_id, transparency, edition), - |new_opaque| SyntaxContextData { - outer_expn: call_id, - outer_transparency: transparency, - parent, - opaque: new_opaque, - opaque_and_semitransparent: new_opaque, - edition, - }, - ); + opaque = + SyntaxContextId::new(db, call_id, transparency, edition, parent, identity, identity); } if transparency >= Transparency::SemiTransparent { let parent = opaque_and_semitransparent; opaque_and_semitransparent = - ra_salsa::plumbing::get_query_table::<InternSyntaxContextQuery>(db).get_or_insert( - (parent, call_id, transparency, edition), - |new_opaque_and_semitransparent| SyntaxContextData { - outer_expn: call_id, - outer_transparency: transparency, - parent, - opaque, - opaque_and_semitransparent: new_opaque_and_semitransparent, - edition, - }, - ); + SyntaxContextId::new(db, call_id, transparency, edition, parent, |_| opaque, identity); } let parent = ctxt; - db.intern_syntax_context(SyntaxContextData { - outer_expn: call_id, - outer_transparency: transparency, - parent, - opaque, - opaque_and_semitransparent, + SyntaxContextId::new( + db, + call_id, + transparency, edition, - }) + parent, + |_| opaque, + |_| opaque_and_semitransparent, + ) } pub trait SyntaxContextExt { - fn normalize_to_macro_rules(self, db: &dyn ExpandDatabase) -> Self; - fn normalize_to_macros_2_0(self, db: &dyn ExpandDatabase) -> Self; - fn parent_ctxt(self, db: &dyn ExpandDatabase) -> Self; - fn remove_mark(&mut self, db: &dyn ExpandDatabase) -> (Option<MacroCallId>, Transparency); - fn outer_mark(self, db: &dyn ExpandDatabase) -> (Option<MacroCallId>, Transparency); - fn marks(self, db: &dyn ExpandDatabase) -> Vec<(MacroCallId, Transparency)>; + fn normalize_to_macro_rules(self, db: &dyn ExpandDatabase) -> span::SyntaxContextId; + fn normalize_to_macros_2_0(self, db: &dyn ExpandDatabase) -> span::SyntaxContextId; + fn parent_ctxt(self, db: &dyn ExpandDatabase) -> span::SyntaxContextId; + fn remove_mark(&mut self, db: &dyn ExpandDatabase) + -> (Option<span::MacroCallId>, Transparency); + fn outer_mark(self, db: &dyn ExpandDatabase) -> (Option<span::MacroCallId>, Transparency); + fn marks(self, db: &dyn ExpandDatabase) -> Vec<(span::MacroCallId, Transparency)>; fn is_opaque(self, db: &dyn ExpandDatabase) -> bool; } impl SyntaxContextExt for SyntaxContextId { - fn normalize_to_macro_rules(self, db: &dyn ExpandDatabase) -> Self { - db.lookup_intern_syntax_context(self).opaque_and_semitransparent + fn normalize_to_macro_rules(self, db: &dyn ExpandDatabase) -> span::SyntaxContextId { + self.opaque_and_semitransparent(db) } - fn normalize_to_macros_2_0(self, db: &dyn ExpandDatabase) -> Self { - db.lookup_intern_syntax_context(self).opaque + fn normalize_to_macros_2_0(self, db: &dyn ExpandDatabase) -> span::SyntaxContextId { + self.opaque(db) } - fn parent_ctxt(self, db: &dyn ExpandDatabase) -> Self { - db.lookup_intern_syntax_context(self).parent + fn parent_ctxt(self, db: &dyn ExpandDatabase) -> span::SyntaxContextId { + self.parent(db) } - fn outer_mark(self, db: &dyn ExpandDatabase) -> (Option<MacroCallId>, Transparency) { - let data = db.lookup_intern_syntax_context(self); - (data.outer_expn, data.outer_transparency) + fn outer_mark(self, db: &dyn ExpandDatabase) -> (Option<span::MacroCallId>, Transparency) { + let data = self; + (data.outer_expn(db), data.outer_transparency(db)) } - fn remove_mark(&mut self, db: &dyn ExpandDatabase) -> (Option<MacroCallId>, Transparency) { - let data = db.lookup_intern_syntax_context(*self); - *self = data.parent; - (data.outer_expn, data.outer_transparency) + fn remove_mark( + &mut self, + db: &dyn ExpandDatabase, + ) -> (Option<span::MacroCallId>, Transparency) { + let data = *self; + *self = data.parent(db); + (data.outer_expn(db), data.outer_transparency(db)) } - fn marks(self, db: &dyn ExpandDatabase) -> Vec<(MacroCallId, Transparency)> { + fn marks(self, db: &dyn ExpandDatabase) -> Vec<(span::MacroCallId, Transparency)> { let mut marks = marks_rev(self, db).collect::<Vec<_>>(); marks.reverse(); marks } fn is_opaque(self, db: &dyn ExpandDatabase) -> bool { - !self.is_root() && db.lookup_intern_syntax_context(self).outer_transparency.is_opaque() + !self.is_root() && self.outer_transparency(db).is_opaque() } } @@ -207,7 +190,7 @@ impl SyntaxContextExt for SyntaxContextId { pub fn marks_rev( ctxt: SyntaxContextId, db: &dyn ExpandDatabase, -) -> impl Iterator<Item = (MacroCallId, Transparency)> + '_ { +) -> impl Iterator<Item = (span::MacroCallId, Transparency)> + '_ { iter::successors(Some(ctxt), move |&mark| Some(mark.parent_ctxt(db))) .take_while(|&it| !it.is_root()) .map(|ctx| { @@ -219,18 +202,14 @@ pub fn marks_rev( } pub(crate) fn dump_syntax_contexts(db: &dyn ExpandDatabase) -> String { - use crate::db::{InternMacroCallLookupQuery, InternSyntaxContextLookupQuery}; - use base_db::ra_salsa::debug::DebugQueryTable; - let mut s = String::from("Expansions:"); - let mut entries = InternMacroCallLookupQuery.in_db(db).entries::<Vec<_>>(); - entries.sort_by_key(|e| e.key); - for e in entries { - let id = e.key; - let expn_data = e.value.as_ref().unwrap(); + let entries = + MacroCallWrapper::ingredient(db).entries(db.as_dyn_database()).collect::<Vec<_>>(); + for loc in entries { + let expn_data = &loc.fields().0; + s.push_str(&format!( - "\n{:?}: parent: {:?}, call_site_ctxt: {:?}, kind: {:?}", - id, + "parent: {:?}, call_site_ctxt: {:?}, kind: {:?}", expn_data.kind.file_id(), expn_data.ctxt, expn_data.kind.descr(), @@ -238,28 +217,25 @@ pub(crate) fn dump_syntax_contexts(db: &dyn ExpandDatabase) -> String { } s.push_str("\n\nSyntaxContexts:\n"); - let mut entries = InternSyntaxContextLookupQuery.in_db(db).entries::<Vec<_>>(); - entries.sort_by_key(|e| e.key); + let entries = SyntaxContextId::ingredient(db).entries(db.as_dyn_database()).collect::<Vec<_>>(); for e in entries { struct SyntaxContextDebug<'a>( &'a dyn ExpandDatabase, - SyntaxContextId, - &'a SyntaxContextData, + &'a span::SyntaxContextUnderlyingData, ); impl std::fmt::Debug for SyntaxContextDebug<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - fancy_debug(self.2, self.1, self.0, f) + fancy_debug(self.1, self.0, f) } } fn fancy_debug( - this: &SyntaxContextData, - self_id: SyntaxContextId, + this: &span::SyntaxContextUnderlyingData, db: &dyn ExpandDatabase, f: &mut std::fmt::Formatter<'_>, ) -> std::fmt::Result { - write!(f, "#{self_id} parent: #{}, outer_mark: (", this.parent)?; + write!(f, "parent: #{}, outer_mark: (", this.parent)?; match this.outer_expn { Some(id) => { write!(f, "{:?}::{{{{expn{:?}}}}}", db.lookup_intern_macro_call(id).krate, id)? @@ -269,7 +245,8 @@ pub(crate) fn dump_syntax_contexts(db: &dyn ExpandDatabase) -> String { write!(f, ", {:?})", this.outer_transparency) } - stdx::format_to!(s, "{:?}\n", SyntaxContextDebug(db, e.key, &e.value.unwrap())); + let dbg = SyntaxContextDebug(db, e.fields()); + stdx::format_to!(s, "{:?}\n", dbg); } s } |