From d6c755c4eb8b2a56e226866d9a595ad2d712ebcc Mon Sep 17 00:00:00 2001 From: Devon Govett Date: Fri, 13 May 2022 00:55:54 -0400 Subject: [PATCH] fix(napi-derive): `js_name` support for getters and setters (#1179) --- crates/macro/src/parser/mod.rs | 42 ++++++++++++-------- examples/napi/__test__/typegen.spec.ts.md | 2 + examples/napi/__test__/typegen.spec.ts.snap | Bin 3133 -> 3151 bytes examples/napi/__test__/values.spec.ts | 3 ++ examples/napi/index.d.ts | 2 + examples/napi/src/class.rs | 10 +++++ 6 files changed, 43 insertions(+), 16 deletions(-) diff --git a/crates/macro/src/parser/mod.rs b/crates/macro/src/parser/mod.rs index 2f898072..aae59dc9 100644 --- a/crates/macro/src/parser/mod.rs +++ b/crates/macro/src/parser/mod.rs @@ -540,23 +540,33 @@ fn napi_fn_from_decl( Diagnostic::from_vec(errors).map(|_| { let js_name = if let Some(prop_name) = opts.getter() { - if let Some(ident) = prop_name { - ident.to_string() - } else { - ident - .to_string() - .trim_start_matches("get_") - .to_case(Case::Camel) - } + opts.js_name().map_or_else( + || { + if let Some(ident) = prop_name { + ident.to_string() + } else { + ident + .to_string() + .trim_start_matches("get_") + .to_case(Case::Camel) + } + }, + |(js_name, _)| js_name.to_owned(), + ) } else if let Some(prop_name) = opts.setter() { - if let Some(ident) = prop_name { - ident.to_string() - } else { - ident - .to_string() - .trim_start_matches("set_") - .to_case(Case::Camel) - } + opts.js_name().map_or_else( + || { + if let Some(ident) = prop_name { + ident.to_string() + } else { + ident + .to_string() + .trim_start_matches("set_") + .to_case(Case::Camel) + } + }, + |(js_name, _)| js_name.to_owned(), + ) } else if opts.constructor().is_some() { "constructor".to_owned() } else { diff --git a/examples/napi/__test__/typegen.spec.ts.md b/examples/napi/__test__/typegen.spec.ts.md index d22d65b1..8b46b46a 100644 --- a/examples/napi/__test__/typegen.spec.ts.md +++ b/examples/napi/__test__/typegen.spec.ts.md @@ -191,6 +191,8 @@ Generated by [AVA](https://avajs.dev). static withKind(kind: Kind): Animal␊ get name(): string␊ set name(name: string)␊ + get type(): Kind␊ + set type(kind: Kind)␊ /**␊ * This is a␊ * multi-line comment␊ diff --git a/examples/napi/__test__/typegen.spec.ts.snap b/examples/napi/__test__/typegen.spec.ts.snap index 6c9e20490804c8b59a9254b3eb1e1f186595e69d..ca1b89b0c23f46311216a7f6183a8d7eb4f52863 100644 GIT binary patch literal 3151 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 XPSR}CcPk&KZtnaa`g#Gbe=7h0vGEDf diff --git a/examples/napi/__test__/values.spec.ts b/examples/napi/__test__/values.spec.ts index f1ad6054..64f38521 100644 --- a/examples/napi/__test__/values.spec.ts +++ b/examples/napi/__test__/values.spec.ts @@ -158,6 +158,9 @@ test('class', (t) => { t.deepEqual(dog.returnOtherClass(), new Dog('Doge')) t.deepEqual(dog.returnOtherClassWithCustomConstructor(), new Bird('parrot')) t.is(dog.returnOtherClassWithCustomConstructor().getCount(), 1234) + t.is(dog.type, Kind.Dog) + dog.type = Kind.Cat + t.is(dog.type, Kind.Cat) const assets = new Assets() t.is(assets.get(1)?.filePath, 1) }) diff --git a/examples/napi/index.d.ts b/examples/napi/index.d.ts index d3adb048..cd564af2 100644 --- a/examples/napi/index.d.ts +++ b/examples/napi/index.d.ts @@ -181,6 +181,8 @@ export class Animal { static withKind(kind: Kind): Animal get name(): string set name(name: string) + get type(): Kind + set type(kind: Kind) /** * This is a * multi-line comment diff --git a/examples/napi/src/class.rs b/examples/napi/src/class.rs index 8d1a2a98..63405e02 100644 --- a/examples/napi/src/class.rs +++ b/examples/napi/src/class.rs @@ -41,6 +41,16 @@ impl Animal { self.name = name; } + #[napi(getter, js_name = "type")] + pub fn kind(&self) -> Kind { + self.kind + } + + #[napi(setter, js_name = "type")] + pub fn set_kind(&mut self, kind: Kind) { + self.kind = kind; + } + /// This is a /// multi-line comment /// with an emoji 🚀