From cf3b4f1e208247c9d171273dabff9c6b3c98a240 Mon Sep 17 00:00:00 2001 From: cynecx Date: Sat, 10 Apr 2021 17:49:12 +0200 Subject: hir_ty: Expand macros at type position --- crates/hir_def/src/body.rs | 74 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 60 insertions(+), 14 deletions(-) (limited to 'crates/hir_def/src/body.rs') diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs index 96b959967..44ae13643 100644 --- a/crates/hir_def/src/body.rs +++ b/crates/hir_def/src/body.rs @@ -19,9 +19,9 @@ use hir_expand::{ use la_arena::{Arena, ArenaMap}; use profile::Count; use rustc_hash::FxHashMap; -use syntax::{ast, AstNode, AstPtr}; +use syntax::{ast, AstNode, AstPtr, SyntaxNode}; -pub(crate) use lower::LowerCtx; +pub use lower::LowerCtx; use crate::{ attr::{Attrs, RawAttrs}, @@ -98,11 +98,14 @@ impl Expander { } } - pub(crate) fn enter_expand( + fn enter_expand_intern( &mut self, db: &dyn DefDatabase, macro_call: ast::MacroCall, - ) -> Result>, UnresolvedMacro> { + ) -> Result< + ExpandResult Mark + '_)>>, + UnresolvedMacro, + > { if self.recursion_limit + 1 > EXPANSION_RECURSION_LIMIT { cov_mark::hit!(your_stack_belongs_to_me); return Ok(ExpandResult::str_err( @@ -147,6 +150,55 @@ impl Expander { } }; + let this = self; + + let advance_state = move |db: &dyn DefDatabase| { + this.recursion_limit += 1; + let mark = Mark { + file_id: this.current_file_id, + ast_id_map: mem::take(&mut this.ast_id_map), + bomb: DropBomb::new("expansion mark dropped"), + }; + this.cfg_expander.hygiene = Hygiene::new(db.upcast(), file_id); + this.current_file_id = file_id; + this.ast_id_map = db.ast_id_map(file_id); + mark + }; + + Ok(ExpandResult { value: Some((raw_node, advance_state)), err }) + } + + pub(crate) fn enter_expand_raw( + &mut self, + db: &dyn DefDatabase, + macro_call: ast::MacroCall, + ) -> Result>, UnresolvedMacro> { + let (raw_node, mut advance_state, err) = match self.enter_expand_intern(db, macro_call)? { + ExpandResult { value: Some((raw_node, advance_state)), err } => { + (raw_node, advance_state, err) + } + ExpandResult { value: None, err } => return Ok(ExpandResult { value: None, err }), + }; + + log::debug!("macro expansion {:#?}", raw_node); + + let mark = advance_state(db); + + Ok(ExpandResult { value: Some((mark, raw_node)), err }) + } + + pub(crate) fn enter_expand( + &mut self, + db: &dyn DefDatabase, + macro_call: ast::MacroCall, + ) -> Result>, UnresolvedMacro> { + let (raw_node, mut advance_state, err) = match self.enter_expand_intern(db, macro_call)? { + ExpandResult { value: Some((raw_node, advance_state)), err } => { + (raw_node, advance_state, err) + } + ExpandResult { value: None, err } => return Ok(ExpandResult { value: None, err }), + }; + let node = match T::cast(raw_node) { Some(it) => it, None => { @@ -157,15 +209,7 @@ impl Expander { log::debug!("macro expansion {:#?}", node.syntax()); - self.recursion_limit += 1; - let mark = Mark { - file_id: self.current_file_id, - ast_id_map: mem::take(&mut self.ast_id_map), - bomb: DropBomb::new("expansion mark dropped"), - }; - self.cfg_expander.hygiene = Hygiene::new(db.upcast(), file_id); - self.current_file_id = file_id; - self.ast_id_map = db.ast_id_map(file_id); + let mark = advance_state(db); Ok(ExpandResult { value: Some((mark, node)), err }) } @@ -191,7 +235,8 @@ impl Expander { } fn parse_path(&mut self, path: ast::Path) -> Option { - Path::from_src(path, &self.cfg_expander.hygiene) + let ctx = LowerCtx::with_hygiene(&self.cfg_expander.hygiene); + Path::from_src(path, &ctx) } fn resolve_path_as_macro(&self, db: &dyn DefDatabase, path: &ModPath) -> Option { @@ -204,6 +249,7 @@ impl Expander { } } +#[derive(Debug)] pub(crate) struct Mark { file_id: HirFileId, ast_id_map: Arc, -- cgit v1.2.3 From 7ed42a3a527b2c39826cfeb3626521c11abb25f0 Mon Sep 17 00:00:00 2001 From: cynecx Date: Sat, 17 Apr 2021 17:38:38 +0200 Subject: hir_def: refactor expand_macro_type and cleanups --- crates/hir_def/src/body.rs | 72 +++++++++++----------------------------------- 1 file changed, 16 insertions(+), 56 deletions(-) (limited to 'crates/hir_def/src/body.rs') diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs index 44ae13643..8a9b936ea 100644 --- a/crates/hir_def/src/body.rs +++ b/crates/hir_def/src/body.rs @@ -19,7 +19,7 @@ use hir_expand::{ use la_arena::{Arena, ArenaMap}; use profile::Count; use rustc_hash::FxHashMap; -use syntax::{ast, AstNode, AstPtr, SyntaxNode}; +use syntax::{ast, AstNode, AstPtr}; pub use lower::LowerCtx; @@ -98,14 +98,11 @@ impl Expander { } } - fn enter_expand_intern( + pub(crate) fn enter_expand( &mut self, db: &dyn DefDatabase, macro_call: ast::MacroCall, - ) -> Result< - ExpandResult Mark + '_)>>, - UnresolvedMacro, - > { + ) -> Result>, UnresolvedMacro> { if self.recursion_limit + 1 > EXPANSION_RECURSION_LIMIT { cov_mark::hit!(your_stack_belongs_to_me); return Ok(ExpandResult::str_err( @@ -150,55 +147,6 @@ impl Expander { } }; - let this = self; - - let advance_state = move |db: &dyn DefDatabase| { - this.recursion_limit += 1; - let mark = Mark { - file_id: this.current_file_id, - ast_id_map: mem::take(&mut this.ast_id_map), - bomb: DropBomb::new("expansion mark dropped"), - }; - this.cfg_expander.hygiene = Hygiene::new(db.upcast(), file_id); - this.current_file_id = file_id; - this.ast_id_map = db.ast_id_map(file_id); - mark - }; - - Ok(ExpandResult { value: Some((raw_node, advance_state)), err }) - } - - pub(crate) fn enter_expand_raw( - &mut self, - db: &dyn DefDatabase, - macro_call: ast::MacroCall, - ) -> Result>, UnresolvedMacro> { - let (raw_node, mut advance_state, err) = match self.enter_expand_intern(db, macro_call)? { - ExpandResult { value: Some((raw_node, advance_state)), err } => { - (raw_node, advance_state, err) - } - ExpandResult { value: None, err } => return Ok(ExpandResult { value: None, err }), - }; - - log::debug!("macro expansion {:#?}", raw_node); - - let mark = advance_state(db); - - Ok(ExpandResult { value: Some((mark, raw_node)), err }) - } - - pub(crate) fn enter_expand( - &mut self, - db: &dyn DefDatabase, - macro_call: ast::MacroCall, - ) -> Result>, UnresolvedMacro> { - let (raw_node, mut advance_state, err) = match self.enter_expand_intern(db, macro_call)? { - ExpandResult { value: Some((raw_node, advance_state)), err } => { - (raw_node, advance_state, err) - } - ExpandResult { value: None, err } => return Ok(ExpandResult { value: None, err }), - }; - let node = match T::cast(raw_node) { Some(it) => it, None => { @@ -209,7 +157,15 @@ impl Expander { log::debug!("macro expansion {:#?}", node.syntax()); - let mark = advance_state(db); + self.recursion_limit += 1; + let mark = Mark { + file_id: self.current_file_id, + ast_id_map: mem::take(&mut self.ast_id_map), + bomb: DropBomb::new("expansion mark dropped"), + }; + self.cfg_expander.hygiene = Hygiene::new(db.upcast(), file_id); + self.current_file_id = file_id; + self.ast_id_map = db.ast_id_map(file_id); Ok(ExpandResult { value: Some((mark, node)), err }) } @@ -234,6 +190,10 @@ impl Expander { &self.cfg_expander.cfg_options } + pub(crate) fn current_file_id(&self) -> HirFileId { + self.current_file_id + } + fn parse_path(&mut self, path: ast::Path) -> Option { let ctx = LowerCtx::with_hygiene(&self.cfg_expander.hygiene); Path::from_src(path, &ctx) -- cgit v1.2.3 From 6ed2fd233b569d01169fc888f30c358dd289d260 Mon Sep 17 00:00:00 2001 From: cynecx Date: Sun, 18 Apr 2021 19:56:13 +0200 Subject: hir_ty: keep body::Expander in TyLoweringContext --- crates/hir_def/src/body.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'crates/hir_def/src/body.rs') diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs index 8a9b936ea..131f424cc 100644 --- a/crates/hir_def/src/body.rs +++ b/crates/hir_def/src/body.rs @@ -37,13 +37,15 @@ use crate::{ /// A subset of Expander that only deals with cfg attributes. We only need it to /// avoid cyclic queries in crate def map during enum processing. +#[derive(Debug)] pub(crate) struct CfgExpander { cfg_options: CfgOptions, hygiene: Hygiene, krate: CrateId, } -pub(crate) struct Expander { +#[derive(Debug)] +pub struct Expander { cfg_expander: CfgExpander, def_map: Arc, current_file_id: HirFileId, @@ -80,11 +82,7 @@ impl CfgExpander { } impl Expander { - pub(crate) fn new( - db: &dyn DefDatabase, - current_file_id: HirFileId, - module: ModuleId, - ) -> Expander { + pub fn new(db: &dyn DefDatabase, current_file_id: HirFileId, module: ModuleId) -> Expander { let cfg_expander = CfgExpander::new(db, current_file_id, module.krate); let def_map = module.def_map(db); let ast_id_map = db.ast_id_map(current_file_id); @@ -98,7 +96,7 @@ impl Expander { } } - pub(crate) fn enter_expand( + pub fn enter_expand( &mut self, db: &dyn DefDatabase, macro_call: ast::MacroCall, @@ -170,7 +168,7 @@ impl Expander { Ok(ExpandResult { value: Some((mark, node)), err }) } - pub(crate) fn exit(&mut self, db: &dyn DefDatabase, mut mark: Mark) { + pub fn exit(&mut self, db: &dyn DefDatabase, mut mark: Mark) { self.cfg_expander.hygiene = Hygiene::new(db.upcast(), mark.file_id); self.current_file_id = mark.file_id; self.ast_id_map = mem::take(&mut mark.ast_id_map); @@ -190,7 +188,7 @@ impl Expander { &self.cfg_expander.cfg_options } - pub(crate) fn current_file_id(&self) -> HirFileId { + pub fn current_file_id(&self) -> HirFileId { self.current_file_id } @@ -210,7 +208,7 @@ impl Expander { } #[derive(Debug)] -pub(crate) struct Mark { +pub struct Mark { file_id: HirFileId, ast_id_map: Arc, bomb: DropBomb, -- cgit v1.2.3