From 243854211c9dcad168d9a590cabd89718474b397 Mon Sep 17 00:00:00 2001 From: Prajwal S N Date: Tue, 15 Apr 2025 11:52:22 +0530 Subject: [PATCH] fix: use `ast::TokenTree` in `make::expr_macro` Signed-off-by: Prajwal S N --- .../src/handlers/destructure_struct_binding.rs | 7 ++++++- .../ide-assists/src/utils/gen_trait_fn_body.rs | 4 +++- crates/syntax/src/ast/make.rs | 18 +++++++++--------- .../src/ast/syntax_factory/constructors.rs | 6 +++--- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/crates/ide-assists/src/handlers/destructure_struct_binding.rs b/crates/ide-assists/src/handlers/destructure_struct_binding.rs index a6f4a07413..0bb96b5d9c 100644 --- a/crates/ide-assists/src/handlers/destructure_struct_binding.rs +++ b/crates/ide-assists/src/handlers/destructure_struct_binding.rs @@ -302,7 +302,12 @@ fn build_usage_edit( }), None => Some(( usage.name.syntax().as_node().unwrap().clone(), - make.expr_macro(ast::make::ext::ident_path("todo"), make.arg_list([])).syntax().clone(), + make.expr_macro( + ast::make::ext::ident_path("todo"), + make.token_tree(syntax::SyntaxKind::L_PAREN, []), + ) + .syntax() + .clone(), )), } } diff --git a/crates/ide-assists/src/utils/gen_trait_fn_body.rs b/crates/ide-assists/src/utils/gen_trait_fn_body.rs index fe42ebe822..4ea56dc46a 100644 --- a/crates/ide-assists/src/utils/gen_trait_fn_body.rs +++ b/crates/ide-assists/src/utils/gen_trait_fn_body.rs @@ -230,7 +230,9 @@ fn gen_debug_impl(adt: &ast::Adt, func: &ast::Fn) -> Option<()> { } None => { let fmt_string = make::expr_literal(&(format!("\"{name}\""))).into(); - let args = make::arg_list([target, fmt_string]); + let args = make::ext::token_tree_from_node( + make::arg_list([target, fmt_string]).syntax(), + ); let macro_name = make::ext::ident_path("write"); let macro_call = make::expr_macro(macro_name, args); diff --git a/crates/syntax/src/ast/make.rs b/crates/syntax/src/ast/make.rs index 6fdf10f199..d608a35eff 100644 --- a/crates/syntax/src/ast/make.rs +++ b/crates/syntax/src/ast/make.rs @@ -32,12 +32,9 @@ pub mod ext { use super::*; pub fn simple_ident_pat(name: ast::Name) -> ast::IdentPat { - return from_text(&name.text()); - - fn from_text(text: &str) -> ast::IdentPat { - ast_from_text(&format!("fn f({text}: ())")) - } + ast_from_text(&format!("fn f({}: ())", name.text())) } + pub fn ident_path(ident: &str) -> ast::Path { path_unqualified(path_segment(name_ref(ident))) } @@ -81,7 +78,6 @@ pub mod ext { pub fn expr_self() -> ast::Expr { expr_from_text("self") } - pub fn zero_number() -> ast::Expr { expr_from_text("0") } @@ -116,6 +112,10 @@ pub mod ext { pub fn ty_result(t: ast::Type, e: ast::Type) -> ast::Type { ty_from_text(&format!("Result<{t}, {e}>")) } + + pub fn token_tree_from_node(node: &ast::SyntaxNode) -> ast::TokenTree { + ast_from_text(&format!("todo!{node}")) + } } pub fn name(name: &str) -> ast::Name { @@ -643,8 +643,8 @@ pub fn expr_method_call( ) -> ast::MethodCallExpr { expr_from_text(&format!("{receiver}.{method}{arg_list}")) } -pub fn expr_macro(path: ast::Path, arg_list: ast::ArgList) -> ast::MacroExpr { - expr_from_text(&format!("{path}!{arg_list}")) +pub fn expr_macro(path: ast::Path, tt: ast::TokenTree) -> ast::MacroExpr { + expr_from_text(&format!("{path}!{tt}")) } pub fn expr_ref(expr: ast::Expr, exclusive: bool) -> ast::Expr { expr_from_text(&if exclusive { format!("&mut {expr}") } else { format!("&{expr}") }) @@ -1226,7 +1226,7 @@ pub fn meta_path(path: ast::Path) -> ast::Meta { pub fn token_tree( delimiter: SyntaxKind, - tt: Vec>, + tt: impl IntoIterator>, ) -> ast::TokenTree { let (l_delimiter, r_delimiter) = match delimiter { T!['('] => ('(', ')'), diff --git a/crates/syntax/src/ast/syntax_factory/constructors.rs b/crates/syntax/src/ast/syntax_factory/constructors.rs index 9b816d0b2f..1854000d3d 100644 --- a/crates/syntax/src/ast/syntax_factory/constructors.rs +++ b/crates/syntax/src/ast/syntax_factory/constructors.rs @@ -584,15 +584,15 @@ impl SyntaxFactory { ast } - pub fn expr_macro(&self, path: ast::Path, args: ast::ArgList) -> ast::MacroExpr { - let ast = make::expr_macro(path.clone(), args.clone()).clone_for_update(); + pub fn expr_macro(&self, path: ast::Path, tt: ast::TokenTree) -> ast::MacroExpr { + let ast = make::expr_macro(path.clone(), tt.clone()).clone_for_update(); if let Some(mut mapping) = self.mappings() { let macro_call = ast.macro_call().unwrap(); let mut builder = SyntaxMappingBuilder::new(macro_call.syntax().clone()); builder.map_node(path.syntax().clone(), macro_call.path().unwrap().syntax().clone()); builder - .map_node(args.syntax().clone(), macro_call.token_tree().unwrap().syntax().clone()); + .map_node(tt.syntax().clone(), macro_call.token_tree().unwrap().syntax().clone()); builder.finish(&mut mapping); }