Skip to content

Commit bb9883a

Browse files
authored
fix(napi-derive): lifetime codegen issue (#2794)
1 parent a2ade0d commit bb9883a

File tree

9 files changed

+53
-2
lines changed

9 files changed

+53
-2
lines changed

crates/backend/src/codegen/fn.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,10 +824,12 @@ fn hidden_ty_lifetime(ty: &mut syn::Type) -> BindgenResult<()> {
824824
..
825825
}) = segments.last_mut()
826826
{
827+
let mut has_lifetime = false;
827828
if let Some(syn::GenericArgument::Lifetime(lt)) = args.first_mut() {
828829
*lt = syn::Lifetime::new("'_", Span::call_site());
830+
has_lifetime = true;
829831
}
830-
for arg in args.iter_mut().skip(1) {
832+
for arg in args.iter_mut().skip(if has_lifetime { 1 } else { 0 }) {
831833
if let syn::GenericArgument::Type(ty) = arg {
832834
hidden_ty_lifetime(ty)?;
833835
}

examples/napi/__tests__/__snapshots__/values.spec.ts.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,12 @@ Generated by [AVA](https://avajs.dev).
171171
method(): string␊
172172
}␊
173173
174+
export declare class CreateStringClass {␊
175+
static new(): CreateStringClass␊
176+
createString(): string | null␊
177+
createStringResult(): string␊
178+
}␊
179+
174180
export declare class CssRuleList {␊
175181
getRules(): Array<string>␊
176182
get parentStyleSheet(): CSSStyleSheet␊
23 Bytes
Binary file not shown.

examples/napi/example.wasi-browser.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export const ClassReturnInPromise = __napiModule.exports.ClassReturnInPromise
8484
export const ClassWithFactory = __napiModule.exports.ClassWithFactory
8585
export const ClassWithLifetime = __napiModule.exports.ClassWithLifetime
8686
export const Context = __napiModule.exports.Context
87+
export const CreateStringClass = __napiModule.exports.CreateStringClass
8788
export const CssRuleList = __napiModule.exports.CssRuleList
8889
export const CSSRuleList = __napiModule.exports.CSSRuleList
8990
export const CssStyleSheet = __napiModule.exports.CssStyleSheet

examples/napi/example.wasi.cjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ module.exports.ClassReturnInPromise = __napiModule.exports.ClassReturnInPromise
129129
module.exports.ClassWithFactory = __napiModule.exports.ClassWithFactory
130130
module.exports.ClassWithLifetime = __napiModule.exports.ClassWithLifetime
131131
module.exports.Context = __napiModule.exports.Context
132+
module.exports.CreateStringClass = __napiModule.exports.CreateStringClass
132133
module.exports.CssRuleList = __napiModule.exports.CssRuleList
133134
module.exports.CSSRuleList = __napiModule.exports.CSSRuleList
134135
module.exports.CssStyleSheet = __napiModule.exports.CssStyleSheet

examples/napi/index.cjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ module.exports.ClassReturnInPromise = nativeBinding.ClassReturnInPromise
414414
module.exports.ClassWithFactory = nativeBinding.ClassWithFactory
415415
module.exports.ClassWithLifetime = nativeBinding.ClassWithLifetime
416416
module.exports.Context = nativeBinding.Context
417+
module.exports.CreateStringClass = nativeBinding.CreateStringClass
417418
module.exports.CssRuleList = nativeBinding.CssRuleList
418419
module.exports.CSSRuleList = nativeBinding.CSSRuleList
419420
module.exports.CssStyleSheet = nativeBinding.CssStyleSheet

examples/napi/index.d.cts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,12 @@ export declare class Context {
133133
method(): string
134134
}
135135

136+
export declare class CreateStringClass {
137+
static new(): CreateStringClass
138+
createString(): string | null
139+
createStringResult(): string
140+
}
141+
136142
export declare class CssRuleList {
137143
getRules(): Array<string>
138144
get parentStyleSheet(): CSSStyleSheet

examples/napi/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#[cfg(not(target_family = "wasm"))]
99
use napi::bindgen_prelude::create_custom_tokio_runtime;
1010
use napi::bindgen_prelude::{JsObjectValue, Object, Result, Symbol};
11-
pub use napi_shared::*;
11+
// pub use napi_shared::*;
1212

1313
#[macro_use]
1414
extern crate napi_derive;
@@ -75,6 +75,7 @@ mod fn_ts_override;
7575
mod function;
7676
mod generator;
7777
mod js_mod;
78+
mod lifetime;
7879
mod map;
7980
mod nullable;
8081
mod number;

examples/napi/src/lifetime.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use std::path::{Path, PathBuf};
2+
3+
use napi::{Env, JsString, Result};
4+
5+
#[napi]
6+
pub struct CreateStringClass {
7+
inner: PathBuf,
8+
}
9+
10+
#[napi]
11+
impl CreateStringClass {
12+
#[napi]
13+
pub fn new() -> Self {
14+
Self {
15+
inner: PathBuf::from(""),
16+
}
17+
}
18+
19+
#[napi]
20+
pub fn create_string<'env>(&self, env: &'env Env) -> Option<JsString<'env>> {
21+
create_string(env, &self.inner).ok()
22+
}
23+
24+
#[napi]
25+
pub fn create_string_result<'env>(&self, env: &'env Env) -> Result<JsString<'env>> {
26+
create_string(env, &self.inner)
27+
}
28+
}
29+
30+
fn create_string<'env>(env: &'env Env, path: &Path) -> Result<JsString<'env>> {
31+
let path = path.to_string_lossy();
32+
env.create_string(path.as_ref())
33+
}

0 commit comments

Comments
 (0)