diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir/src/expr.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body.rs | 13 | ||||
-rw-r--r-- | crates/ra_hir_def/src/body/lower.rs | 31 |
3 files changed, 27 insertions, 21 deletions
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs index 82955fa55..d1af8ee39 100644 --- a/crates/ra_hir/src/expr.rs +++ b/crates/ra_hir/src/expr.rs | |||
@@ -40,8 +40,8 @@ pub(crate) fn body_with_source_map_query( | |||
40 | (src.file_id, src.ast.body()) | 40 | (src.file_id, src.ast.body()) |
41 | } | 41 | } |
42 | }; | 42 | }; |
43 | let resolver = hir_def::body::MacroResolver::new(db, def.module(db).id); | 43 | let resolver = hir_def::body::MacroResolver::new(db, file_id, def.module(db).id); |
44 | let (body, source_map) = Body::new(db, resolver, file_id, params, body); | 44 | let (body, source_map) = Body::new(db, resolver, params, body); |
45 | (Arc::new(body), Arc::new(source_map)) | 45 | (Arc::new(body), Arc::new(source_map)) |
46 | } | 46 | } |
47 | 47 | ||
diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs index 269501221..7e84e9113 100644 --- a/crates/ra_hir_def/src/body.rs +++ b/crates/ra_hir_def/src/body.rs | |||
@@ -18,12 +18,18 @@ use crate::{ | |||
18 | 18 | ||
19 | pub struct MacroResolver { | 19 | pub struct MacroResolver { |
20 | crate_def_map: Arc<CrateDefMap>, | 20 | crate_def_map: Arc<CrateDefMap>, |
21 | current_file_id: HirFileId, | ||
21 | module: ModuleId, | 22 | module: ModuleId, |
22 | } | 23 | } |
23 | 24 | ||
24 | impl MacroResolver { | 25 | impl MacroResolver { |
25 | pub fn new(db: &impl DefDatabase2, module: ModuleId) -> MacroResolver { | 26 | pub fn new( |
26 | MacroResolver { crate_def_map: db.crate_def_map(module.krate), module } | 27 | db: &impl DefDatabase2, |
28 | current_file_id: HirFileId, | ||
29 | module: ModuleId, | ||
30 | ) -> MacroResolver { | ||
31 | let crate_def_map = db.crate_def_map(module.krate); | ||
32 | MacroResolver { crate_def_map, current_file_id, module } | ||
27 | } | 33 | } |
28 | 34 | ||
29 | fn resolve_path_as_macro(&self, db: &impl DefDatabase2, path: &Path) -> Option<MacroDefId> { | 35 | fn resolve_path_as_macro(&self, db: &impl DefDatabase2, path: &Path) -> Option<MacroDefId> { |
@@ -77,11 +83,10 @@ impl Body { | |||
77 | pub fn new( | 83 | pub fn new( |
78 | db: &impl DefDatabase2, | 84 | db: &impl DefDatabase2, |
79 | resolver: MacroResolver, | 85 | resolver: MacroResolver, |
80 | file_id: HirFileId, | ||
81 | params: Option<ast::ParamList>, | 86 | params: Option<ast::ParamList>, |
82 | body: Option<ast::Expr>, | 87 | body: Option<ast::Expr>, |
83 | ) -> (Body, BodySourceMap) { | 88 | ) -> (Body, BodySourceMap) { |
84 | lower::lower(db, resolver, file_id, params, body) | 89 | lower::lower(db, resolver, params, body) |
85 | } | 90 | } |
86 | 91 | ||
87 | pub fn params(&self) -> &[PatId] { | 92 | pub fn params(&self) -> &[PatId] { |
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs index 2aa863c9e..1a990101f 100644 --- a/crates/ra_hir_def/src/body/lower.rs +++ b/crates/ra_hir_def/src/body/lower.rs | |||
@@ -31,15 +31,15 @@ use crate::{ | |||
31 | pub(super) fn lower( | 31 | pub(super) fn lower( |
32 | db: &impl DefDatabase2, | 32 | db: &impl DefDatabase2, |
33 | resolver: MacroResolver, | 33 | resolver: MacroResolver, |
34 | file_id: HirFileId, | ||
35 | params: Option<ast::ParamList>, | 34 | params: Option<ast::ParamList>, |
36 | body: Option<ast::Expr>, | 35 | body: Option<ast::Expr>, |
37 | ) -> (Body, BodySourceMap) { | 36 | ) -> (Body, BodySourceMap) { |
37 | let original_file_id = resolver.current_file_id; | ||
38 | |||
38 | ExprCollector { | 39 | ExprCollector { |
39 | resolver, | 40 | resolver, |
40 | db, | 41 | db, |
41 | original_file_id: file_id, | 42 | original_file_id, |
42 | current_file_id: file_id, | ||
43 | source_map: BodySourceMap::default(), | 43 | source_map: BodySourceMap::default(), |
44 | body: Body { | 44 | body: Body { |
45 | exprs: Arena::default(), | 45 | exprs: Arena::default(), |
@@ -55,7 +55,6 @@ struct ExprCollector<DB> { | |||
55 | db: DB, | 55 | db: DB, |
56 | resolver: MacroResolver, | 56 | resolver: MacroResolver, |
57 | original_file_id: HirFileId, | 57 | original_file_id: HirFileId, |
58 | current_file_id: HirFileId, | ||
59 | 58 | ||
60 | body: Body, | 59 | body: Body, |
61 | source_map: BodySourceMap, | 60 | source_map: BodySourceMap, |
@@ -101,12 +100,12 @@ where | |||
101 | fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId { | 100 | fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId { |
102 | let ptr = Either::A(ptr); | 101 | let ptr = Either::A(ptr); |
103 | let id = self.body.exprs.alloc(expr); | 102 | let id = self.body.exprs.alloc(expr); |
104 | if self.current_file_id == self.original_file_id { | 103 | if self.resolver.current_file_id == self.original_file_id { |
105 | self.source_map.expr_map.insert(ptr, id); | 104 | self.source_map.expr_map.insert(ptr, id); |
106 | } | 105 | } |
107 | self.source_map | 106 | self.source_map |
108 | .expr_map_back | 107 | .expr_map_back |
109 | .insert(id, Source { file_id: self.current_file_id, ast: ptr }); | 108 | .insert(id, Source { file_id: self.resolver.current_file_id, ast: ptr }); |
110 | id | 109 | id |
111 | } | 110 | } |
112 | // desugared exprs don't have ptr, that's wrong and should be fixed | 111 | // desugared exprs don't have ptr, that's wrong and should be fixed |
@@ -117,20 +116,22 @@ where | |||
117 | fn alloc_expr_field_shorthand(&mut self, expr: Expr, ptr: AstPtr<ast::RecordField>) -> ExprId { | 116 | fn alloc_expr_field_shorthand(&mut self, expr: Expr, ptr: AstPtr<ast::RecordField>) -> ExprId { |
118 | let ptr = Either::B(ptr); | 117 | let ptr = Either::B(ptr); |
119 | let id = self.body.exprs.alloc(expr); | 118 | let id = self.body.exprs.alloc(expr); |
120 | if self.current_file_id == self.original_file_id { | 119 | if self.resolver.current_file_id == self.original_file_id { |
121 | self.source_map.expr_map.insert(ptr, id); | 120 | self.source_map.expr_map.insert(ptr, id); |
122 | } | 121 | } |
123 | self.source_map | 122 | self.source_map |
124 | .expr_map_back | 123 | .expr_map_back |
125 | .insert(id, Source { file_id: self.current_file_id, ast: ptr }); | 124 | .insert(id, Source { file_id: self.resolver.current_file_id, ast: ptr }); |
126 | id | 125 | id |
127 | } | 126 | } |
128 | fn alloc_pat(&mut self, pat: Pat, ptr: PatPtr) -> PatId { | 127 | fn alloc_pat(&mut self, pat: Pat, ptr: PatPtr) -> PatId { |
129 | let id = self.body.pats.alloc(pat); | 128 | let id = self.body.pats.alloc(pat); |
130 | if self.current_file_id == self.original_file_id { | 129 | if self.resolver.current_file_id == self.original_file_id { |
131 | self.source_map.pat_map.insert(ptr, id); | 130 | self.source_map.pat_map.insert(ptr, id); |
132 | } | 131 | } |
133 | self.source_map.pat_map_back.insert(id, Source { file_id: self.current_file_id, ast: ptr }); | 132 | self.source_map |
133 | .pat_map_back | ||
134 | .insert(id, Source { file_id: self.resolver.current_file_id, ast: ptr }); | ||
134 | id | 135 | id |
135 | } | 136 | } |
136 | 137 | ||
@@ -445,8 +446,8 @@ where | |||
445 | ast::Expr::RangeExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), | 446 | ast::Expr::RangeExpr(_e) => self.alloc_expr(Expr::Missing, syntax_ptr), |
446 | ast::Expr::MacroCall(e) => { | 447 | ast::Expr::MacroCall(e) => { |
447 | let ast_id = AstId::new( | 448 | let ast_id = AstId::new( |
448 | self.current_file_id, | 449 | self.resolver.current_file_id, |
449 | self.db.ast_id_map(self.current_file_id).ast_id(&e), | 450 | self.db.ast_id_map(self.resolver.current_file_id).ast_id(&e), |
450 | ); | 451 | ); |
451 | 452 | ||
452 | if let Some(path) = e.path().and_then(|path| self.parse_path(path)) { | 453 | if let Some(path) = e.path().and_then(|path| self.parse_path(path)) { |
@@ -457,9 +458,9 @@ where | |||
457 | if let Some(expr) = ast::Expr::cast(node) { | 458 | if let Some(expr) = ast::Expr::cast(node) { |
458 | log::debug!("macro expansion {:#?}", expr.syntax()); | 459 | log::debug!("macro expansion {:#?}", expr.syntax()); |
459 | let old_file_id = | 460 | let old_file_id = |
460 | std::mem::replace(&mut self.current_file_id, file_id); | 461 | std::mem::replace(&mut self.resolver.current_file_id, file_id); |
461 | let id = self.collect_expr(expr); | 462 | let id = self.collect_expr(expr); |
462 | self.current_file_id = old_file_id; | 463 | self.resolver.current_file_id = old_file_id; |
463 | return id; | 464 | return id; |
464 | } | 465 | } |
465 | } | 466 | } |
@@ -581,7 +582,7 @@ where | |||
581 | } | 582 | } |
582 | 583 | ||
583 | fn parse_path(&mut self, path: ast::Path) -> Option<Path> { | 584 | fn parse_path(&mut self, path: ast::Path) -> Option<Path> { |
584 | let hygiene = Hygiene::new(self.db, self.current_file_id); | 585 | let hygiene = Hygiene::new(self.db, self.resolver.current_file_id); |
585 | Path::from_src(path, &hygiene) | 586 | Path::from_src(path, &hygiene) |
586 | } | 587 | } |
587 | } | 588 | } |