Skip to content

Commit 5ffddc4

Browse files
committed
Explicitly remember desugard exprs
1 parent fb5891c commit 5ffddc4

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

crates/ra_hir_def/src/body.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,14 @@ pub type PatSource = InFile<PatPtr>;
149149
#[derive(Default, Debug, Eq, PartialEq)]
150150
pub struct BodySourceMap {
151151
expr_map: FxHashMap<ExprSource, ExprId>,
152-
expr_map_back: ArenaMap<ExprId, ExprSource>,
152+
expr_map_back: ArenaMap<ExprId, Result<ExprSource, SyntheticSyntax>>,
153153
pat_map: FxHashMap<PatSource, PatId>,
154154
pat_map_back: ArenaMap<PatId, PatSource>,
155155
field_map: FxHashMap<(ExprId, usize), AstPtr<ast::RecordField>>,
156156
expansions: FxHashMap<InFile<AstPtr<ast::MacroCall>>, HirFileId>,
157157
}
158158

159-
#[derive(Debug)]
159+
#[derive(Default, Debug, Eq, PartialEq, Clone, Copy)]
160160
pub struct SyntheticSyntax;
161161

162162
impl Body {
@@ -223,7 +223,7 @@ impl Index<PatId> for Body {
223223

224224
impl BodySourceMap {
225225
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]
227227
}
228228

229229
pub fn node_expr(&self, node: InFile<&ast::Expr>) -> Option<ExprId> {

crates/ra_hir_def/src/body/lower.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,10 @@ use ra_syntax::{
1414
};
1515
use test_utils::tested_by;
1616

17+
use super::ExprSource;
1718
use crate::{
1819
adt::StructKind,
19-
body::{Body, BodySourceMap, Expander, PatPtr},
20+
body::{Body, BodySourceMap, Expander, PatPtr, SyntheticSyntax},
2021
builtin_type::{BuiltinFloat, BuiltinInt},
2122
db::DefDatabase,
2223
expr::{
@@ -102,42 +103,42 @@ where
102103

103104
fn alloc_expr(&mut self, expr: Expr, ptr: AstPtr<ast::Expr>) -> ExprId {
104105
let ptr = Either::Left(ptr);
105-
let id = self.body.exprs.alloc(expr);
106106
let src = self.expander.to_source(ptr);
107+
let id = self.make_expr(expr, Ok(src));
107108
self.source_map.expr_map.insert(src, id);
108-
self.source_map.expr_map_back.insert(id, src);
109109
id
110110
}
111111
// desugared exprs don't have ptr, that's wrong and should be fixed
112112
// somehow.
113113
fn alloc_expr_desugared(&mut self, expr: Expr) -> ExprId {
114-
self.body.exprs.alloc(expr)
114+
self.make_expr(expr, Err(SyntheticSyntax))
115115
}
116116
fn alloc_expr_field_shorthand(&mut self, expr: Expr, ptr: AstPtr<ast::RecordField>) -> ExprId {
117117
let ptr = Either::Right(ptr);
118-
let id = self.body.exprs.alloc(expr);
119118
let src = self.expander.to_source(ptr);
119+
let id = self.make_expr(expr, Ok(src));
120120
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);
121131
self.source_map.expr_map_back.insert(id, src);
122132
id
123133
}
134+
124135
fn alloc_pat(&mut self, pat: Pat, ptr: PatPtr) -> PatId {
125136
let id = self.body.pats.alloc(pat);
126137
let src = self.expander.to_source(ptr);
127138
self.source_map.pat_map.insert(src, id);
128139
self.source_map.pat_map_back.insert(id, src);
129140
id
130141
}
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-
141142
fn missing_pat(&mut self) -> PatId {
142143
self.body.pats.alloc(Pat::Missing)
143144
}

0 commit comments

Comments
 (0)