diff --git a/crates/backend/src/ast.rs b/crates/backend/src/ast.rs index 7dc728fd356..4a98f858cbf 100644 --- a/crates/backend/src/ast.rs +++ b/crates/backend/src/ast.rs @@ -301,6 +301,8 @@ pub struct Function { pub rust_attrs: Vec, /// The visibility of this function in Rust pub rust_vis: syn::Visibility, + /// Whether this is an `unsafe` function + pub r#unsafe: bool, /// Whether this is an `async` function pub r#async: bool, /// Whether to generate a typescript definition for this function diff --git a/crates/backend/src/codegen.rs b/crates/backend/src/codegen.rs index 34cf3a32472..d9e3d9bd301 100644 --- a/crates/backend/src/codegen.rs +++ b/crates/backend/src/codegen.rs @@ -1178,6 +1178,11 @@ impl TryToTokens for ast::ImportFunction { &self.rust_name, ); + let maybe_unsafe = if self.function.r#unsafe { + Some(quote! {unsafe}) + } else { + None + }; let maybe_async = if self.function.r#async { Some(quote! {async}) } else { @@ -1190,7 +1195,7 @@ impl TryToTokens for ast::ImportFunction { #[allow(clippy::all, clippy::nursery, clippy::pedantic, clippy::restriction)] #(#attrs)* #[doc = #doc_comment] - #vis #maybe_async fn #rust_name(#me #(#arguments),*) #ret { + #vis #maybe_async #maybe_unsafe fn #rust_name(#me #(#arguments),*) #ret { #extern_fn unsafe { diff --git a/crates/macro-support/src/parser.rs b/crates/macro-support/src/parser.rs index 148cc55f9cb..a54d8e5934a 100644 --- a/crates/macro-support/src/parser.rs +++ b/crates/macro-support/src/parser.rs @@ -909,6 +909,7 @@ fn function_from_decl( ret, rust_attrs: attrs, rust_vis: vis, + r#unsafe: sig.unsafety.is_some(), r#async: sig.asyncness.is_some(), generate_typescript: opts.skip_typescript().is_none(), variadic: opts.variadic().is_some(),