• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2* Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3* Licensed under the Apache License, Version 2.0 (the "License");
4* you may not use this file except in compliance with the License.
5* You may obtain a copy of the License at
6*
7* http://www.apache.org/licenses/LICENSE-2.0
8*
9* Unless required by applicable law or agreed to in writing, software
10* distributed under the License is distributed on an "AS IS" BASIS,
11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12* See the License for the specific language governing permissions and
13* limitations under the License.
14*/
15
16// h2sa
17export let proxyFuncTemplate = `[retType] [serviceName]Proxy::[funcName]([params])
18{
19    int retCode;
20    MessageParcel data, reply;
21    MessageOption option;
22    data.WriteInterfaceToken(GetDescriptor());
23    [writeData]
24    retCode = Remote()->SendRequest([funcEnum], data, reply, option);
25    retCode = reply.ReadInt32();
26    if (retCode != ERR_OK) {
27      // Todo 错误处理
28    }
29
30    [readReply]
31}\n\n`;
32
33export let stubInnerFuncTemplate = `ErrCode [serviceName]Stub::[funcName]Inner(MessageParcel &data, MessageParcel &reply)
34{
35    int retCode = ERR_OK;
36    [readData]
37    [writeReply]
38    return retCode;
39}
40`;
41
42export let serviceFuncImplTemplate = `[retType] [serviceName]Service::[funcName]([params])
43{
44    [retType] ret = [initRetvalue];
45    // TODO: Invoke the business implementation
46    return ret;
47}
48`;
49
50
51// h2hdf
52export let hdiServiceFuncTemplate = `int32_t [marcoName]InterfaceService::[functionName]([params])
53{
54    // [hdf-gen] TODO: Invoke the business implementation
55    return HDF_SUCCESS;
56}
57`;
58
59// h2dtscpp
60
61// dts template
62export let dtsFuncTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_introduce_replace]方法的dts接口
63* 输入: [input_introduce_replace]
64* 输出: [func_return_replace]
65*/
66export const [func_name_replace]:([func_param_replace]) => [func_return_replace];
67`
68
69// napi方法的初始化
70export let napiFuncInitTemplate = `// [NAPI_GEN]:方法注册后,js方法与native方法映射
71    { "[func_name_replace]" , nullptr, [func_name_replace], nullptr, nullptr, nullptr, napi_default, nullptr },
72`;
73
74// napi方法定义
75export let napiFuncHTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_name_replace]的napi方法,
76* 输入:[input_introduce_replace]
77* 输出:[func_return_replace]
78*/
79napi_value [func_name_replace](napi_env env, napi_callback_info info);
80`;
81
82// napi方法体实现
83export let napiFuncCppTemplate = `/* [NAPI_GEN]:对应[file_introduce_replace]中:[func_name_replace]的napi方法,
84* 输入:[input_introduce_replace]
85* 输出:[output_introduce_replace]
86*/
87napi_value [func_name_replace](napi_env env, napi_callback_info info)
88{
89  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] begins");
90  napi_status status;
91  /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段
92   * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述
93   * engin_reserved: 一个保留给Js引擎使用的指针
94   * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。
95   * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。
96   * error_message_len:错误消息字符串的长度。
97   */
98  const napi_extended_error_info *extended_error_info;
99  /* [NAPI_GEN]: tag: 日志打印标签*/
100  const char *tag = "[[get_error_msg_tag]]";
101  /* [NAPI_GEN]: get function param in*/
102  [func_getParam_replace]
103  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get return info begins");
104  [func_return_replace]
105}
106
107`;
108
109// napi方法返回值处理
110export let napiFuncRetTemplate = `  // Todo: add business logic. 在这前后代码为框架所生成
111
112  /* [NAPI_GEN]: function return value*/
113  [return_replace]
114  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get return info ends");
115  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] ends");
116  return [return_name]Out;
117`;
118
119// napi方法返回值各种类型模板
120export let uint32tRet =  `  napi_value [return_name_replace]Out;
121  /* [NAPI_GEN]: 返回值是uint32_t类型时,napi_create_uint32创建一个包含32位无符号整数(uint32_t)的js数值对象
122   * env: 当前环境的句柄
123   * value: 要转换成js数值的uint32_t值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
124   * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js数值对象
125   */
126  status = napi_create_uint32(env, 1, &[return_name_replace]Out);
127  if (status != napi_ok) {
128      /*错误处理*/
129      getErrMessage(status, env, extended_error_info, "napi_create_uint32", tag);
130      return nullptr;
131  }
132`;
133
134export let stringRet =  `  napi_value [return_name_replace]Out;
135  /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
136   * env: 当前环境的句柄
137   * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以"[return_name_replace]"举例,用户可根据需求修改
138   * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
139   * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
140   */
141  status = napi_create_string_utf8(env, "[return_name_replace]", NAPI_AUTO_LENGTH, &[return_name_replace]Out);
142  if (status != napi_ok) {
143      /*错误处理*/
144      getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
145      return nullptr;
146  }
147`;
148
149export let stringRetUtf16 =  `  napi_value [return_name_replace]Out;
150  /* [NAPI_GEN]: 返回值是字符串时,napi_create_string_utf16用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-16编码的字符串创建一个等价的js字符串
151   * env: 当前环境的句柄
152   * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以"[return_name_replace]"举例,用户可根据需求修改
153   * length: 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
154   * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
155   */
156  status = napi_create_string_utf16(env, u"[return_name_replace]", NAPI_AUTO_LENGTH, &[return_name_replace]Out);
157  if (status != napi_ok) {
158      /*错误处理*/
159      getErrMessage(status, env, extended_error_info, "napi_create_string_utf16", tag);
160      return nullptr;
161  }
162`;
163
164export let int64tRet =  `  napi_value [return_name_replace]Out;
165  /* [NAPI_GEN]: 返回值是int64类型时,napi_create_int64创建一个包含64位整数(int64_t)的js数值对象
166   * env: 当前环境的句柄
167   * value: 要转换成js数值的int64_t值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
168   * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js数值对象
169   */
170  status = napi_create_int64(env, 1, &[return_name_replace]Out);
171  if (status != napi_ok) {
172      getErrMessage(status, env, extended_error_info, "napi_create_int64", tag);
173      return nullptr;
174  }
175`;
176
177export let int32tRet =  `  napi_value [return_name_replace]Out;
178  /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
179   * env: 当前环境的句柄
180   * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
181   * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
182   */
183  status = napi_create_int32(env, 1, &[return_name_replace]Out);
184  if (status != napi_ok) {
185      getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
186      return nullptr;
187  }
188`;
189
190export let doubleRet =  `  napi_value [return_name_replace]Out;
191  /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
192   * env: 当前环境的句柄
193   * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
194   * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
195   */
196  status = napi_create_double(env, 1.0, &[return_name_replace]Out);
197  if (status != napi_ok) {
198      getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
199      return nullptr;
200  }
201`;
202
203export let boolRet =  `  napi_value [return_name_replace]Out;
204  /* [NAPI_GEN]: 返回值是bool类型时,napi_get_boolean创建一个表示布尔值的js Boolean对象
205   * env: 当前环境的句柄
206   * value: 希望表示的布尔值(C中的true或者false),这里以传入true为例,用例新增业务代码时可根据自身需求修改
207   * result: 函数返回一个napi_value,它是对应于js Boolean对象的C语言表示
208   */
209  status = napi_get_boolean(env, true, &[return_name_replace]Out);
210  if (status != napi_ok) {
211      getErrMessage(status, env, extended_error_info, "napi_get_boolean", tag);
212      return nullptr;
213  }
214`;
215
216export let objectRet =  `  napi_value [return_name_replace]Out;
217  /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
218   * env: 当前环境的句柄
219   * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
220   */
221  status = napi_create_object(env, &[return_name_replace]Out);
222  if (status != napi_ok) {
223      getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
224      return nullptr;
225  }
226`;
227
228export let objectTosetRet =  `  /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
229  * env: 当前环境的句柄
230  * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
231  * utf8name: 属性的名称,是一个以UTF-8编码的字符串
232  * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
233  */
234  status = napi_set_named_property(env, [set_objname_replace]Out, "[set_propname_replace]", [set_propvalue_replace]Out);
235  if (status != napi_ok) {
236     /* [NAPI_GEN]: 错误处理*/
237     getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
238     return nullptr;
239  }
240`;
241
242export let promiseRet =  `  napi_value [return_name_replace]Out;
243  napi_deferred [return_name_replace]DeferedOut;
244  /* [NAPI_GEN]: 创建一个空的promise对象
245   * env: N-API环境的句柄,表示当前的上下文
246   * promise: 用于接收创建的promise对象的指针
247   * deferred: 用于接收deferred对象的指针
248  */
249  status = napi_create_promise(env, &[return_name_replace]Out, &[return_name_replace]DeferedOut);
250  if (status != napi_ok) {
251     /* [NAPI_GEN]: 错误处理*/
252     getErrMessage(status, env, extended_error_info, "napi_create_promise", tag);
253     return nullptr;
254  }
255  // Todo: create async work here.
256`;
257
258
259// napi func的paramGen template
260export let paramGenTemplate = `  napi_valuetype valuetype[param_name_replace];
261  /* [NAPI_GEN]: 获取入参类型,第[param_index_replace]个入参
262   * env: N-API环境的句柄,表示当前的上下文
263   * value: 要检查类型的js值
264   * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里
265   */
266  status = napi_typeof(env, args[[param_index_replace]], &valuetype[param_name_replace]);
267  if (status != napi_ok) {
268      getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
269      return nullptr;
270  }
271  [getParam_replace]
272`;
273
274export let funcGetParamTemplate = `    /* [NAPI_GEN]: argc:js传入的参数个数 */
275  size_t argc = [param_length];
276  /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */
277  napi_value args[[param_length]] = {nullptr};
278  /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值
279   * env: 当前环境的句柄,代表当前的Node.js环境
280   * info: 回调信息句柄,代表当前回调的上下文
281   * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量
282   * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。
283   * this_arg: 如果不是NULL,则返回js回调中this的值
284   * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据
285   */
286  status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
287  if(status != napi_ok) {
288      /* [NAPI_GEN]: 错误处理*/
289      getErrMessage(status, env,extended_error_info, "napi_get_cb_info", tag);
290      return nullptr;
291  }
292  /* [NAPI_GEN]: 从args数组中获取入参 */
293  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get param info begins");
294  [getAllParam_replace]
295  OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "[func_name_replace]", "[func_name_replace] get param info ends");
296`;
297
298export let uint32tIn =  `  uint32_t [param_name_replace]In = 0;
299  /* [NAPI_GEN]: napi_get_value_uint32将一个napi_value类型的js布尔值转换成一个C语言的uint32_t类型的数值,第[param_index_replace]个入参
300   * env: N-API环境的句柄,表示当前的上下文
301   * value:要转换的JavaScript值
302   * result:指向 uint32_t 类型的指针,在这里函数将存储转换后的无符号整数
303   */
304  status = napi_get_value_uint32(env, args[[param_index_replace]], &[param_name_replace]In);
305  if (status != napi_ok) {
306      getErrMessage(status, env, extended_error_info, "napi_get_value_uint32", tag);
307      return nullptr;
308  }
309`;
310
311export let stringIn =  `  size_t strSize[param_index_replace] = 0;
312  /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
313   * env: N-API环境的句柄,表示当前的上下文
314   * value: 要转换的JavaScript字符串
315   * buf: 用于存储结果的字符数组的指针
316   * bufsize: 缓冲区大小,以字节为单位
317   * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
318   */
319  /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
320  status = napi_get_value_string_utf8(env, args[[param_index_replace]], NULL, 0, &strSize[param_index_replace]);
321  if (status != napi_ok) {
322      getErrMessage(status, env, extended_error_info, "get value string", tag);
323      return nullptr;
324  }
325  char *[param_name_replace]In = new char[strSize[param_index_replace] + 1];
326  /* [NAPI_GEN]: 用于获取字符串*/
327  status = napi_get_value_string_utf8(env, args[[param_index_replace]], [param_name_replace]In, strSize[param_index_replace] + 1, &strSize[param_index_replace]);
328  if (status != napi_ok) {
329      getErrMessage(status, env, extended_error_info, "get value string", tag);
330      delete[] [param_name_replace]In;
331      return nullptr;
332  }
333  // delete[] [param_name_replace]In;  // remember to delete memory
334`;
335
336export let stringInUtf16 =  `  size_t strSize[param_index_replace] = 0;
337  /* [NAPI_GEN]: napi_get_value_string_utf16用于将Js字符串转换为UTF-16编码的C字符串
338   * env: N-API环境的句柄,表示当前的上下文
339   * value: 要转换的JavaScript字符串
340   * buf: 用于存储结果的字符数组的指针
341   * bufsize: 缓冲区大小,以字节为单位
342   * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
343   */
344  /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
345  status = napi_get_value_string_utf16(env, args[[param_index_replace]], NULL, 0, &strSize[param_index_replace]);
346  if (status != napi_ok) {
347      getErrMessage(status, env, extended_error_info, "get value string", tag);
348      return nullptr;
349  }
350  char16_t *[param_name_replace]In = new char16_t[strSize[param_index_replace] + 1];
351  /* [NAPI_GEN]: 用于获取字符串*/
352  status = napi_get_value_string_utf16(env, args[[param_index_replace]], [param_name_replace]In, strSize[param_index_replace] + 1, &strSize[param_index_replace]);
353  if (status != napi_ok) {
354      getErrMessage(status, env, extended_error_info, "get value string", tag);
355      delete[] [param_name_replace]In;
356      return nullptr;
357  }
358  // delete[] [param_name_replace]In;  // remember to delete memory
359`;
360
361export let int64tIn =  `  int64_t [param_name_replace]In = 0;
362  /* [NAPI_GEN]: napi_get_value_int64将一个 napi_value 类型的 js 布尔值转换成一个 C 语言的 int64_t 类型的数值
363   * env: N-API环境的句柄,表示当前的上下文
364   * value:要转换的JavaScript值
365   * result:指向 int64_t 类型的指针,在这里函数将存储转换后的整数值
366   */
367  status = napi_get_value_int64(env, args[[param_index_replace]], &[param_name_replace]In);
368  if (status != napi_ok) {
369      getErrMessage(status, env, extended_error_info, "napi_get_value_int64", tag);
370      return nullptr;
371  }
372`;
373
374export let int32tIn =  `  int32_t [param_name_replace]In = 0;
375  /* [NAPI_GEN]: napi_get_value_int32将一个 napi_value 类型的 js 数值转换成一个 C 语言的 int32_t 类型的数值
376   * env: N-API环境的句柄,表示当前的上下文
377   * value:要转换的JavaScript值
378   * result:指向 int32_t 类型的指针,在这里函数将存储转换后的整数值
379   */
380  status = napi_get_value_int32(env, args[[param_index_replace]], &[param_name_replace]In);
381  if (status != napi_ok) {
382      /* [NAPI_GEN]: 错误处理*/
383      getErrMessage(status, env, extended_error_info, "napi_get_value_int32", tag);
384      return nullptr;
385  }
386`;
387
388export let doubleIn =  `  double [param_name_replace]In = 0;
389  /* [NAPI_GEN]: napi_get_value_double将一个 napi_value 类型的 js 数值转换成一个 C 语言的 double 类型的数值
390   * env: N-API环境的句柄,表示当前的上下文
391   * value:要转换的JavaScript值
392   * result:指向 double 类型的指针,在这里函数将存储转换后的双精度浮点数
393   */
394  status = napi_get_value_double(env, args[[param_index_replace]], &[param_name_replace]In);
395  if (status != napi_ok) {
396      getErrMessage(status, env, extended_error_info, "napi_get_value_double", tag);
397      return nullptr;
398  }
399`;
400
401export let boolIn =  `  bool [param_name_replace]In = 0;
402  /* [NAPI_GEN]: napi_get_value_bool将一个 napi_value 类型的 js 布尔值转换成一个 C 语言的 bool 类型的数值
403   * env: N-API环境的句柄,表示当前的上下文
404   * value:要转换的JavaScript值
405   * result:指向 bool 类型的指针,在这里函数将存储转换后的布尔值
406   */
407  status = napi_get_value_bool(env, args[[param_index_replace]], &[param_name_replace]In);
408  if (status != napi_ok) {
409      getErrMessage(status, env, extended_error_info, "napi_get_value_bool", tag);
410      return nullptr;
411  }
412`;
413
414export let callbackIn =  `
415  napi_value argv;
416  // Todo: 创建要传递给回调函数的参数
417  napi_value result;
418  /**
419  * env: napi_env 类型的环境变量
420  * this_arg: 指向 JavaScript 对象的指针,表示回调函数中的 this 值。如果不需要递 this 值,则可以设置为 nullptr。
421  * func: 指向 JavaScript 回调函数的指针。
422  * argc: 传递给回调函数的参数数量。示例中传递了一个参数。
423  * argv: 一个 napi_value 类型的数组,用于存储要传递给回调函数的参数。示例中传递了一个参数。
424
425  * result: 指向返回值的指针。如果回调函数没有返回值,则可以设置为 nullptr。
426  */
427  napi_call_function(env, nullptr, args[[param_index_replace]], 1, &argv, result);
428`;
429
430// class与struct模板  class主体 放在xxxnapi.cpp中
431export let classTemplate = `
432// class napi框架主体
433// 这里构造函数都是默认无参构造函数,如果需要自定义构造函数,可以自行添加
434[class_name_replace]::[class_name_replace]() {}
435[class_name_replace]::~[class_name_replace]() { napi_delete_reference(env_, wrapper_); }
436void [class_name_replace]::Destructor(napi_env env, void* nativeObject, [[maybe_unused]] void* finalize_hint)
437{
438  reinterpret_cast<[class_name_replace]*>(nativeObject)->~[class_name_replace]();
439}
440napi_value [class_name_replace]::New(napi_env env, napi_callback_info info)
441{
442  napi_value newTarget;
443  napi_status status;
444  // Check if the constructor was invoked with new.
445  napi_get_new_target(env, info, &newTarget);
446  if (newTarget != nullptr) {
447    // Invoked as the constructor "new [class_name_replace]()".
448    napi_value jsThis;
449    // Retrieve the callback's context and arguments.
450    status = napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr);
451    if (status != napi_ok) {
452      getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
453      return nullptr;
454    }
455    // Create the C++ object. 默认调用无参构造函数,如果需要自定义构造函数,可以自行添加
456    [class_name_replace]* obj = new [class_name_replace]();
457    obj->env_ = env;
458    // Wrap the C++ object obj in the ArkTS object jsThis.
459    status =napi_wrap(env, jsThis, reinterpret_cast<void*>(obj), [class_name_replace]::Destructor, nullptr, &obj->wrapper_);
460    if (status != napi_ok) {
461      getErrMessage(status, env, extended_error_info, "napi_wrap", tag);
462      return nullptr;
463    }
464    delete obj;
465    return jsThis;
466  } else {
467    OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "CLASS", "[class_name_replace] must be invoked as a constructor with 'new'");
468    return nullptr;
469  }
470}
471[class_property_get_set_replace]
472[class_method_content_replace]
473`
474
475// class的声明,放在xxxnapi.h文件中
476export let classNapiHTemplate = `
477class [class_name_replace] {
478  public:
479    static napi_value Init(napi_env env, napi_value exports);
480    static void Destructor(napi_env env, void* nativeObject, void*finalize_hint);
481  private:
482    explicit [class_name_replace]();
483    ~[class_name_replace]();
484    static napi_value New(napi_env env, napi_callback_info info);
485    // 属性的get set函数声明
486    [class_property_get_set_declare]
487    // 方法的声明
488    [class_method_declare]
489    // 变量的声明
490    [class_variable_declare]
491    napi_env env_;
492    napi_ref wrapper_;
493};
494`
495
496// 替换classNapiHTemplate模板中的内容
497export let classMethodDeclareTemplate = `
498    static napi_value [class_method_name_replace](napi_env env, napi_callback_info info);
499`
500
501// 成员方法无入参
502export let classMethodNoParamTemplate = `
503  napi_value jsThis;
504  // 注释
505  status = napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr);
506  if (status != napi_ok) {
507    getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
508    return nullptr;
509  }
510`
511
512// 成员方法有入参
513export let classMethodGetParamTemplate = `
514  napi_value jsThis;
515  size_t argc = [param_count_replace];
516  napi_value args[[param_count_replace]];
517  // 注释
518  status = napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
519  if (status != napi_ok) {
520     getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
521     return nullptr;
522  }
523  [class_method_get_param]
524`
525
526// class的成员方法Napi实现 放在xxxnapi.cpp文件中
527export let classMethodTemplate = `
528// [NAPI_GEN]:class成员函数的实现方法
529napi_value [class_name_replace]::[class_method_name_replace](napi_env env, napi_callback_info info)
530{
531  [class_method_param_in]
532  // Todo: business logic here.
533  [class_name_replace]* obj;
534  // 通过napi_unwrap将jsThis之前绑定的C++对象取出,并对其进行操作
535  napi_unwrap(env, jsThis, reinterpret_cast<void**>(&obj));
536  // Todo: you can get value from js and set value to C++.
537  [class_method_return]
538}
539`
540export let classPropertyGetTemplate = `
541// [NAPI_GEN]:class成员变量的get方法
542napi_value [class_name_replace]::Get[class_property_name_replace](napi_env env  napi_callback_info info)
543{
544  napi_value jsThis;
545  napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr);
546  [class_name_replace]* obj;
547  // Retrieve obj (the C++ object) previously wrapped in jsThis (the ArkTobject), and perform subsequent operations.
548  napi_unwrap(env, jsThis, reinterpret_cast<void**>(&obj));
549  // Todo:  get value from C++.
550  // return value to js...
551  [class_property_get]
552}
553`;
554
555export let classPropertySetTemplate = `
556// [NAPI_GEN]:class成员变量的set方法
557napi_value [class_name_replace]::Set[class_property_name_replace](napi_env env, napi_callback_info info)
558{
559  napi_value jsThis;
560  napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr);
561  [class_name_replace]* obj;
562  napi_unwrap(env, jsThis, reinterpret_cast<void**>());
563  napi_value jsThis;
564  size_t argc = 1;
565  napi_value args[1];
566  napi_get_cb_info(env, info, &argc, args, &jsThis, nullptr);
567  [class_name_replace]* obj;
568  napi_unwrap(env, jsThis, reinterpret_cast<void**>(&obj));
569  // 例如: napi_get_value_int32(env, args[0], &obj->a);
570  [class_property_set]
571  // Todo: set value to C++.
572  return nullptr;
573}
574`;
575
576// 每个类的成员属性都对应一个get和set函数
577export let classPropertyDeclareTemplate = `
578    // [NAPI_GEN]:方法注册后,js与native的class属性映射get与set
579    { [class_property_name_replace], 0, 0, Get[class_property_name_replace], Set[class_property_name_replace], 0, napi_default, 0 },
580`;
581
582export let classInitTemplate = `
583  // Define properties and methods for a N-API object
584  napi_property_descriptor [class_name_replace]Properties[] = {
585    // 成员属性的get与set
586    [class_property_replace]
587     // 成员方法的调用
588    [class_method_replace]
589  };
590  napi_value cons;
591  // Define a js class 这里需要介绍class这个参数
592  napi_define_class(env, "[class_name_replace]", NAPI_AUTO_LENGTH, New, nullptr,
593    sizeof([class_name_replace]Properties) / sizeof([class_name_replace]Properties[0]), [class_name_replace]Properties, &cons);
594  // Set the '[class_name_replace]' class on the exports object.
595  napi_set_named_property(env, exports, "[class_name_replace]", cons);
596`
597
598// napi testAbility需要生成的方法模板
599export let testAbilityFuncTemplate = `  /* [NAPI_GEN]:对应[file_introduce_replace]中:[test_case_name]的dts接口测试用例
600  * 方法输入: [input_introduce_replace]
601  * 方法输出: [func_return_replace]
602  */
603  it('[test_case_name]', 0, () => {
604    // Defines a test case. This API supports three parameters: test case name, filter parameter, and test case function.
605    hilog.info(0x0000, 'testTag', '%{public}s', 'it [test_case_name] begin');
606
607    [func_direct_testCase]
608
609    // Defines a variety of assertion methods, which are used to declare expected boolean conditions.
610    // e.g. expect(result).assertEqual(2+3)
611  })
612`;
613