aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-03-06 14:11:05 +0000
committerAleksey Kladov <[email protected]>2020-03-06 14:11:05 +0000
commit5ffddc4b921685ebd5f9525f7e33913a1d08c04e (patch)
treed75fd7a74f0f95f8ecedb22ba7f1a3480d795981 /crates/ra_hir_def/src
parentfb5891c4330e577f5d6891be529141695ce36d4f (diff)
Explicitly remember desugard exprs
Diffstat (limited to 'crates/ra_hir_def/src')
-rw-r--r--crates/ra_hir_def/src/body.rs6
-rw-r--r--crates/ra_hir_def/src/body/lower.rs31
2 files changed, 19 insertions, 18 deletions
diff --git a/crates/ra_hir_def/src/body.rs b/crates/ra_hir_def/src/body.rs
index cd9e22c42..e60adc146 100644
--- a/crates/ra_hir_def/src/body.rs
+++ b/crates/ra_hir_def/src/body.rs
@@ -149,14 +149,14 @@ pub type PatSource = InFile<PatPtr>;
149#[derive(Default, Debug, Eq, PartialEq)] 149#[derive(Default, Debug, Eq, PartialEq)]
150pub struct BodySourceMap { 150pub struct BodySourceMap {
151 expr_map: FxHashMap<ExprSource, ExprId>, 151 expr_map: FxHashMap<ExprSource, ExprId>,
152 expr_map_back: ArenaMap<ExprId, ExprSource>, 152 expr_map_back: ArenaMap<ExprId, Result<ExprSource, SyntheticSyntax>>,
153 pat_map: FxHashMap<PatSource, PatId>, 153 pat_map: FxHashMap<PatSource, PatId>,
154 pat_map_back: ArenaMap<PatId, PatSource>, 154 pat_map_back: ArenaMap<PatId, PatSource>,
155 field_map: FxHashMap<(ExprId, usize), AstPtr<ast::RecordField>>, 155 field_map: FxHashMap<(ExprId, usize), AstPtr<ast::RecordField>>,
156 expansions: FxHashMap<InFile<AstPtr<ast::MacroCall>>, HirFileId>, 156 expansions: FxHashMap<InFile<AstPtr<ast::MacroCall>>, HirFileId>,
157} 157}
158 158
159#[derive(Debug)] 159#[derive(Default, Debug, Eq, PartialEq, Clone, Copy)]
160pub struct SyntheticSyntax; 160pub struct SyntheticSyntax;
161 161
162impl Body { 162impl Body {
@@ -223,7 +223,7 @@ impl Index<PatId> for Body {
223 223
224impl BodySourceMap { 224impl BodySourceMap {
225 pub fn expr_syntax(&self, expr: ExprId) -> Result<ExprSource, SyntheticSyntax> { 225 pub fn expr_syntax(&self, expr: ExprId) -> Result<ExprSource, SyntheticSyntax> {
226 self.expr_map_back.get(expr).copied().ok_or(SyntheticSyntax) 226 self.expr_map_back[expr]
227 } 227 }
228 228
229 pub fn node_expr(&self, node: InFile<&ast::Expr>) -> Option<ExprId> { 229 pub fn node_expr(&self, node: InFile<&ast::Expr>) -> Option<ExprId> {
diff --git a/crates/ra_hir_def/src/body/lower.rs b/crates/ra_hir_def/src/body/lower.rs
index c18e6879b..209907700 100644
--- a/crates/ra_hir_def/src/body/lower.rs
+++ b/crates/ra_hir_def/src/body/lower.rs
@@ -14,9 +14,10 @@ use ra_syntax::{
14}; 14};
15use test_utils::tested_by; 15use test_utils::tested_by;
16 16
17use super::ExprSource;
17use crate::{ 18use crate::{
18 adt::StructKind, 19 adt::StructKind,
19 body::{Body, BodySourceMap, Expander, PatPtr}, 20 body::{Body, BodySourceMap, Expander, PatPtr, SyntheticSyntax},
20 builtin_type::{BuiltinFloat, BuiltinInt}, 21 builtin_type::{BuiltinFloat, BuiltinInt},
21 db::DefDatabase, 22 db::DefDatabase,
22 expr::{ 23 expr::{
@@ -102,25 +103,35 @@ where
102 103
103 fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId { 104 fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId {
104 let ptr = Either::Left(ptr); 105 let ptr = Either::Left(ptr);
105 let id = self.body.exprs.alloc(expr);
106 let src = self.expander.to_source(ptr); 106 let src = self.expander.to_source(ptr);
107 let id = self.make_expr(expr, Ok(src));
107 self.source_map.expr_map.insert(src, id); 108 self.source_map.expr_map.insert(src, id);
108 self.source_map.expr_map_back.insert(id, src);
109 id 109 id
110 } 110 }
111 // 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
112 // somehow. 112 // somehow.
113 fn alloc_expr_desugared(&mut self, expr: Expr) -> ExprId { 113 fn alloc_expr_desugared(&mut self, expr: Expr) -> ExprId {
114 self.body.exprs.alloc(expr) 114 self.make_expr(expr, Err(SyntheticSyntax))
115 } 115 }
116 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 {
117 let ptr = Either::Right(ptr); 117 let ptr = Either::Right(ptr);
118 let id = self.body.exprs.alloc(expr);
119 let src = self.expander.to_source(ptr); 118 let src = self.expander.to_source(ptr);
119 let id = self.make_expr(expr, Ok(src));
120 self.source_map.expr_map.insert(src, id); 120 self.source_map.expr_map.insert(src, id);
121 id
122 }
123 fn empty_block(&mut self) -> ExprId {
124 self.alloc_expr_desugared(Expr::Block { statements: Vec::new(), tail: None })
125 }
126 fn missing_expr(&mut self) -> ExprId {
127 self.alloc_expr_desugared(Expr::Missing)
128 }
129 fn make_expr(&mut self, expr: Expr, src: Result<ExprSource, SyntheticSyntax>) -> ExprId {
130 let id = self.body.exprs.alloc(expr);
121 self.source_map.expr_map_back.insert(id, src); 131 self.source_map.expr_map_back.insert(id, src);
122 id 132 id
123 } 133 }
134
124 fn alloc_pat(&mut self, pat: Pat, ptr: PatPtr) -> PatId { 135 fn alloc_pat(&mut self, pat: Pat, ptr: PatPtr) -> PatId {
125 let id = self.body.pats.alloc(pat); 136 let id = self.body.pats.alloc(pat);
126 let src = self.expander.to_source(ptr); 137 let src = self.expander.to_source(ptr);
@@ -128,16 +139,6 @@ where
128 self.source_map.pat_map_back.insert(id, src); 139 self.source_map.pat_map_back.insert(id, src);
129 id 140 id
130 } 141 }
131
132 fn empty_block(&mut self) -> ExprId {
133 let block = Expr::Block { statements: Vec::new(), tail: None };
134 self.body.exprs.alloc(block)
135 }
136
137 fn missing_expr(&mut self) -> ExprId {
138 self.body.exprs.alloc(Expr::Missing)
139 }
140
141 fn missing_pat(&mut self) -> PatId { 142 fn missing_pat(&mut self) -> PatId {
142 self.body.pats.alloc(Pat::Missing) 143 self.body.pats.alloc(Pat::Missing)
143 } 144 }