From 16156d766dd8a5624d9455ffded6358fe879c416 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Mon, 23 Dec 2019 13:18:28 +0800 Subject: Add macro call support for type_of --- crates/ra_hir_def/src/body.rs | 16 ++++++---------- crates/ra_hir_def/src/lib.rs | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) (limited to 'crates/ra_hir_def') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index d3e4c50ae..8ab92b23a 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -26,7 +26,7 @@ use crate::{ DefWithBodyId, HasModule, Lookup, ModuleId, }; -pub(crate) struct Expander { +pub struct Expander { crate_def_map: Arc, current_file_id: HirFileId, hygiene: Hygiene, @@ -35,18 +35,14 @@ pub(crate) struct Expander { } impl Expander { - pub(crate) fn new( - db: &impl DefDatabase, - current_file_id: HirFileId, - module: ModuleId, - ) -> Expander { + pub fn new(db: &impl DefDatabase, current_file_id: HirFileId, module: ModuleId) -> Expander { let crate_def_map = db.crate_def_map(module.krate); let hygiene = Hygiene::new(db, current_file_id); let ast_id_map = db.ast_id_map(current_file_id); Expander { crate_def_map, current_file_id, hygiene, ast_id_map, module } } - pub(crate) fn enter_expand( + pub fn enter_expand( &mut self, db: &DB, macro_call: ast::MacroCall, @@ -84,14 +80,14 @@ impl Expander { None } - pub(crate) fn exit(&mut self, db: &impl DefDatabase, mut mark: Mark) { + pub fn exit(&mut self, db: &impl DefDatabase, mut mark: Mark) { self.hygiene = Hygiene::new(db, mark.file_id); self.current_file_id = mark.file_id; self.ast_id_map = mem::take(&mut mark.ast_id_map); mark.bomb.defuse(); } - pub(crate) fn to_source(&self, value: T) -> InFile { + pub fn to_source(&self, value: T) -> InFile { InFile { file_id: self.current_file_id, value } } @@ -116,7 +112,7 @@ impl Expander { } } -pub(crate) struct Mark { +pub struct Mark { file_id: HirFileId, ast_id_map: Arc, bomb: DropBomb, diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index f6c7f38d1..f58ce9a95 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs @@ -48,7 +48,7 @@ use ra_arena::{impl_arena_id, RawId}; use ra_db::{impl_intern_key, salsa, CrateId}; use ra_syntax::{ast, AstNode}; -use crate::body::Expander; +pub use crate::body::Expander; use crate::builtin_type::BuiltinType; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -- cgit v1.2.3 From 12cc2ed5572e4df8cfbdaef79ed3c865fda0764c Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Mon, 23 Dec 2019 21:47:11 +0800 Subject: Use pre-stored macro file --- crates/ra_hir_def/src/body.rs | 22 ++++++++++++++++------ crates/ra_hir_def/src/body/lower.rs | 20 +++++++++++++------- crates/ra_hir_def/src/lib.rs | 2 +- 3 files changed, 30 insertions(+), 14 deletions(-) (limited to 'crates/ra_hir_def') diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index 8ab92b23a..142c52d35 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs @@ -26,7 +26,7 @@ use crate::{ DefWithBodyId, HasModule, Lookup, ModuleId, }; -pub struct Expander { +pub(crate) struct Expander { crate_def_map: Arc, current_file_id: HirFileId, hygiene: Hygiene, @@ -35,14 +35,18 @@ pub struct Expander { } impl Expander { - pub fn new(db: &impl DefDatabase, current_file_id: HirFileId, module: ModuleId) -> Expander { + pub(crate) fn new( + db: &impl DefDatabase, + current_file_id: HirFileId, + module: ModuleId, + ) -> Expander { let crate_def_map = db.crate_def_map(module.krate); let hygiene = Hygiene::new(db, current_file_id); let ast_id_map = db.ast_id_map(current_file_id); Expander { crate_def_map, current_file_id, hygiene, ast_id_map, module } } - pub fn enter_expand( + pub(crate) fn enter_expand( &mut self, db: &DB, macro_call: ast::MacroCall, @@ -80,14 +84,14 @@ impl Expander { None } - pub fn exit(&mut self, db: &impl DefDatabase, mut mark: Mark) { + pub(crate) fn exit(&mut self, db: &impl DefDatabase, mut mark: Mark) { self.hygiene = Hygiene::new(db, mark.file_id); self.current_file_id = mark.file_id; self.ast_id_map = mem::take(&mut mark.ast_id_map); mark.bomb.defuse(); } - pub fn to_source(&self, value: T) -> InFile { + pub(crate) fn to_source(&self, value: T) -> InFile { InFile { file_id: self.current_file_id, value } } @@ -112,7 +116,7 @@ impl Expander { } } -pub struct Mark { +pub(crate) struct Mark { file_id: HirFileId, ast_id_map: Arc, bomb: DropBomb, @@ -159,6 +163,7 @@ pub struct BodySourceMap { pat_map: FxHashMap, pat_map_back: ArenaMap, field_map: FxHashMap<(ExprId, usize), AstPtr>, + expansions: FxHashMap>, HirFileId>, } impl Body { @@ -233,6 +238,11 @@ impl BodySourceMap { self.expr_map.get(&src).cloned() } + pub fn node_macro_file(&self, node: InFile<&ast::MacroCall>) -> Option { + let src = node.map(|it| AstPtr::new(it)); + self.expansions.get(&src).cloned() + } + pub fn field_init_shorthand_expr(&self, node: InFile<&ast::RecordField>) -> Option { let src = node.map(|it| Either::Right(AstPtr::new(it))); self.expr_map.get(&src).cloned() diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index 5323af097..57c77304c 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs @@ -446,14 +446,20 @@ where } } // FIXME expand to statements in statement position - ast::Expr::MacroCall(e) => match self.expander.enter_expand(self.db, e) { - Some((mark, expansion)) => { - let id = self.collect_expr(expansion); - self.expander.exit(self.db, mark); - id + ast::Expr::MacroCall(e) => { + let macro_call = self.expander.to_source(AstPtr::new(&e)); + match self.expander.enter_expand(self.db, e.clone()) { + Some((mark, expansion)) => { + self.source_map + .expansions + .insert(macro_call, self.expander.current_file_id); + let id = self.collect_expr(expansion); + self.expander.exit(self.db, mark); + id + } + None => self.alloc_expr(Expr::Missing, syntax_ptr), } - None => self.alloc_expr(Expr::Missing, syntax_ptr), - }, + } // FIXME implement HIR for these: ast::Expr::Label(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index f58ce9a95..f6c7f38d1 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs @@ -48,7 +48,7 @@ use ra_arena::{impl_arena_id, RawId}; use ra_db::{impl_intern_key, salsa, CrateId}; use ra_syntax::{ast, AstNode}; -pub use crate::body::Expander; +use crate::body::Expander; use crate::builtin_type::BuiltinType; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -- cgit v1.2.3