Unnamed repository; edit this file 'description' to name the repository.
add mappings for constructors
bit-aloo 2 months ago
parent c03a1bd · commit eed0709
-rw-r--r--crates/ide-assists/src/handlers/convert_to_guarded_return.rs2
-rw-r--r--crates/ide-assists/src/handlers/convert_while_to_loop.rs5
-rw-r--r--crates/ide-assists/src/handlers/generate_delegate_methods.rs2
-rw-r--r--crates/syntax/src/ast/syntax_factory/constructors.rs60
4 files changed, 56 insertions, 13 deletions
diff --git a/crates/ide-assists/src/handlers/convert_to_guarded_return.rs b/crates/ide-assists/src/handlers/convert_to_guarded_return.rs
index 374c7cd869..db45916792 100644
--- a/crates/ide-assists/src/handlers/convert_to_guarded_return.rs
+++ b/crates/ide-assists/src/handlers/convert_to_guarded_return.rs
@@ -262,7 +262,7 @@ fn early_expression(
}
Some(match parent_container.kind() {
- WHILE_EXPR | LOOP_EXPR | FOR_EXPR => make.expr_continue(None),
+ WHILE_EXPR | LOOP_EXPR | FOR_EXPR => make.expr_continue(None).into(),
FN | CLOSURE_EXPR => make.expr_return(None).into(),
_ => return None,
})
diff --git a/crates/ide-assists/src/handlers/convert_while_to_loop.rs b/crates/ide-assists/src/handlers/convert_while_to_loop.rs
index c06e539a4f..f8215d6723 100644
--- a/crates/ide-assists/src/handlers/convert_while_to_loop.rs
+++ b/crates/ide-assists/src/handlers/convert_while_to_loop.rs
@@ -57,7 +57,10 @@ pub(crate) fn convert_while_to_loop(acc: &mut Assists, ctx: &AssistContext<'_>)
let while_indent_level = IndentLevel::from_node(while_expr.syntax());
let break_block = make
- .block_expr(iter::once(make.expr_stmt(make.expr_break(None, None)).into()), None)
+ .block_expr(
+ iter::once(make.expr_stmt(make.expr_break(None, None).into()).into()),
+ None,
+ )
.indent(IndentLevel(1));
edit.replace_all(
diff --git a/crates/ide-assists/src/handlers/generate_delegate_methods.rs b/crates/ide-assists/src/handlers/generate_delegate_methods.rs
index d57db7b63d..63033c7d5e 100644
--- a/crates/ide-assists/src/handlers/generate_delegate_methods.rs
+++ b/crates/ide-assists/src/handlers/generate_delegate_methods.rs
@@ -150,7 +150,7 @@ pub(crate) fn generate_delegate_methods(acc: &mut Assists, ctx: &AssistContext<'
let tail_expr = make.expr_method_call(field, make.name_ref(&name), arg_list).into();
let tail_expr_finished =
- if is_async { make.expr_await(tail_expr) } else { tail_expr };
+ if is_async { make.expr_await(tail_expr).into() } else { tail_expr };
let body = make.block_expr([], Some(tail_expr_finished));
let ret_type = method_source.ret_type();
diff --git a/crates/syntax/src/ast/syntax_factory/constructors.rs b/crates/syntax/src/ast/syntax_factory/constructors.rs
index dd8cc8d6f2..d0f14dafe3 100644
--- a/crates/syntax/src/ast/syntax_factory/constructors.rs
+++ b/crates/syntax/src/ast/syntax_factory/constructors.rs
@@ -1773,8 +1773,56 @@ impl SyntaxFactory {
make::ext::field_from_idents(parts)
}
- pub fn expr_await(&self, expr: ast::Expr) -> ast::Expr {
- make::expr_await(expr)
+ pub fn expr_await(&self, expr: ast::Expr) -> ast::AwaitExpr {
+ let ast::Expr::AwaitExpr(ast) = make::expr_await(expr.clone()).clone_for_update() else {
+ unreachable!()
+ };
+
+ if let Some(mut mapping) = self.mappings() {
+ let mut builder = SyntaxMappingBuilder::new(ast.syntax().clone());
+ builder.map_node(expr.syntax().clone(), ast.expr().unwrap().syntax().clone());
+ builder.finish(&mut mapping);
+ }
+
+ ast
+ }
+
+ pub fn expr_break(&self, label: Option<Lifetime>, expr: Option<ast::Expr>) -> ast::BreakExpr {
+ let ast::Expr::BreakExpr(ast) =
+ make::expr_break(label.clone(), expr.clone()).clone_for_update()
+ else {
+ unreachable!()
+ };
+
+ if let Some(mut mapping) = self.mappings() {
+ let mut builder = SyntaxMappingBuilder::new(ast.syntax().clone());
+ if let Some(label) = label {
+ builder.map_node(label.syntax().clone(), ast.lifetime().unwrap().syntax().clone());
+ }
+ if let Some(expr) = expr {
+ builder.map_node(expr.syntax().clone(), ast.expr().unwrap().syntax().clone());
+ }
+ builder.finish(&mut mapping);
+ }
+
+ ast
+ }
+
+ pub fn expr_continue(&self, label: Option<Lifetime>) -> ast::ContinueExpr {
+ let ast::Expr::ContinueExpr(ast) = make::expr_continue(label.clone()).clone_for_update()
+ else {
+ unreachable!()
+ };
+
+ if let Some(mut mapping) = self.mappings() {
+ let mut builder = SyntaxMappingBuilder::new(ast.syntax().clone());
+ if let Some(label) = label {
+ builder.map_node(label.syntax().clone(), ast.lifetime().unwrap().syntax().clone());
+ }
+ builder.finish(&mut mapping);
+ }
+
+ ast
}
}
@@ -1806,14 +1854,6 @@ impl SyntaxFactory {
self.ty_path(path)
}
-
- pub fn expr_break(&self, label: Option<Lifetime>, expr: Option<ast::Expr>) -> ast::Expr {
- make::expr_break(label, expr)
- }
-
- pub fn expr_continue(&self, label: Option<Lifetime>) -> ast::Expr {
- make::expr_continue(label)
- }
}
// We need to collect `input` here instead of taking `impl IntoIterator + Clone`,