Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/body/lower.rs')
-rw-r--r--crates/hir-def/src/body/lower.rs40
1 files changed, 30 insertions, 10 deletions
diff --git a/crates/hir-def/src/body/lower.rs b/crates/hir-def/src/body/lower.rs
index e4158d7564..c6a9093201 100644
--- a/crates/hir-def/src/body/lower.rs
+++ b/crates/hir-def/src/body/lower.rs
@@ -1025,7 +1025,7 @@ impl ExprCollector<'_> {
let id = collector(self, Some(expansion.tree()));
self.ast_id_map = prev_ast_id_map;
- self.expander.exit(self.db, mark);
+ self.expander.exit(mark);
id
}
None => collector(self, None),
@@ -1597,13 +1597,25 @@ impl ExprCollector<'_> {
});
let template = f.template();
let fmt_snippet = template.as_ref().map(ToString::to_string);
+ let mut mappings = vec![];
let fmt = match template.and_then(|it| self.expand_macros_to_string(it)) {
- Some((s, is_direct_literal)) => {
- format_args::parse(&s, fmt_snippet, args, is_direct_literal, |name| {
- self.alloc_expr_desugared(Expr::Path(Path::from(name)))
- })
- }
- None => FormatArgs { template: Default::default(), arguments: args.finish() },
+ Some((s, is_direct_literal)) => format_args::parse(
+ &s,
+ fmt_snippet,
+ args,
+ is_direct_literal,
+ |name| self.alloc_expr_desugared(Expr::Path(Path::from(name))),
+ |name, span| {
+ if let Some(span) = span {
+ mappings.push((span, name.clone()))
+ }
+ },
+ ),
+ None => FormatArgs {
+ template: Default::default(),
+ arguments: args.finish(),
+ orphans: Default::default(),
+ },
};
// Create a list of all _unique_ (argument, format trait) combinations.
@@ -1742,18 +1754,26 @@ impl ExprCollector<'_> {
});
let unsafe_arg_new = self.alloc_expr_desugared(Expr::Unsafe {
id: None,
- statements: Box::default(),
+ // We collect the unused expressions here so that we still infer them instead of
+ // dropping them out of the expression tree
+ statements: fmt
+ .orphans
+ .into_iter()
+ .map(|expr| Statement::Expr { expr, has_semi: true })
+ .collect(),
tail: Some(unsafe_arg_new),
});
- self.alloc_expr(
+ let idx = self.alloc_expr(
Expr::Call {
callee: new_v1_formatted,
args: Box::new([lit_pieces, args, format_options, unsafe_arg_new]),
is_assignee_expr: false,
},
syntax_ptr,
- )
+ );
+ self.source_map.format_args_template_map.insert(idx, mappings);
+ idx
}
/// Generate a hir expression for a format_args placeholder specification.