Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/expr_store/lower.rs')
-rw-r--r--crates/hir-def/src/expr_store/lower.rs39
1 files changed, 23 insertions, 16 deletions
diff --git a/crates/hir-def/src/expr_store/lower.rs b/crates/hir-def/src/expr_store/lower.rs
index ef88188572..21b5b19986 100644
--- a/crates/hir-def/src/expr_store/lower.rs
+++ b/crates/hir-def/src/expr_store/lower.rs
@@ -2159,16 +2159,21 @@ impl<'db> ExprCollector<'db> {
) else {
return self.missing_expr();
};
- let head = self.collect_expr_opt(e.iterable());
- let into_iter_fn_expr = self.alloc_expr(Expr::Path(into_iter_fn), syntax_ptr);
- let iterator = self.alloc_expr(
+ let iterable = e.iterable();
+ let syntax_ptr_iterable = iterable.as_ref().map_or(syntax_ptr, AstPtr::new);
+ let loop_body = e.loop_body().map(|it| it.into());
+ let head = self.collect_expr_opt(iterable);
+ let into_iter_fn_expr =
+ self.alloc_expr_desugared_with_ptr(Expr::Path(into_iter_fn), syntax_ptr_iterable);
+ let iterator = self.alloc_expr_desugared_with_ptr(
Expr::Call { callee: into_iter_fn_expr, args: Box::new([head]) },
- syntax_ptr,
+ syntax_ptr_iterable,
);
let none_arm = MatchArm {
pat: self.alloc_pat_desugared(Pat::Path(option_none)),
guard: None,
- expr: self.alloc_expr(Expr::Break { expr: None, label: None }, syntax_ptr),
+ expr: self
+ .alloc_expr_desugared_with_ptr(Expr::Break { expr: None, label: None }, syntax_ptr),
};
let some_pat = Pat::TupleStruct {
path: option_some,
@@ -2181,26 +2186,26 @@ impl<'db> ExprCollector<'db> {
let some_arm = MatchArm {
pat: self.alloc_pat_desugared(some_pat),
guard: None,
- expr: self.with_opt_labeled_rib(label, |this| {
- this.collect_expr_opt(e.loop_body().map(|it| it.into()))
- }),
+ expr: self.with_opt_labeled_rib(label, |this| this.collect_expr_opt(loop_body)),
};
let iter_name = self.generate_new_name();
- let iter_expr = self.alloc_expr(Expr::Path(Path::from(iter_name.clone())), syntax_ptr);
- let iter_expr_mut = self.alloc_expr(
+ let iter_expr = self
+ .alloc_expr_desugared_with_ptr(Expr::Path(Path::from(iter_name.clone())), syntax_ptr);
+ let iter_expr_mut = self.alloc_expr_desugared_with_ptr(
Expr::Ref { expr: iter_expr, rawness: Rawness::Ref, mutability: Mutability::Mut },
syntax_ptr,
);
- let iter_next_fn_expr = self.alloc_expr(Expr::Path(iter_next_fn), syntax_ptr);
- let iter_next_expr = self.alloc_expr(
+ let iter_next_fn_expr =
+ self.alloc_expr_desugared_with_ptr(Expr::Path(iter_next_fn), syntax_ptr);
+ let iter_next_expr = self.alloc_expr_desugared_with_ptr(
Expr::Call { callee: iter_next_fn_expr, args: Box::new([iter_expr_mut]) },
syntax_ptr,
);
- let loop_inner = self.alloc_expr(
+ let loop_inner = self.alloc_expr_desugared_with_ptr(
Expr::Match { expr: iter_next_expr, arms: Box::new([none_arm, some_arm]) },
syntax_ptr,
);
- let loop_inner = self.alloc_expr(
+ let loop_inner = self.alloc_expr_desugared_with_ptr(
Expr::Block {
id: None,
statements: Box::default(),
@@ -2209,8 +2214,10 @@ impl<'db> ExprCollector<'db> {
},
syntax_ptr,
);
- let loop_outer = self
- .alloc_expr(Expr::Loop { body: loop_inner, label: label.map(|it| it.1) }, syntax_ptr);
+ let loop_outer = self.alloc_expr_desugared_with_ptr(
+ Expr::Loop { body: loop_inner, label: label.map(|it| it.1) },
+ syntax_ptr,
+ );
let iter_binding =
self.alloc_binding(iter_name, BindingAnnotation::Mutable, HygieneId::ROOT);
let iter_pat = self.alloc_pat_desugared(Pat::Bind { id: iter_binding, subpat: None });