• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 Shenzhen Kaihong Digital.
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 package gen;
17 
18 import grammar.*;
19 import utils.FileUtils;
20 import utils.StringUtils;
21 
22 import java.io.File;
23 import java.util.List;
24 import java.util.Locale;
25 import java.util.Map;
26 
27 /**
28  * <h3>类名:该类用于xxx</h3>
29  * description ${description}
30  *
31  * @author ${USER}
32  * date 2025-02-28
33  * @since 2025-02-28
34  * @version 1.0
35  */
36 public class GenNapiCppFile extends GeneratorBase {
37     private static final String NAPI_ENUM_TOKEN = "enum";
38     private static final String NAPI_CLASS_TOKEN = "class";
39     private static final String NAPI_STRUCT_TOKEN = "struct";
40     private static final String NAPI_UNION_TOKEN = "union";
41     private static final String NAPI_TEMPLATE_TOKEN = "template";
42     private static final String NAPI_TYPE_NAME_TOKEN = "typename";
43     private static final String NAPI_STAR_TOKEN = "*";
44     private static final String NAPI_CHAR_START_TOKEN = "char*";
45     private static final String NAPI_AUTO_TOKEN = "auto";
46     private static final String NAPI_EXPORT_TOKEN = "export";
47     private static final String NAPI_IMPLEMENNAPI_TOKEN = "implements";
48     private static final String NAPI_EXTENDS_TOKEN = "extends";
49     private static final String NAPI_CONST_TOKEN = "const";
50     private static final String NAPI_PRIVATE_TOKEN = "private";
51     private static final String NAPI_PUBLIC_TOKEN = "public";
52     private static final String NAPI_INTERFACE_TOKEN = "interface";
53     private static final String NAPI_PROTECTED_TOKEN = "protected";
54     private static final String NAPI_STATIC_TOKEN = "static";
55     private static final String NAPI_ANY_TOKEN = "any";
56     private static final String NAPI_VOID_TOKEN = "void";
57     private static final String NAPI_NUMBER_TOKEN = "number";
58     private static final String NAPI_NEVER_TOKEN = "never";
59     private static final String NAPI_BOOLEAN_TOKEN = "boolean";
60     private static final String NAPI_STRING_TOKEN = "string";
61     private static final String NAPI_UNIQUE_TOKEN = "unique";
62     private static final String NAPI_SYMBOL_TOKEN = "symbol";
63     private static final String NAPI_UNDEFINED_TOKEN = "undefined";
64     private static final String NAPI_OBJECT_TOKEN = "object";
65     private static final String NAPI_OF_TOKEN = "of";
66     private static final String NAPI_KEYOF_TOKEN = "keyof";
67     private static final String NAPI_TYPE_TOKEN = "type";
68     private static final String NAPI_CONSTRUCTOR_TOKEN = "constructor";
69     private static final String NAPI_NAMESPACE_TOKEN = "namespace";
70     private static final String NAPI_REQUIRE_TOKEN = "require";
71     private static final String NAPI_MODULE_TOKEN = "module";
72     private static final String NAPI_DECLARE_TOKEN = "declare";
73     private static final String NAPI_ABSTRACT_TOKEN = "abstract";
74     private static final String NAPI_DEBUGGER_TOKEN = "debugger";
75     private static final String NAPI_FUNCTION_TOKEN = "function";
76     private static final String NAPI_THIS_TOKEN = "this";
77     private static final String NAPI_WITH_TOKEN = "with";
78     private static final String NAPI_DEFAULT_TOKEN = "default";
79     private static final String NAPI_READONLY_TOKEN = "readonly";
80     private static final String NAPI_ASYNC_TOKEN = "async";
81     private static final String NAPI_AWAIT_TOKEN = "await";
82     private static final String NAPI_YIELD_TOKEN = "yield";
83     private static final String NAPI_NEW_LINE = "\n";
84     private static final String NAPI_TAB_SPACE = "\t";
85     private static final String NAPI_BLANK_SPACE = " ";
86     private static final String NAPI_SPLIT = " | ";
87     private static final String NAPI_EQUAL = " = ";
88     private static final String NAPI_COMMA = ",";
89     private static final String NAPI_DOUBLE_QUOTATION = "\"";
90     private static final String NAPI_UNDER_LINE = "_";
91     private static final String NAPI_SEMICOLON = ";";
92     private static final String NAPI_COLON = ":";
93     private static final String NAPI_ELLIPSIS = "...";
94     private static final String NAPI_DOT = ".";
95     private static final String NAPI_LEFT_BRACE = "{";
96     private static final String NAPI_RIGHT_BRACE = "}";
97     private static final String NAPI_LEFT_PARENTHESES = "(";
98     private static final String NAPI_RIGHT_PARENTHESES = ")";
99     private static final String NAPI_LEFT_SQUARE_BRACKET = "[";
100     private static final String NAPI_RIGHT_SQUARE_BRACKET = "]";
101     private static final String NAPI_LEFT_ANGLE_BRACKET = "<";
102     private static final String NAPI_RIGHT_ANGLE_BRACKET = ">";
103 
104     private static final String NAPI_STD_STRING = "std::string";
105     private static final String NAPI_STD_VECTOR = "std::vector";
106     private static final String NAPI_STD_LIST = "std::list";
107     private static final String NAPI_STD_ARRAY = "std::array";
108     private static final String NAPI_STD_STACK = "std::stack";
109     private static final String NAPI_STD_QUEUE = "std::queue";
110     private static final String NAPI_STD_PAIR = "std::pair";
111     private static final String NAPI_STD_MAP = "std::map";
112     private static final String NAPI_STD_SET = "std::set";
113     private static final String NAPI_STD_DEQUE = "std::deque";
114     private static final String NAPI_STD_MULTIMAP = "std::multimap";
115     private static final String NAPI_STD_MULTISET = "std::multiset";
116 
117     private static final String NAPI_ASYNC_SUFFIX = "Async";
118     private static final String NAPI_PROMISE_SUFFIX = "Promise";
119     private static final String NAPI_STR_SUFFIX = "STR";
120     private static final String NAPI_FILE_PREFIX = "ag_";
121     private static final String NAPI_FILE_H_SUFFIX = ".h";
122     private static final String NAPI_FILE_NAPI_SUFFIX = ".cpp";
123     private static final String NAPI_FILE_C_SUFFIX = ".c";
124     private static final String NAPI_STRUCT_SUFFIX = "ST";
125 
126     private static final String NAPI_ENUM_NAME = "NAPI_ENUM_NAME";
127     private static final String NAPI_ENUM_MEM_LIST = "NAPI_ENUM_MEM_LIST";
128     private static final String NAPI_ENUM_VAL_LIST = "NAPI_ENUM_VAL_LIST";
129     private static final String NAPI_ENUM_CNT = "NAPI_ENUM_CNT";
130     private static final String NAPI_ENUM_ITEM_VALUE = "NAPI_ENUM_ITEM_VALUE";
131     private static final String NAPI_ENUM_VALUE_INDEX = "i";
132     private static final String NAPI_ENUM_VALUE_ITER = "values[i]";
133     private static final String NAPI_CREATE_ENUM_DECLARE = "\n// 创建枚举对象\n" +
134             "napi_value CreateNAPI_ENUM_NAMEEnum(napi_env env) {\n" +
135             "\tnapi_value enum_obj;\n" +
136             "\tnapi_create_object(env, &enum_obj);\n" +
137             "\n" +
138             "\t// 添加枚举成员\n" +
139             "\tconst char* members[] = {NAPI_ENUM_MEM_LIST};\n" +
140             "\tconst int values[] = {NAPI_ENUM_VAL_LIST};\n" +
141             "\tfor (int32_t i = 0; i < NAPI_ENUM_CNT; ++i) {\n" +
142             "\t\tnapi_value value;\n" +
143             "\t\tnapi_create_int32(env, NAPI_ENUM_ITEM_VALUE, &value);\n" +
144             "\t\tnapi_set_named_property(env, enum_obj, members[i], value);\n" +
145             "\t}\n" +
146             "\n" +
147             "\treturn enum_obj;\n" +
148             "}\n";
149 
150     private static final String NAPI_EXPORT_ENUM = "\t// 创建并绑定枚举\n" +
151             "\tnapi_value NAPI_ENUM_NAME_enum = CreateNAPI_ENUM_NAMEEnum(env);\n" +
152             "\tnapi_set_named_property(env, exports, \"NAPI_ENUM_NAME\", NAPI_ENUM_NAME_enum);\n";
153 
154     private static final String NAPI_CLASS_NAME = "NAPI_CLASS_NAME";
155     private static final String NAPI_CLASS_METHOD_NAME = "NAPI_CLASS_METHOD_NAME";
156     private static final String NAPI_CLASS_ATTRIBUTE_NAME = "NAPI_CLASS_ATTRIBUTE_NAME";
157     private static final String NAPI_CONSTRUCTOR_EXPRESSION = "NAPI_CONSTRUCTOR_EXPRESSION";
158     private static final String NAPI_CONSTRUCTOR_DECLARE = "\n\tJSBIND_CONSTRUCTOR<NAPI_CONSTRUCTOR_PARAMS>();";
159     private static final String NAPI_CONSTRUCTOR_PARAMS = "NAPI_CONSTRUCTOR_PARAMS";
160     private static final String NAPI_METHOD_DECLARE = "\n\tJSBIND_METHOD(NAPI_METHOD_NAME, \"NAPI_METHOD_NAME\");" +
161             "\n\tJSBIND_PMETHOD(NAPI_METHOD_NAME, \"NAPI_METHOD_NAMEPromise\");";
162     private static final String NAPI_METHOD_EXPRESSION = "NAPI_METHOD_EXPRESSION";
163     private static final String NAPI_METHOD_NAME = "NAPI_METHOD_NAME";
164     private static final String NAPI_PMETHOD_DECLARE = "\n\tJSBIND_PMETHOD(NAPI_PMETHOD_NAME);";
165     private static final String NAPI_PMETHOD_EXPRESSION = "NAPI_PMETHOD_EXPRESSION";
166     private static final String NAPI_PMETHOD_NAME = "NAPI_PMETHOD_NAME";
167     private static final String NAPI_PROPERTY_DECLARE = "\n\tJSBIND_PROPERTY(NAPI_PROPERTY_NAME);";
168     private static final String NAPI_PROPERTY_EXPRESSION = "NAPI_PROPERTY_EXPRESSION";
169     private static final String NAPI_PROPERTY_NAME = "NAPI_PROPERTY_NAME";
170 
171 
172     private static final String NAPI_CLASS_CONSTRUCTURE =
173             "\nnapi_value ConstructorNAPI_CLASS_NAME(napi_env env, napi_callback_info info)\n" +
174             "{\n" +
175             "\tnapi_value undefineVar = nullptr, thisVar = nullptr;\n" +
176             "\tnapi_get_undefined(env, &undefineVar);\n" +
177             "\n" +
178             "\tif (napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr) == napi_ok &&" +
179             " thisVar != nullptr) {\n" +
180             "\t\tNAPI_CLASS_NAME *reference = new NAPI_CLASS_NAME();\n" +
181             "\t\tif (napi_wrap(env, thisVar,\n" +
182             "\t\t\treinterpret_cast<void *>(reference), DestructorNAPI_CLASS_NAME, nullptr, nullptr) == napi_ok) {\n" +
183             "\t\t\treturn thisVar;\n" +
184             "\t\t}\n" +
185             "\t\treturn thisVar;\n" +
186             "\t}\n" +
187             "\treturn undefineVar;\n" +
188             "};\n";
189     private static final String NAPI_CLASS_DESTRUCTURE =
190             "\nvoid DestructorNAPI_CLASS_NAME(napi_env env, void *nativeObject, void *finalize)\n" +
191             "{\n" +
192             "\tdelete reinterpret_cast<NAPI_CLASS_NAME *>(nativeObject);\n" +
193             "};\n";
194     private static final String NAPI_CLASS_GET_ATTRIBUTE_DECLARE =
195             "\nnapi_value GetNAPI_CLASS_ATTRIBUTE_NAMENAPI_CLASS_NAME(napi_env env, napi_callback_info info)\n" +
196             "{\n" +
197             "\tnapi_value result = nullptr;\n" +
198             "\tnapi_value jsthis;\n" +
199             "\tnapi_status status;\n" +
200             "\tnapi_get_undefined(env, &result);\n" +
201             "\tif (napi_get_cb_info(env, info, nullptr, nullptr, &jsthis, nullptr) != napi_ok) {\n" +
202             "\t\treturn result;\n" +
203             "\t}\n" +
204             "\tNAPI_CLASS_NAME *obj;\n" +
205             "\tstatus = napi_unwrap(env, jsthis, (void **)&obj);\n" +
206             "\n" +
207             "\t// 创建返回对象\n" +
208             "\tNAPI_CLASS_RETURN_VALUE_DECLARE\n" +
209             "\n" +
210             "\treturn result;\n" +
211             "};\n";
212     private static final String NAPI_CLASS_SET_ATTRIBUTE_DECLARE =
213             "\nnapi_value SetNAPI_CLASS_ATTRIBUTE_NAMENAPI_CLASS_NAME(napi_env env, napi_callback_info info)\n" +
214             "{\n" +
215             "\tnapi_value result = nullptr;\n" +
216             "\tnapi_get_undefined(env, &result);\n" +
217             "\tchar msg[128] = {0};\n" +
218             "\tnapi_value jsthis;\n" +
219             "\tnapi_value msgvalue;\n" +
220             "\tnapi_status status;\n" +
221             "\tsize_t argc = 1, size = 0;\n" +
222             "\tif (napi_get_cb_info(env, info, &argc, &msgvalue, &jsthis, nullptr) != napi_ok) {\n" +
223             "\t\treturn result;\n" +
224             "\t}\n" +
225             "\tNAPI_CLASS_NAME *obj;\n" +
226             "\tstatus = napi_unwrap(env, jsthis, (void **)&obj);\n" +
227             "\t// 获取参数\n" +
228             "\tNAPI_GET_ARGUMENTS_DECLARE\n" +
229             "\tobj->NAPI_CLASS_ATTRIBUTE_NAME = msg;\n" +
230             "\treturn nullptr;\n" +
231             "};\n";
232     private static final String NAPI_CLASS_METHOD_DECLARE =
233             "\nnapi_value NAPI_CLASS_METHOD_NAMENAPI_CLASS_NAME(napi_env env, napi_callback_info info)\n" +
234             "{\n" +
235             "\tnapi_value result = nullptr;\n" +
236             "\tnapi_value jsthis;\n" +
237             "\tnapi_status status;\n" +
238             "\tnapi_get_undefined(env, &result);\n" +
239             "\t// 获取napi对象\n" +
240             "\tif (napi_get_cb_info(env, info, nullptr, nullptr, &jsthis, nullptr) != napi_ok) {\n" +
241             "\t\treturn result;\n" +
242             "\t}\n" +
243             "\tNAPI_CLASS_NAME *obj;\n" +
244             "\tstatus = napi_unwrap(env, jsthis, (void **)&obj);\n" +
245             "\t\n" +
246             "\t// 获取参数\n" +
247             "\tNAPI_GET_ARGUMENTS_DECLARE" +
248             "\t// 调用原始类方法\n" +
249             "\tNAPI_CLASS_CALL_METHOD_DECLARE\n" +
250             "\t// 创建返回参数\n" +
251             "\tNAPI_CLASS_RETURN_VALUE_DECLARE\n" +
252             "\t}\n" +
253             "\treturn result;\n" +
254             "};\n";
255     private static final String NAPI_CLASS_METHOD_PROPERTY = "NAPI_CLASS_METHOD_PROPERTY";
256     private static final String NAPI_CLASS_ATTRIBUTE_PROPERTY = "NAPI_CLASS_ATTRIBUTE_PROPERTY";
257     private static final String NAPI_CLASS_METHOD_PROPERTY_DECLARE =
258             "\t{\"NAPI_CLASS_METHOD_NAME\", nullptr, NAPI_CLASS_METHOD_NAMENAPI_CLASS_NAME, " +
259             "nullptr, nullptr, nullptr, napi_default, nullptr},\n";
260     private static final String NAPI_CLASS_ATTRIBUTE_PROPERTY_DECLARE =
261             "\t{\"NAPI_CLASS_ATTRIBUTE_NAME\", nullptr, nullptr, GetNAPI_CLASS_ATTRIBUTE_NAMENAPI_CLASS_NAME, " +
262                     "SetNAPI_CLASS_ATTRIBUTE_NAMENAPI_CLASS_NAME, nullptr, napi_default, nullptr},\n";
263     private static final String NAPI_CLASS_PROPERTY_DECLARE =
264             "\nnapi_property_descriptor NAPI_CLASS_NAMEProps[] = {\n" +
265             "NAPI_CLASS_METHOD_PROPERTY" +
266             "NAPI_CLASS_ATTRIBUTE_PROPERTY" +
267             "};\n";
268     private static final String NAPI_CLASS_INIT = "\nnapi_value NAPI_CLASS_NAMEIns = nullptr;\n" +
269             "\tif (napi_define_class(env, \"NAPI_CLASS_NAME\", NAPI_AUTO_LENGTH, " +
270             "ConstructorNAPI_CLASS_NAME, nullptr, sizeof(NAPI_CLASS_NAMEProps) / " +
271             "sizeof(NAPI_CLASS_NAMEProps[0]), NAPI_CLASS_NAMEProps, " +
272             "&NAPI_CLASS_NAMEIns) != napi_ok) {\n" +
273             "\t\treturn nullptr;\n" +
274             "\t}\n" +
275             "\tif (napi_set_named_property(env, exports, \"NAPI_CLASS_NAME\", NAPI_CLASS_NAMEIns) != napi_ok) {\n" +
276             "\t\treturn nullptr;\n" +
277             "\t}";
278 
279     private static final String NAPI_FUNCTION_NAME = "NAPI_FUNCTION_NAME";
280     private static final String NAPI_FUNCTION_DESC_PROPERTY = "NAPI_FUNCTION_DESC_DECLARE";
281     private static final String NAPI_PARAM_NAME = "NAPI_PARAM_NAME";
282     private static final String NAPI_PARAM_TYPE = "NAPI_PARAM_TYPE";
283     private static final String NAPI_PARAM_EXPRESSION = "NAPI_PARAM_EXPRESSION";
284     private static final String NAPI_GET_ARGUMENTS_DECLARE = "NAPI_GET_ARGUMENTS_DECLARE";
285     private static final String NAPI_CLASS_CALL_METHOD_DECLARE = "NAPI_CLASS_CALL_METHOD_DECLARE";
286     private static final String NAPI_CLASS_RETURN_VALUE_DECLARE = "NAPI_CLASS_RETURN_VALUE_DECLARE";
287 
288     private static final String NAPI_FUNCTION_CALL_EXPRESSION = "NAPI_FUNCTION_NAME(NAPI_PARAM_EXPRESSION);";
289 
290     private static final String NAPI_PARAM_CNT = "NAPI_PARAM_CNT";
291     private static final String NAPI_PARAM_CHECK =
292             "size_t argc = NAPI_PARAM_CNT;" +
293             "\n\tnapi_value args[NAPI_PARAM_CNT] = {nullptr};" +
294             "\n\tnapi_value this_arg;" +
295             "\n\tnapi_get_cb_info(env, info, &argc, args, &this_arg, nullptr);" +
296             "\n\t// 参数校验" +
297             "\n\tif (argc < NAPI_PARAM_CNT) {" +
298             "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"argc < NAPI_PARAM_CNT error\");" +
299             "\n\t\tnapi_throw_error(env, \"EINVAL\", \"需要NAPI_PARAM_CNT个参数\");" +
300             "\n\t\treturn nullptr;" +
301             "\n\t};\n\n";
302 
303     private static final String NAPI_FUNCTION_DECLARE =
304             "\nnapi_value NAPI_FUNCTION_NAMENapi(napi_env env, napi_callback_info info)\n" +
305             "{\n" +
306             "\tnapi_value result = nullptr;\n" +
307             "\tnapi_value jsthis;\n" +
308             "\tnapi_status status;\n" +
309             "\tnapi_get_undefined(env, &result);\n" +
310             "\t// 获取参数\n" +
311             "\tNAPI_GET_ARGUMENTS_DECLARE" +
312             "\t// 调用原始类方法\n" +
313             "\tNAPI_CLASS_CALL_METHOD_DECLARE\n" +
314             "\t// 创建返回参数\n" +
315             "\tNAPI_CLASS_RETURN_VALUE_DECLARE\n" +
316             "\treturn result;\n" +
317             "};\n";
318 
319     private static final String NAPI_FUNCTION_DESC_DECLARE =
320             "\t{ \"NAPI_FUNCTION_NAME\", nullptr, NAPI_FUNCTION_NAMENapi, nullptr, " +
321             "nullptr, nullptr, napi_default, nullptr },\n";
322 
323     private static final String NAPI_FUNCTION_INIT = "napi_property_descriptor funcDesc[] = {\n" +
324             "NAPI_FUNCTION_DESC_DECLARE" +
325             "};\n" +
326             "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n";
327 
328     private static final String NAPI_VAL_GET_DECLARE =
329             "\nnapi_value GetNAPI_CLASS_ATTRIBUTE_NAMENAPI_CLASS_NAME(napi_env env, napi_callback_info info)\n" +
330                     "{\n" +
331                     "\tnapi_value result = nullptr;\n" +
332                     "\tnapi_value jsthis;\n" +
333                     "\tnapi_status status;\n" +
334                     "\tnapi_get_undefined(env, &result);\n" +
335                     "\tif (napi_get_cb_info(env, info, nullptr, nullptr, nullptr, nullptr) != napi_ok) {\n" +
336                     "\t\treturn result;\n" +
337                     "\t}\n" +
338                     "\n" +
339                     "\t// 创建返回对象\n" +
340                     "\tNAPI_CLASS_RETURN_VALUE_DECLARE\n" +
341                     "\n" +
342                     "\treturn result;\n" +
343                     "};\n";
344     private static final String NAPI_VAL_SET_DECLARE =
345             "\nnapi_value SetNAPI_CLASS_ATTRIBUTE_NAMENAPI_CLASS_NAME(napi_env env, napi_callback_info info)\n" +
346                     "{\n" +
347                     "\tnapi_value result = nullptr;\n" +
348                     "\tnapi_get_undefined(env, &result);\n" +
349                     "\tchar msg[128] = {0};\n" +
350                     "\tnapi_value jsthis;\n" +
351                     "\tnapi_value msgvalue;\n" +
352                     "\tnapi_status status;\n" +
353                     "\tsize_t argc = 1, size = 0;\n" +
354                     "\tif (napi_get_cb_info(env, info, &argc, &msgvalue, nullptr, nullptr) != napi_ok) {\n" +
355                     "\t\treturn result;\n" +
356                     "\t}\n" +
357                     "\t// 获取参数\n" +
358                     "\tNAPI_GET_ARGUMENTS_DECLARE\n" +
359                     "\tNAPI_CLASS_ATTRIBUTE_NAME = msg;\n" +
360                     "\treturn nullptr;\n" +
361                     "};\n";
362 
363     private static final String NAPI_ASYNC_DATA_PARAM = "NAPI_ASYNC_DATA_PARAM";
364 
365     private static final String NAPI_RET_TYPE = "NAPI_RET_TYPE";
366 
367     private static final String NAPI_CREATE_RET_TYPE = "NAPI_CREATE_RET_TYPE";
368 
369     private static final String NAPI_ASYNC_DATA = "\nstruct NAPI_FUNCTION_NAMEData {\n" +
370             "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" +
371             "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" +
372             "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" +
373             "NAPI_ASYNC_DATA_PARAM" +
374             "\tNAPI_RET_TYPE result;\t\t\t// 返回值\n" +
375             "\tnapi_status status;\t\t\t// 执行状态\n" +
376             "};\n";
377 
378     private static final String NAPI_EXECUTE_WORK = "\n// 实际执行计算的线程池任务\n" +
379             "void NAPI_FUNCTION_NAMEExecuteWork(napi_env env, void* data) {\n" +
380             "\tNAPI_FUNCTION_NAMEData* async_data = static_cast<NAPI_FUNCTION_NAMEData*>(data);\n" +
381             "\t// 调用原始类方法\n" +
382             "\tNAPI_CLASS_CALL_METHOD_DECLARE\n" +
383             "\tasync_data->result = res; // 实际计算\n" +
384             "}\n";
385 
386     private static final String NAPI_PROMISE_COMPLETE_WORK = "\n// 计算结果返回给JS事件循环\n" +
387             "void NAPI_FUNCTION_NAMECompleteWork(napi_env env, napi_status status, void* data) {\n" +
388             "\tNAPI_FUNCTION_NAMEData* async_data = static_cast<NAPI_FUNCTION_NAMEData*>(data);\n" +
389             "\n" +
390             "\t// 准备回调参数\n" +
391             "\tnapi_value argv[2] = { nullptr };\n" +
392             "\tif (async_data->status == napi_ok) {\n" +
393             "\t\tNAPI_CREATE_RET_TYPE\n" +
394             "\t\tnapi_get_null(env, &argv[0]);\n" +
395             "\t} else {\n" +
396             "\t\tnapi_value error_msg;\n" +
397             "\t\tnapi_create_string_utf8(env, \"NAPI_FUNCTION_NAME failed\", NAPI_AUTO_LENGTH, &error_msg);\n" +
398             "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" +
399             "\t\tnapi_get_null(env, &argv[0]);\n" +
400             "\t}\n" +
401             "\n" +
402             "\t// 获取JS回调函数\n" +
403             "\tif (async_data->deferred) {\n" +
404             "\t\tif (status == napi_ok) {\n" +
405             "\t\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"resolve promise\");" +
406             "\t\t\tnapi_resolve_deferred(env, async_data->deferred, argv);\n" +
407             "\t\t} else {\n" +
408             "\t\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"reject promise\");" +
409             "\t\t\tnapi_reject_deferred(env, async_data->deferred, argv);\n" +
410             "\t\t}\n" +
411             "\t}\n" +
412             "\n" +
413             "\t// 清理资源\n" +
414             "\tnapi_delete_async_work(env, async_data->work);\n" +
415             "\tnapi_delete_reference(env, async_data->callback_ref);\n" +
416             "\tdelete async_data;\n" +
417             "};\n";
418 
419     private static final String NAPI_ASYNC_COMPLETE_WORK = "\n// 计算结果返回给JS事件循环\n" +
420             "void NAPI_FUNCTION_NAMECompleteWork(napi_env env, napi_status status, void* data) {\n" +
421             "\tNAPI_FUNCTION_NAMEData* async_data = static_cast<NAPI_FUNCTION_NAMEData*>(data);\n" +
422             "\n" +
423             "\t// 准备回调参数\n" +
424             "\tnapi_value argv[2] = { nullptr };\n" +
425             "\tif (async_data->status == napi_ok) {\n" +
426             "\t\tNAPI_CREATE_RET_TYPE\n" +
427             "\t\tnapi_get_null(env, &argv[0]);\n" +
428             "\t} else {\n" +
429             "\t\tnapi_value error_msg;\n" +
430             "\t\tnapi_create_string_utf8(env, \"NAPI_FUNCTION_NAME failed\", NAPI_AUTO_LENGTH, &error_msg);\n" +
431             "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" +
432             "\t\tnapi_get_null(env, &argv[0]);\n" +
433             "\t}\n" +
434             "\n" +
435             "\t// 获取JS回调函数\n" +
436             "\tnapi_value callback;\n" +
437             "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" +
438             "\n" +
439             "\t// 调用回调\n" +
440             "\tnapi_value global;\n" +
441             "\tnapi_get_global(env, &global);\n" +
442             "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" +
443             "\n" +
444             "\t// 清理资源\n" +
445             "\tnapi_delete_async_work(env, async_data->work);\n" +
446             "\tnapi_delete_reference(env, async_data->callback_ref);\n" +
447             "\tdelete async_data;\n" +
448             "};\n";
449 
450     private String interfaceContent = "";
451     private String enumContent = "";
452     private String classContent = "";
453     private String funcContent = "";
454     private String structContent = "";
455     private String typeContent = "";
456     private String unionContent = "";
457     private String constContent = "";
458 
459     private final Map<String, String> ts2cppMap = Map.ofEntries(
460         Map.entry("any", "auto"),
461         Map.entry("boolean", "bool"),
462         Map.entry("string", "std::string"),
463         Map.entry("number", "int"),
464         Map.entry("void", "void"),
465         Map.entry("[]", "*")
466     );
467 
468     private final Map<String, String> tsTokenMap = Map.ofEntries(
469         Map.entry("\"", ""),
470         Map.entry("*", ""),
471         Map.entry("&", ""),
472         Map.entry("(", ""),
473         Map.entry(")", "")
474     );
475 
476     private final Map<String, String> getArguMap = Map.ofEntries(
477         Map.entry("bool", "\tnapi_valuetype valuetypeNAPI_PARAM_CNT;" +
478                 "\n\tif (napi_typeof(env, args[NAPI_PARAM_CNT], &valuetypeNAPI_PARAM_CNT) != napi_ok) {" +
479                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");" +
480                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");" +
481                 "\n\t\treturn result;" +
482                 "\n\t};" +
483                 "\n\tif (type != napi_boolean) {" +
484                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_boolean error\");" +
485                 "\n\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", " +
486                 "\"第valuetypeNAPI_PARAM_CNT个参数必须是布尔\");" +
487                 "\n\t\treturn result;" +
488                 "\n\t}" +
489                 "\n" +
490                 "\n\tbool valueNAPI_PARAM_CNT;\n" +
491                 "\n\tif (napi_get_value_bool(env, args[NAPI_PARAM_CNT], &valueNAPI_PARAM_CNT) != napi_ok) {" +
492                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_double error\");" +
493                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
494                 "\n\t\treturn result;" +
495                 "\n\t};\n\n"),
496         Map.entry("string", "\tnapi_valuetype valuetypeNAPI_PARAM_CNT;" +
497                 "\n\tif (napi_typeof(env, args[NAPI_PARAM_CNT], &valuetypeNAPI_PARAM_CNT) != napi_ok) {" +
498                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");" +
499                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");" +
500                 "\n\t\treturn result;" +
501                 "\n\t};" +
502                 "\n\tif (type != napi_string) {" +
503                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_string error\");" +
504                 "\n\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", " +
505                 "\"第NAPI_PARAM_CNT个参数必须是字符串\");" +
506                 "\n\t\treturn result;" +
507                 "\n\t}" +
508                 "\n" +
509                 "\n\tchar* valueNAPI_PARAM_CNT[MAX_BUFFER_SIZE];" +
510                 "\n\tsize_t bufferSize = MAX_BUFFER_SIZE;" +
511                 "\n\tsize_t realSize = 0;" +
512                 "\n\tif (napi_get_value_string_utf8(env, args[NAPI_PARAM_CNT], " +
513                 "&valueNAPI_PARAM_CNT, bufferSize, &realSize) != napi_ok) {" +
514                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
515                 "\"napi_get_value_string_utf8 error\");" +
516                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
517                 "\n\t\treturn result;" +
518                 "\n\t};\n\n"),
519         Map.entry("number", "\tnapi_valuetype valuetypeNAPI_PARAM_CNT;" +
520                 "\n\tif (napi_typeof(env, args[NAPI_PARAM_CNT], &valuetypeNAPI_PARAM_CNT) != napi_ok) {" +
521                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");" +
522                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");" +
523                 "\n\t\treturn result;" +
524                 "\n\t};" +
525                 "\n\tif (type != napi_number) {" +
526                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");" +
527                 "\n\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", " +
528                 "\"第valuetypeNAPI_PARAM_CNT个参数必须是数字\");" +
529                 "\n\t\treturn result;" +
530                 "\n\t}" +
531                 "\n" +
532                 "\n\tint valueNAPI_PARAM_CNT = 0;\n" +
533                 "\n\tsize_t bufferSize = MAX_BUFFER_SIZE;" +
534                 "\n\tsize_t realSize = 0;" +
535                 "\n\tif (napi_get_value_int32(env, args[NAPI_PARAM_CNT], " +
536                 "&valueNAPI_PARAM_CNT) != napi_ok) {" +
537                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
538                 "\"napi_get_value_int32 error\");" +
539                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
540                 "\n\t\treturn result;" +
541                 "\n\t};\n\n"),
542         Map.entry("double", "\tnapi_valuetype valuetypeNAPI_PARAM_CNT;" +
543                 "\n\tif (napi_typeof(env, args[NAPI_PARAM_CNT], &valuetypeNAPI_PARAM_CNT) != napi_ok) {" +
544                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");" +
545                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");" +
546                 "\n\t\treturn result;" +
547                 "\n\t};" +
548                 "\n\tif (type != napi_number) {" +
549                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_number error\");" +
550                 "\n\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", " +
551                 "\"第valuetypeNAPI_PARAM_CNT个参数必须是数字\");" +
552                 "\n\t\treturn result;" +
553                 "\n\t}" +
554                 "\n" +
555                 "\n\tdouble valueNAPI_PARAM_CNT = 0;\n" +
556                 "\n\tsize_t bufferSize = MAX_BUFFER_SIZE;" +
557                 "\n\tsize_t realSize = 0;" +
558                 "\n\tif (napi_get_value_double(env, args[NAPI_PARAM_CNT], " +
559                 "&valueNAPI_PARAM_CNT) != napi_ok) {" +
560                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
561                 "\"napi_get_value_double error\");" +
562                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
563                 "\n\t\treturn result;" +
564                 "\n\t};\n\n"),
565         Map.entry("object", "\tnapi_valuetype valuetypeNAPI_PARAM_CNT;" +
566                 "\n\tif (napi_typeof(env, args[NAPI_PARAM_CNT], &valuetypeNAPI_PARAM_CNT) != napi_ok) {" +
567                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_typeof error\");" +
568                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error value type\");" +
569                 "\n\t\treturn result;" +
570                 "\n\t};" +
571                 "\n\tif (type != napi_object) {" +
572                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_object error\");" +
573                 "\n\t\tapi_throw_type_error(env, \"ERR_INVALID_ARG_TYPE\", " +
574                 "\"第valuetypeNAPI_PARAM_CNT个参数必须是对象\");" +
575                 "\n\t\treturn result;" +
576                 "\n\t}" +
577                 "\n" +
578                 "\n\tobject valueNAPI_PARAM_CNT = 0;\n" +
579                 "\n\tif (napi_unwrap(env, jsthis, (void **)&valueNAPI_PARAM_CNT) != napi_ok) {" +
580                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
581                 "\"napi_unwrap error\");" +
582                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
583                 "\n\t\treturn result;" +
584                 "\n\t};\n\n")
585     );
586 
587     private final Map<String, String> setArguMap = Map.ofEntries(
588         Map.entry("void", ""),
589         Map.entry("bool",
590                 "napi_value valueRetNAPI_PARAM_CNT;" +
591                 "\n\tif (napi_create_uint32(env, args[NAPI_PARAM_CNT], &valueNAPI_PARAM_CNT) != napi_ok) {" +
592                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_value_double error\");" +
593                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
594                 "\n\t\treturn result;" +
595                 "\n\t};" +
596                 "\n\treturn valueRetNAPI_PARAM_CNT;\n"),
597         Map.entry("string",
598                 "napi_value valueRetNAPI_PARAM_CNT;" +
599                 "\n\tif (napi_create_string_utf8(env, args[NAPI_PARAM_CNT], " +
600                 "realSize, &valueRetNAPI_PARAM_CNT) != napi_ok) {" +
601                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
602                 "\"napi_create_string_utf8 error\");" +
603                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
604                 "\n\t\treturn result;" +
605                 "\n\t};" +
606                 "\n\treturn valueRetNAPI_PARAM_CNT;\n"),
607         Map.entry("number",
608                 "napi_value valueRetNAPI_PARAM_CNT;" +
609                 "\n\tif (napi_create_int32(env, args[NAPI_PARAM_CNT], " +
610                 "&valueRetNAPI_PARAM_CNT) != napi_ok) {" +
611                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
612                 "\"napi_create_int32 error\");" +
613                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
614                 "\n\t\treturn result;" +
615                 "\n\t};" +
616                 "\n\treturn valueRetNAPI_PARAM_CNT;\n"),
617         Map.entry("double",
618                 "napi_value valueRetNAPI_PARAM_CNT;" +
619                 "\n\tif (napi_create_double(env, args[NAPI_PARAM_CNT], " +
620                 "&valueRetNAPI_PARAM_CNT) != napi_ok) {" +
621                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
622                 "\"napi_create_double error\");" +
623                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error get value\");" +
624                 "\n\t\treturn result;" +
625                 "\n\t};" +
626                 "\n\treturn valueRetNAPI_PARAM_CNT;\n"),
627         Map.entry("object",
628                 "NAPI_PARAM_TYPE *reference = new NAPI_PARAM_TYPE();" +
629                 "\n\tif (napi_wrap(env, thisVar, reinterpret_cast<void *>(reference), " +
630                         "DesNAPI_PARAM_TYPENAPI_FUNCTION_NAMENAPI_PARAM_CNT, nullptr, " +
631                         "nullptr) != napi_ok) {" +
632                 "\n\t\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", " +
633                 "\"napi_wrap error\");" +
634                 "\n\t\tnapi_throw_error(env, \"EINTYPE\", \"error wrap value\");" +
635                 "\n\t\treturn result;" +
636                 "\n\t};" +
637                 "\n\treturn thisVar;\n")
638     );
639 
640     private final Map<String, String> createTypeMap = Map.ofEntries(
641             Map.entry("void", ""),
642             Map.entry("bool", "if (napi_create_uint32(env, async_data->result, &argv[1]) != napi_ok) {\n" +
643                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_uint32 error\");\n" +
644                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_uint32\");\n" +
645                     "\treturn;\n" +
646                     "};\n" +
647                     "\n" +
648                     "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" +
649                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
650                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
651                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" +
652                     "\treturn;\n" +
653                     "};"),
654             Map.entry("string", "if (napi_create_string_utf8(env, async_data->result, &argv[1]) != napi_ok) {\n" +
655                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" +
656                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_string_utf8\");\n" +
657                     "\treturn;\n" +
658                     "};\n" +
659                     "\n" +
660                     "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" +
661                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
662                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
663                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" +
664                     "\treturn;\n" +
665                     "};"),
666             Map.entry("number", "if (napi_create_int32(env, async_data->result, &argv[1]) != napi_ok) {\n" +
667                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_int32 error\");\n" +
668                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_int32\");\n" +
669                     "\treturn;\n" +
670                     "};\n" +
671                     "\n" +
672                     "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" +
673                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
674                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
675                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" +
676                     "\treturn;\n" +
677                     "};"),
678             Map.entry("double", "if (napi_create_double(env, async_data->result, &argv[1]) != napi_ok) {\n" +
679                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_double error\");\n" +
680                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_double\");\n" +
681                     "\treturn;\n" +
682                     "};\n" +
683                     "\n" +
684                     "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" +
685                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
686                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" +
687                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" +
688                     "\treturn;\n" +
689                     "};"),
690             Map.entry("object", "if (napi_create_object(env, &argv[1]) != napi_ok) {\n" +
691                     "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_object error\");\n" +
692                     "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_object\");\n" +
693                     "\treturn;\n" +
694                     "} else {\n" +
695                     "\t// 设置对象的属性\n" +
696                     "\tnapi_value name = nullptr;\n" +
697                     "\t// 设置属性名为\"name\"\n" +
698                     "\tnapi_create_string_utf8(env, \"tag\", NAPI_AUTO_LENGTH, &name);\n" +
699                     "\tnapi_value value = nullptr;\n" +
700                     "\t// 设置属性值为\"Hello from Node-API!\"\n" +
701                     "\tnapi_create_int32(env, async_data->result, &value);\n" +
702                     "\t// 将属性设置到对象上\n" +
703                     "\tnapi_set_property(env, argv[1], name, value);\n" +
704                     "}\n")
705     );
706 
707     /**
708      * 构造函数
709      */
GenNapiCppFile()710     GenNapiCppFile() {
711 
712     }
713 
714     /**
715      * 将 cpp key 转换成 ts key
716      *
717      * @param cppKey 枚举对象列表
718      * @return ts key
719      */
ts2CppKey(String cppKey)720     private String ts2CppKey(String cppKey) {
721         if (cppKey == null) {
722             return "";
723         }
724         String retKey = cppKey;
725         for (Map.Entry<String, String> entry : ts2cppMap.entrySet()) {
726             String key = entry.getKey();
727             String value = entry.getValue();
728             int ret = cppKey.indexOf(key);
729             if (ret >= 0 && value.contains(NAPI_STAR_TOKEN)) {
730                 return cppKey.substring(0, ret) + value;
731             } else if (ret >= 0) {
732                 return value;
733             }
734         }
735         return retKey;
736     }
737 
738     /**
739      * 将cpp token 替换成对应的dts token
740      *
741      * @param cppKey 语言关键字
742      * @return 替换后字符串
743      */
replaceTsToken(String cppKey)744     private String replaceTsToken(String cppKey) {
745         String retKey = cppKey;
746         for (Map.Entry<String, String> entry : tsTokenMap.entrySet()) {
747             String key = entry.getKey();
748             String value = entry.getValue();
749             int ret = retKey.indexOf(key);
750             if (ret >= 0) {
751                 retKey = retKey.replace(key, value);
752             }
753         }
754         return retKey;
755     }
756 
757     /**
758      * 获得接口内容
759      *
760      * @return 接口内容
761      */
getInterfaceContent()762     public String getInterfaceContent() {
763         return interfaceContent;
764     }
765 
766     /**
767      * 获得枚举内容
768      *
769      * @return 枚举内容
770      */
getEnumContent()771     public String getEnumContent() {
772         return enumContent;
773     }
774 
775     /**
776      * 获得类内容
777      *
778      * @return 类内容
779      */
getClassContent()780     public String getClassContent() {
781         return classContent;
782     }
783 
784     /**
785      * 获得方法内容
786      *
787      * @return 方法内容
788      */
getFuncContent()789     public String getFuncContent() {
790         return funcContent;
791     }
792 
793     /**
794      * 获得结构体内容
795      *
796      * @return 结构体内容
797      */
getStructContent()798     public String getStructContent() {
799         return structContent;
800     }
801 
802     /**
803      * 获得type内容
804      *
805      * @return type内容
806      */
getTypeContent()807     public String getTypeContent() {
808         return typeContent;
809     }
810 
811     /**
812      * 获得联合体内容
813      *
814      * @return 联合体内容
815      */
getUnionContent()816     public String getUnionContent() {
817         return unionContent;
818     }
819 
820     /**
821      * 获得常量内容
822      *
823      * @return 常量内容
824      */
getConstContent()825     public String getConstContent() {
826         return constContent;
827     }
828 
829     /**
830      * 生成输出内容
831      *
832      * @param po 解析类
833      */
834     @Override
genContent(ParseObj po)835     public void genContent(ParseObj po) {
836         genInterfaceList(po.getInterfaceList());
837         genEnumList(po.getEnumList());
838         genClassList(po.getClassList());
839         genFuncList(po.getFuncList());
840         genStructList(po.getStructList());
841         genTypeList(po.getTypeList());
842         genUnionList(po.getUnionList());
843         genVarList(po.getVarList());
844     }
845 
846     /**
847      * 生成文件
848      *
849      * @param fileName 文件名
850      * @param filePath 文件路径
851      */
852     @Override
genFile(String filePath, String fileName)853     public void genFile(String filePath, String fileName) {
854         System.out.println("genFile : " + filePath + fileName);
855         String outFileName = filePath + File.separator + NAPI_FILE_PREFIX +
856                 fileName.replace(".", "_") + NAPI_FILE_H_SUFFIX;
857         System.out.println("outFileName : " + outFileName);
858 
859         FileUtils.createFile(outFileName);
860 
861         FileUtils.appendText(outFileName, this.genFileHeader(filePath + File.separator + fileName));
862         FileUtils.appendText(outFileName, this.constContent);
863         FileUtils.appendText(outFileName, this.enumContent);
864         FileUtils.appendText(outFileName, this.typeContent);
865         FileUtils.appendText(outFileName, this.interfaceContent);
866         FileUtils.appendText(outFileName, this.unionContent);
867         FileUtils.appendText(outFileName, this.funcContent);
868         FileUtils.appendText(outFileName, this.structContent);
869         FileUtils.appendText(outFileName, this.classContent);
870 
871     }
872 
873     /**
874      * 生成输出内容
875      *
876      * @param iol 接口列表
877      */
878     @Override
genInterfaceList(List<InterfaceObject> iol)879     public void genInterfaceList(List<InterfaceObject> iol) {
880         System.out.println("genInterfaceList" + iol.toString());
881     };
882 
genCppEnumContent(EnumObj eo)883     private String genCppEnumContent(EnumObj eo) {
884         String enumName = eo.getName();
885         enumName = !enumName.isEmpty() ? enumName : eo.getAlias();
886         List<String> memList = eo.getMemberList();
887         List<String> vaList = eo.getValueList();
888         int i = 0;
889         String resContent = "";
890         resContent += NAPI_NEW_LINE + NAPI_ENUM_TOKEN +
891                 NAPI_BLANK_SPACE + enumName + NAPI_BLANK_SPACE + NAPI_LEFT_BRACE;
892         for (String memItem : memList) {
893             resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + memItem;
894             if (vaList.size() > i && !vaList.get(i).isEmpty()) {
895                 resContent += NAPI_EQUAL + replaceTsToken(vaList.get(i)) + NAPI_COMMA;
896             } else {
897                 resContent += NAPI_COMMA;
898             }
899             i++;
900         }
901 
902         resContent = StringUtils.removeLastSpace(resContent);
903         resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE + NAPI_SEMICOLON + NAPI_NEW_LINE;
904 
905         i = 0;
906         if (vaList.size() > i && !vaList.get(i).isEmpty() &&
907                 vaList.get(i).contains("\"")) {
908             resContent += NAPI_NEW_LINE + NAPI_CHAR_START_TOKEN + NAPI_BLANK_SPACE +
909                     enumName.toLowerCase(Locale.ROOT) + NAPI_UNDER_LINE + NAPI_STR_SUFFIX +
910                     NAPI_LEFT_SQUARE_BRACKET + NAPI_RIGHT_SQUARE_BRACKET + NAPI_EQUAL + NAPI_LEFT_BRACE;
911             for (String val : vaList) {
912                 resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + NAPI_LEFT_SQUARE_BRACKET +
913                         memList.get(i) + NAPI_RIGHT_SQUARE_BRACKET + NAPI_EQUAL + val + NAPI_COMMA;
914                 i++;
915             }
916             resContent = StringUtils.removeLastCharacter(resContent, 1);
917             resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE + NAPI_SEMICOLON + NAPI_NEW_LINE;
918         }
919         return resContent;
920     }
921 
genNapiEnumContent(EnumObj eo)922     private String genNapiEnumContent(EnumObj eo) {
923         String enumName = eo.getName();
924         enumName = !enumName.isEmpty() ? enumName : eo.getAlias();
925         List<String> memList = eo.getMemberList();
926         String enumNameList = "";
927         for (String memItem : memList) {
928             enumNameList += NAPI_DOUBLE_QUOTATION + memItem + NAPI_DOUBLE_QUOTATION + NAPI_COMMA + NAPI_BLANK_SPACE;
929         }
930         enumNameList = StringUtils.removeLastCharacter(enumNameList, 2);
931 
932         String enumValueList = "";
933         List<String> valueList = eo.getValueList();
934         for (String valItem : valueList) {
935             enumValueList += valItem + NAPI_COMMA + NAPI_BLANK_SPACE;
936         }
937         enumValueList = StringUtils.removeLastCharacter(enumValueList, 2);
938 
939         String enumDeclare = NAPI_CREATE_ENUM_DECLARE.replace(NAPI_ENUM_NAME, enumName);
940         enumDeclare = enumDeclare.replace(NAPI_ENUM_MEM_LIST, enumNameList);
941         enumDeclare = enumDeclare.replace(NAPI_ENUM_VAL_LIST, enumValueList);
942         enumDeclare = enumDeclare.replace(NAPI_ENUM_ITEM_VALUE, valueList.isEmpty() ?
943                 NAPI_ENUM_VALUE_INDEX : NAPI_ENUM_VALUE_ITER);
944         enumDeclare = enumDeclare.replace(NAPI_ENUM_CNT, Integer.toString(memList.size()));
945         String resContent = "";
946         resContent = enumDeclare + NAPI_EXPORT_ENUM.replace(NAPI_ENUM_NAME, enumName);
947         return resContent;
948     }
949 
950     /**
951      * 生成输出内容
952      *
953      * @param eol 枚举列表
954      */
955     @Override
genEnumList(List<EnumObj> eol)956     public void genEnumList(List<EnumObj> eol) {
957         System.out.println("genEnumList" + eol.toString());
958 
959         String resContent = "";
960         for (EnumObj eo : eol) {
961             resContent += genCppEnumContent(eo);
962             resContent += genNapiEnumContent(eo);
963         }
964 
965         this.enumContent = resContent;
966     };
967 
setClassFunc(List<FuncObj> funcList, String content)968     private String setClassFunc(List<FuncObj> funcList, String content) {
969         String tempResContent = content;
970         for (FuncObj funcItem : funcList) {
971             String retValue = funcItem.getRetValue();
972             retValue = retValue.isEmpty() ? "" : ts2CppKey(retValue) + NAPI_BLANK_SPACE;
973             tempResContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + retValue +
974                     replaceTsToken(funcItem.getName()) + NAPI_LEFT_PARENTHESES;
975             List<ParamObj> pol = funcItem.getParamList();
976             for (ParamObj poItem : pol) {
977                 String retType = ts2CppKey(poItem.getType()).isEmpty() ?
978                         NAPI_AUTO_TOKEN : ts2CppKey(poItem.getType());
979                 tempResContent += (poItem.getName() == null) ? retType + NAPI_COMMA + NAPI_BLANK_SPACE :
980                         retType + NAPI_BLANK_SPACE + replaceTsToken(poItem.getName()) + NAPI_COMMA + NAPI_BLANK_SPACE;
981             }
982             if (!pol.isEmpty()) {
983                 tempResContent = StringUtils.removeLastCharacter(tempResContent, 2);
984             }
985             tempResContent += NAPI_RIGHT_PARENTHESES + NAPI_SEMICOLON;
986         }
987         return tempResContent;
988     }
989 
genCppClassContent(ClassObj co)990     private String genCppClassContent(ClassObj co) {
991         String className = co.getName();
992         className = !className.isEmpty() ? className : co.getAlias();
993 
994         String templateStr = !co.getTempList().isEmpty() ?
995                 NAPI_TEMPLATE_TOKEN + NAPI_BLANK_SPACE + NAPI_LEFT_ANGLE_BRACKET : "";
996         for (String teStr : co.getTempList()) {
997             templateStr += NAPI_TYPE_NAME_TOKEN + NAPI_BLANK_SPACE + teStr + NAPI_COMMA + NAPI_BLANK_SPACE;
998         }
999         templateStr = templateStr.length() > 1 ?
1000                 StringUtils.removeLastCharacter(templateStr, 2) + NAPI_RIGHT_ANGLE_BRACKET + NAPI_BLANK_SPACE : "";
1001 
1002         List<String> hnList = co.getHeritageNameList();
1003         String htStr = hnList.size() > 0 ? NAPI_BLANK_SPACE + NAPI_COLON + NAPI_BLANK_SPACE : "";
1004         for (String hName : hnList) {
1005             htStr += NAPI_PUBLIC_TOKEN + NAPI_BLANK_SPACE + hName + NAPI_COMMA + NAPI_BLANK_SPACE;
1006         }
1007         htStr = htStr.length() > 1 ? StringUtils.removeLastCharacter(htStr, 2) : htStr;
1008 
1009         List<String> htempList = co.getHeritageTemplateList();
1010         String htempStr = htempList.size() > 0 ? NAPI_LEFT_ANGLE_BRACKET : "";
1011         for (String tempStr : htempList) {
1012             htempStr += tempStr + NAPI_COMMA + NAPI_BLANK_SPACE;
1013         }
1014         htempStr = htempList.size() > 0 ?
1015                 StringUtils.removeLastCharacter(htempStr, 2) + NAPI_RIGHT_ANGLE_BRACKET : "";
1016         String resContent = "";
1017         resContent += NAPI_NEW_LINE + templateStr + NAPI_CLASS_TOKEN +
1018                 NAPI_BLANK_SPACE + className + htStr + htempStr + NAPI_BLANK_SPACE + NAPI_LEFT_BRACE;
1019         List<ParamObj> paList = co.getParamList();
1020         for (ParamObj paItem : paList) {
1021             String paType = paItem.getType();
1022             String qualifyStr = paItem.getQualifier() == null || paItem.getQualifier().isEmpty() ?
1023                     "" : paItem.getQualifier() + NAPI_BLANK_SPACE;
1024             resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + qualifyStr + ts2CppKey(paType) +
1025                     NAPI_BLANK_SPACE + replaceTsToken(paItem.getName());
1026             List<String> initVList = paItem.getvList();
1027             if (!initVList.isEmpty()) {
1028                 resContent += NAPI_EQUAL + initVList.get(0) + NAPI_SEMICOLON;
1029             } else {
1030                 resContent += NAPI_SEMICOLON;
1031             }
1032         }
1033 
1034         resContent = setClassFunc(co.getFuncList(), resContent);
1035 
1036         resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE + NAPI_SEMICOLON + NAPI_NEW_LINE;
1037         return resContent;
1038     }
1039 
genNapiClassContent(ClassObj co)1040     private String genNapiClassContent(ClassObj co) {
1041         String className = co.getName();
1042         className = !className.isEmpty() ? className : co.getAlias();
1043         List<FuncObj> funcList = co.getFuncList();
1044         String classNameList = "";
1045         String classMethodContent = "";
1046         String classMethodProperty = "";
1047         for (FuncObj funcItem : funcList) {
1048             String classMethodStr = NAPI_CLASS_METHOD_DECLARE.replace(
1049                     NAPI_CLASS_NAME, className);
1050             classMethodStr = classMethodStr.replace(
1051                     NAPI_CLASS_METHOD_NAME, funcItem.getName());
1052 
1053             classMethodStr = genNapiFuncConvert(funcItem, classMethodStr);
1054             classMethodContent += classMethodStr;
1055 
1056             String classMethodPropertyStr = NAPI_CLASS_METHOD_PROPERTY_DECLARE.replace(
1057                     NAPI_CLASS_METHOD_NAME, funcItem.getName());
1058             classMethodPropertyStr = classMethodPropertyStr.replace(NAPI_CLASS_NAME, className);
1059             classMethodProperty += classMethodPropertyStr;
1060         }
1061 
1062         String classAttributeContent = "";
1063         String classAttributeProperty = "";
1064         List<ParamObj> paList = co.getParamList();
1065         for (ParamObj paItem : paList) {
1066             String getAttributeContent = NAPI_CLASS_GET_ATTRIBUTE_DECLARE.replace(
1067                     NAPI_CLASS_ATTRIBUTE_NAME, paItem.getName());
1068             getAttributeContent = getAttributeContent.replace(NAPI_CLASS_NAME, className);
1069             String setAttributeContent = NAPI_CLASS_SET_ATTRIBUTE_DECLARE.replace(
1070                     NAPI_CLASS_ATTRIBUTE_NAME, paItem.getName());
1071             setAttributeContent = setAttributeContent.replace(NAPI_CLASS_NAME, className);
1072             classAttributeContent += getAttributeContent + setAttributeContent;
1073 
1074             String classAttributeStr = NAPI_CLASS_ATTRIBUTE_PROPERTY_DECLARE.replace(
1075                     NAPI_CLASS_ATTRIBUTE_NAME, paItem.getName());
1076             classAttributeStr = classAttributeStr.replace(NAPI_CLASS_NAME, className);
1077             classAttributeProperty += classAttributeStr;
1078         }
1079 
1080 
1081         String classDeclare = NAPI_CLASS_CONSTRUCTURE.replace(NAPI_CLASS_NAME, className);
1082         classDeclare += NAPI_CLASS_DESTRUCTURE.replace(NAPI_CLASS_NAME, className);
1083         classDeclare += classMethodContent + classAttributeContent;
1084 
1085         String classPropertyStr = NAPI_CLASS_PROPERTY_DECLARE.replace(NAPI_CLASS_NAME, className);
1086         classPropertyStr = classPropertyStr.replace(NAPI_CLASS_METHOD_PROPERTY, classMethodProperty);
1087         classPropertyStr = classPropertyStr.replace(NAPI_CLASS_ATTRIBUTE_PROPERTY, classAttributeProperty);
1088         classDeclare += classPropertyStr;
1089 
1090         String classInitStr = NAPI_CLASS_INIT.replace(NAPI_CLASS_NAME, className);
1091         classDeclare += classInitStr;
1092 
1093         String resContent = "";
1094         resContent = classDeclare;
1095         return resContent;
1096     }
1097 
1098     /**
1099      * 生成输出内容
1100      *
1101      * @param col 类列表
1102      */
1103     @Override
genClassList(List<ClassObj> col)1104     public void genClassList(List<ClassObj> col) {
1105         System.out.println("genClassList" + col.toString());
1106 
1107         String resContent = "";
1108         for (ClassObj co : col) {
1109             resContent += genCppClassContent(co);
1110             resContent += genNapiClassContent(co);
1111         }
1112         this.classContent = resContent;
1113     };
1114 
genCppFunctionContent(FuncObj fo)1115     private String genCppFunctionContent(FuncObj fo) {
1116         String funcName = fo.getName();
1117         funcName = !funcName.isEmpty() ? funcName : fo.getAlias();
1118         List<String> tempList = fo.getTempList();
1119         String tempStr = tempList.isEmpty() ? "" : NAPI_TEMPLATE_TOKEN + NAPI_LEFT_ANGLE_BRACKET;
1120         for (String teStr : tempList) {
1121             tempStr += NAPI_TYPE_NAME_TOKEN + NAPI_BLANK_SPACE + teStr + NAPI_COMMA + NAPI_BLANK_SPACE;
1122         }
1123         tempStr = tempList.isEmpty() ? "" :
1124                 StringUtils.removeLastCharacter(tempStr, 2) + NAPI_RIGHT_ANGLE_BRACKET + NAPI_BLANK_SPACE;
1125         List<ParamObj> paList = fo.getParamList();
1126         String retValue = ts2CppKey(fo.getRetValue()).isEmpty() ?
1127                 "" : ts2CppKey(fo.getRetValue()) + NAPI_BLANK_SPACE;
1128         String resContent = "";
1129         resContent += NAPI_NEW_LINE + tempStr + retValue +
1130                 replaceTsToken(funcName) + NAPI_LEFT_PARENTHESES;
1131 
1132         for (ParamObj poItem : paList) {
1133             String paType = ts2CppKey(poItem.getType()).isEmpty() ?
1134                     NAPI_AUTO_TOKEN + NAPI_BLANK_SPACE : ts2CppKey(poItem.getType()) + NAPI_BLANK_SPACE;
1135             String paName = poItem.getName();
1136             String defaultVal = poItem.getStrValue(0);
1137             defaultVal = defaultVal.isEmpty() ? "" : NAPI_EQUAL + defaultVal;
1138             resContent += !paName.isEmpty() ? paType + replaceTsToken(paName) +
1139                     defaultVal + NAPI_COMMA + NAPI_BLANK_SPACE :
1140                     paType + NAPI_COMMA + NAPI_BLANK_SPACE;
1141         }
1142         if (!paList.isEmpty()) {
1143             resContent = StringUtils.removeLastCharacter(resContent, 2);
1144         }
1145         resContent += NAPI_RIGHT_PARENTHESES + NAPI_SEMICOLON;
1146         return resContent;
1147     }
1148 
genGetParam(ParamObj pa, int off)1149     private String genGetParam(ParamObj pa, int off) {
1150         System.out.println("genGetParam : " + pa.getType());
1151         if (pa.getType() == null) {
1152             return "";
1153         }
1154         String resContent = getArguMap.get(pa.getType());
1155         resContent = resContent == null ? "" : resContent;
1156         resContent = resContent.replace(NAPI_PARAM_CNT, Integer.toString(off));
1157         resContent = resContent.replace(NAPI_PARAM_TYPE, pa.getType());
1158         return resContent;
1159     };
1160 
genDataParam(ParamObj pa, int off)1161     private String genDataParam(ParamObj pa, int off) {
1162         String name = pa.getName().isEmpty() ? "value" + Integer.toString(off) : pa.getName();
1163         String type = pa.getType() == null ? NAPI_AUTO_TOKEN : pa.getType();
1164         return NAPI_TAB_SPACE + type + NAPI_BLANK_SPACE + name + NAPI_SEMICOLON + NAPI_NEW_LINE;
1165     }
1166 
genFuncCall(FuncObj fo)1167     private String genFuncCall(FuncObj fo) {
1168         System.out.println("genFuncCall : " + fo.getName());
1169         return NAPI_FUNCTION_CALL_EXPRESSION.replace(NAPI_FUNCTION_NAME, fo.getName());
1170     };
1171 
genFuncRet(String retType)1172     private String genFuncRet(String retType) {
1173         System.out.println("genFuncRet : " + retType);
1174         if (retType.isEmpty()) {
1175             return "";
1176         }
1177         String resContent = setArguMap.get(retType);
1178         if (resContent == null) {
1179             return "";
1180         }
1181         resContent = resContent.replace(NAPI_PARAM_CNT, Integer.toString(0));
1182         resContent = resContent.replace(NAPI_PARAM_TYPE, retType);
1183         return resContent;
1184     };
1185 
genNapiFunctionContent(FuncObj fo)1186     private String genNapiFunctionContent(FuncObj fo) {
1187         String funcName = fo.getName();
1188         funcName = funcName.isEmpty() ? fo.getAlias() : funcName;
1189         funcName = StringUtils.unCapitalFirst(funcName);
1190 
1191         String funcGetParamStr = "";
1192         String funcCallStr = "";
1193         String funcRetStr = "";
1194         int i = 0;
1195         for (ParamObj pa : fo.getParamList()) {
1196             funcGetParamStr += genGetParam(pa, i);
1197             i++;
1198         }
1199         funcCallStr += genFuncCall(fo);
1200         funcRetStr += genFuncRet(fo.getRetValue());
1201         String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT, Integer.toString(fo.getParamList().size()));
1202         String funcDeclareStr = NAPI_FUNCTION_DECLARE.replace(NAPI_FUNCTION_NAME, funcName);
1203         funcDeclareStr = funcDeclareStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr);
1204         funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr);
1205         funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_RETURN_VALUE_DECLARE, funcRetStr);
1206 
1207         String funcPropertyStr = NAPI_FUNCTION_DESC_DECLARE.replace(NAPI_FUNCTION_NAME,
1208                 funcName);
1209         String funcInitStr = NAPI_FUNCTION_INIT.replace(NAPI_FUNCTION_DESC_PROPERTY,
1210                 funcPropertyStr);
1211         String resContent = "";
1212         resContent += funcDeclareStr + funcInitStr;
1213         return resContent;
1214     }
1215 
genNapiAsyncFunctionContent(FuncObj fo)1216     private String genNapiAsyncFunctionContent(FuncObj fo) {
1217         String funcName = fo.getName();
1218         funcName = funcName.isEmpty() ? fo.getAlias() : funcName;
1219         funcName = StringUtils.unCapitalFirst(funcName) + NAPI_ASYNC_SUFFIX;
1220 
1221         String funcGetParamStr = "";
1222         String funcCallStr = "";
1223         String funcRetStr = "";
1224         String dataParamStr = "";
1225         String paramListStr = "";
1226         int i = 0;
1227         for (ParamObj pa : fo.getParamList()) {
1228             funcGetParamStr += genGetParam(pa, i);
1229             dataParamStr += genDataParam(pa, i);
1230             paramListStr += pa.getName() + NAPI_COMMA + NAPI_BLANK_SPACE;
1231             i++;
1232         }
1233         paramListStr = StringUtils.removeLastCharacter(paramListStr, 2);
1234         // create async function template
1235         funcCallStr += genFuncCall(fo);
1236         funcRetStr += genFuncRet(fo.getRetValue());
1237 
1238         // create async data
1239         String retType = fo.getType().isEmpty() ? NAPI_VOID_TOKEN : fo.getType();
1240         String asyncDataStr = NAPI_ASYNC_DATA.replace(NAPI_FUNCTION_NAME, funcName);
1241         asyncDataStr = asyncDataStr.replace(NAPI_ASYNC_DATA_PARAM, dataParamStr);
1242         asyncDataStr = asyncDataStr.replace(NAPI_RET_TYPE, retType);
1243 
1244         // create execute work
1245         String exeWorkStr = NAPI_EXECUTE_WORK.replace(NAPI_FUNCTION_NAME, funcName);
1246         exeWorkStr = exeWorkStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr);
1247         exeWorkStr = exeWorkStr.replace(NAPI_PARAM_EXPRESSION, paramListStr);
1248 
1249         // create complete work
1250         String completeWorkStr = NAPI_ASYNC_COMPLETE_WORK.replace(NAPI_FUNCTION_NAME, funcName);
1251         completeWorkStr = completeWorkStr.replace(NAPI_CREATE_RET_TYPE, funcRetStr);
1252 
1253         String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT, Integer.toString(fo.getParamList().size()));
1254         String funcDeclareStr = NAPI_FUNCTION_DECLARE.replace(NAPI_FUNCTION_NAME, funcName);
1255         funcDeclareStr = funcDeclareStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr);
1256         funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr);
1257         funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_RETURN_VALUE_DECLARE, funcRetStr);
1258 
1259         String funcPropertyStr = NAPI_FUNCTION_DESC_DECLARE.replace(NAPI_FUNCTION_NAME,
1260                 funcName);
1261         String funcInitStr = NAPI_FUNCTION_INIT.replace(NAPI_FUNCTION_DESC_PROPERTY,
1262                 funcPropertyStr);
1263         String resContent = "";
1264         resContent += asyncDataStr + exeWorkStr + completeWorkStr + funcDeclareStr + funcInitStr;
1265         return resContent;
1266     }
1267 
genNapiPromiseFunctionContent(FuncObj fo)1268     private String genNapiPromiseFunctionContent(FuncObj fo) {
1269         String funcName = fo.getName();
1270         funcName = funcName.isEmpty() ? fo.getAlias() : funcName;
1271         funcName = StringUtils.unCapitalFirst(funcName) + NAPI_PROMISE_SUFFIX;
1272 
1273         String funcGetParamStr = "";
1274         String funcCallStr = "";
1275         String funcRetStr = "";
1276         String dataParamStr = "";
1277         String paramListStr = "";
1278         int i = 0;
1279         for (ParamObj pa : fo.getParamList()) {
1280             funcGetParamStr += genGetParam(pa, i);
1281             dataParamStr += genDataParam(pa, i);
1282             paramListStr += pa.getName() + NAPI_COMMA + NAPI_BLANK_SPACE;
1283             i++;
1284         }
1285         paramListStr = StringUtils.removeLastCharacter(paramListStr, 2);
1286         // create async function template
1287         funcCallStr += genFuncCall(fo);
1288         funcRetStr += genFuncRet(fo.getRetValue());
1289 
1290         // create async data
1291         String retType = fo.getType().isEmpty() ? NAPI_VOID_TOKEN : fo.getType();
1292         String asyncDataStr = NAPI_ASYNC_DATA.replace(NAPI_FUNCTION_NAME, funcName);
1293         asyncDataStr = asyncDataStr.replace(NAPI_ASYNC_DATA_PARAM, dataParamStr);
1294         asyncDataStr = asyncDataStr.replace(NAPI_RET_TYPE, retType);
1295 
1296         // create execute work
1297         String exeWorkStr = NAPI_EXECUTE_WORK.replace(NAPI_FUNCTION_NAME, funcName);
1298         exeWorkStr = exeWorkStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr);
1299         exeWorkStr = exeWorkStr.replace(NAPI_PARAM_EXPRESSION, paramListStr);
1300 
1301         // create complete work
1302         String completeWorkStr = NAPI_PROMISE_COMPLETE_WORK.replace(NAPI_FUNCTION_NAME, funcName);
1303         completeWorkStr = completeWorkStr.replace(NAPI_CREATE_RET_TYPE, funcRetStr);
1304 
1305         String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT, Integer.toString(fo.getParamList().size()));
1306         String funcDeclareStr = NAPI_FUNCTION_DECLARE.replace(NAPI_FUNCTION_NAME, funcName);
1307         funcDeclareStr = funcDeclareStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr);
1308         funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr);
1309         funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_RETURN_VALUE_DECLARE, funcRetStr);
1310 
1311         String funcPropertyStr = NAPI_FUNCTION_DESC_DECLARE.replace(NAPI_FUNCTION_NAME,
1312                 funcName);
1313         String funcInitStr = NAPI_FUNCTION_INIT.replace(NAPI_FUNCTION_DESC_PROPERTY,
1314                 funcPropertyStr);
1315         String resContent = "";
1316         resContent += funcDeclareStr + funcInitStr;
1317         return resContent;
1318     }
1319 
1320     /**
1321      * 生成输出内容
1322      *
1323      * @param fol 方法列表
1324      */
1325     @Override
genFuncList(List<FuncObj> fol)1326     public void genFuncList(List<FuncObj> fol) {
1327         System.out.println("genFuncList : " + fol.toString());
1328         String resContent = "";
1329         for (FuncObj fo : fol) {
1330             resContent += genCppFunctionContent(fo);
1331             resContent += genNapiFunctionContent(fo);
1332             resContent += genNapiAsyncFunctionContent(fo);
1333             resContent += genNapiPromiseFunctionContent(fo);
1334         }
1335         this.funcContent = resContent;
1336         System.out.println("genFuncList : " + resContent);
1337     };
1338 
genCppStructContent(StructObj so)1339     private String genCppStructContent(StructObj so) {
1340         String structName = so.getName();
1341         structName = !structName.isEmpty() ? structName : so.getAlias();
1342 
1343         String templateStr = !so.getTemplateList().isEmpty() ?
1344                 NAPI_TEMPLATE_TOKEN + NAPI_BLANK_SPACE + NAPI_LEFT_ANGLE_BRACKET : "";
1345         for (String teStr : so.getTemplateList()) {
1346             templateStr += NAPI_TYPE_NAME_TOKEN + NAPI_BLANK_SPACE + teStr + NAPI_COMMA + NAPI_BLANK_SPACE;
1347         }
1348         templateStr = templateStr.length() > 1 ?
1349                 StringUtils.removeLastCharacter(templateStr, 2) +
1350                         NAPI_RIGHT_ANGLE_BRACKET + NAPI_BLANK_SPACE : "";
1351 
1352         List<ParamObj> paList = so.getMemberList();
1353         String resContent = "";
1354         resContent += NAPI_NEW_LINE + templateStr + NAPI_STRUCT_TOKEN +
1355                 NAPI_BLANK_SPACE + structName + NAPI_BLANK_SPACE + NAPI_LEFT_BRACE;
1356 
1357         for (ParamObj paItem : paList) {
1358             String paType = paItem.getType().isEmpty() ? NAPI_AUTO_TOKEN : paItem.getType();
1359             resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + ts2CppKey(paType) +
1360                     NAPI_BLANK_SPACE + paItem.getName();
1361             ;
1362             List<String> initVList = paItem.getvList();
1363             if (initVList.size() > 0) {
1364                 resContent += NAPI_EQUAL + initVList.get(0) + NAPI_SEMICOLON;
1365             } else {
1366                 resContent += NAPI_SEMICOLON;
1367             }
1368         }
1369 
1370         List<FuncObj> funcList = so.getFuncList();
1371         for (FuncObj funcItem : funcList) {
1372             String retValue = ts2CppKey(funcItem.getRetValue()).isEmpty() ? "" :
1373                     ts2CppKey(funcItem.getRetValue()) + NAPI_BLANK_SPACE;
1374             resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + retValue +
1375                     replaceTsToken(funcItem.getName()) + NAPI_LEFT_PARENTHESES;
1376             List<ParamObj> pol = funcItem.getParamList();
1377             for (ParamObj poItem : pol) {
1378                 String retType = ts2CppKey(poItem.getType()).isEmpty() ?
1379                         NAPI_AUTO_TOKEN : ts2CppKey(poItem.getType());
1380                 resContent += retType + NAPI_BLANK_SPACE + replaceTsToken(poItem.getName()) +
1381                         NAPI_COMMA + NAPI_BLANK_SPACE;
1382             }
1383             resContent = !pol.isEmpty() ? StringUtils.removeLastCharacter(resContent, 2) : resContent;
1384             resContent += NAPI_RIGHT_PARENTHESES + NAPI_SEMICOLON;
1385         }
1386 
1387         resContent = StringUtils.removeLastSpace(resContent);
1388         resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE + NAPI_SEMICOLON + NAPI_NEW_LINE;
1389         return resContent;
1390     }
1391 
genNapiFuncConvert(FuncObj funcItem, String structMethodStr)1392     private String genNapiFuncConvert(FuncObj funcItem, String structMethodStr) {
1393         String funcName = funcItem.getName();
1394         funcName = funcName.isEmpty() ? funcItem.getAlias() : funcName;
1395         funcName = StringUtils.unCapitalFirst(funcName);
1396 
1397         String funcGetParamStr = "";
1398         String funcCallStr = "";
1399         String funcRetStr = "";
1400         int i = 0;
1401         for (ParamObj pa : funcItem.getParamList()) {
1402             funcGetParamStr += genGetParam(pa, i);
1403             i++;
1404         }
1405         funcCallStr += genFuncCall(funcItem);
1406         funcRetStr += genFuncRet(funcItem.getRetValue());
1407         String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT,
1408                 Integer.toString(funcItem.getParamList().size()));
1409         String tempStr = structMethodStr;
1410         tempStr = tempStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr);
1411         tempStr = tempStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr);
1412         tempStr = tempStr.replace(NAPI_CLASS_RETURN_VALUE_DECLARE, funcRetStr);
1413         return tempStr;
1414     }
1415 
genNapiStructContent(StructObj so)1416     private String genNapiStructContent(StructObj so) {
1417         String structName = so.getName();
1418         structName = !structName.isEmpty() ? structName : so.getAlias();
1419         List<FuncObj> funcList = so.getFuncList();
1420         String structNameList = "";
1421         String structMethodContent = "";
1422         String structMethodProperty = "";
1423         for (FuncObj funcItem : funcList) {
1424             String structMethodStr = NAPI_CLASS_METHOD_DECLARE.replace(
1425                     NAPI_CLASS_NAME, structName);
1426             structMethodStr = structMethodStr.replace(
1427                     NAPI_CLASS_METHOD_NAME, funcItem.getName());
1428 
1429             structMethodStr = genNapiFuncConvert(funcItem, structMethodStr);
1430             structMethodContent += structMethodStr;
1431 
1432             String structMethodPropertyStr = NAPI_CLASS_METHOD_PROPERTY_DECLARE.replace(
1433                     NAPI_CLASS_METHOD_NAME, funcItem.getName());
1434             structMethodPropertyStr = structMethodPropertyStr.replace(NAPI_CLASS_NAME, structName);
1435             structMethodProperty += structMethodPropertyStr;
1436         }
1437 
1438         String classAttributeContent = "";
1439         String classAttributeProperty = "";
1440         List<ParamObj> paList = so.getMemberList();
1441         for (ParamObj paItem : paList) {
1442             String getAttributeContent = NAPI_CLASS_GET_ATTRIBUTE_DECLARE.replace(
1443                     NAPI_CLASS_ATTRIBUTE_NAME, paItem.getName());
1444             getAttributeContent = getAttributeContent.replace(NAPI_CLASS_NAME, structName);
1445             String setAttributeContent = NAPI_CLASS_SET_ATTRIBUTE_DECLARE.replace(
1446                     NAPI_CLASS_ATTRIBUTE_NAME, paItem.getName());
1447             setAttributeContent = setAttributeContent.replace(NAPI_CLASS_NAME, structName);
1448             classAttributeContent += getAttributeContent + setAttributeContent;
1449 
1450             String classAttributeStr = NAPI_CLASS_ATTRIBUTE_PROPERTY_DECLARE.replace(
1451                     NAPI_CLASS_ATTRIBUTE_NAME, paItem.getName());
1452             classAttributeStr = classAttributeStr.replace(NAPI_CLASS_NAME, structName);
1453             classAttributeProperty += classAttributeStr;
1454         }
1455 
1456         String classDeclare = NAPI_CLASS_CONSTRUCTURE.replace(NAPI_CLASS_NAME, structName);
1457         classDeclare += NAPI_CLASS_DESTRUCTURE.replace(NAPI_CLASS_NAME, structName);
1458         classDeclare += structMethodContent + classAttributeContent;
1459 
1460         String classPropertyStr = NAPI_CLASS_PROPERTY_DECLARE.replace(NAPI_CLASS_NAME, structName);
1461         classPropertyStr = classPropertyStr.replace(NAPI_CLASS_METHOD_PROPERTY, structMethodProperty);
1462         classPropertyStr = classPropertyStr.replace(NAPI_CLASS_ATTRIBUTE_PROPERTY, classAttributeProperty);
1463         classDeclare += classPropertyStr;
1464 
1465         String classInitStr = NAPI_CLASS_INIT.replace(NAPI_CLASS_NAME, structName);
1466         classDeclare += classInitStr;
1467 
1468         String resContent = "";
1469         resContent = classDeclare;
1470         return resContent;
1471     }
1472 
1473     /**
1474      * 生成输出内容
1475      *
1476      * @param sol 结构体列表
1477      */
1478     @Override
genStructList(List<StructObj> sol)1479     public void genStructList(List<StructObj> sol) {
1480         System.out.println("genStructList" + sol.toString());
1481 
1482         String resContent = "";
1483         for (StructObj so : sol) {
1484             resContent += genCppStructContent(so);
1485             resContent += genNapiStructContent(so);
1486         }
1487         this.structContent = resContent;
1488     };
1489 
1490     /**
1491      * 生成输出内容
1492      *
1493      * @param tol 类型列表
1494      */
1495     @Override
genTypeList(List<TypeObj> tol)1496     public void genTypeList(List<TypeObj> tol) {
1497         System.out.println("genTypeList : " + tol.toString());
1498     };
1499 
1500     /**
1501      * 生成输出内容
1502      *
1503      * @param uol 联合体列表
1504      */
1505     @Override
genUnionList(List<UnionObj> uol)1506     public void genUnionList(List<UnionObj> uol) {
1507         System.out.println("genUnionList : " + uol.toString());
1508 
1509         String resContent = "";
1510         for (UnionObj uo : uol) {
1511             String unionName = uo.getName();
1512             unionName = !unionName.isEmpty() ? unionName : uo.getAlias();
1513 
1514             String templateStr = !uo.getTemplateList().isEmpty() ?
1515                     NAPI_TEMPLATE_TOKEN + NAPI_BLANK_SPACE + NAPI_LEFT_ANGLE_BRACKET : "";
1516             for (String teStr : uo.getTemplateList()) {
1517                 templateStr += NAPI_TYPE_NAME_TOKEN + NAPI_BLANK_SPACE + teStr + NAPI_COMMA + NAPI_BLANK_SPACE;
1518             }
1519             templateStr = templateStr.length() > 1 ?
1520                     StringUtils.removeLastCharacter(templateStr, 2) +
1521                     NAPI_RIGHT_ANGLE_BRACKET + NAPI_BLANK_SPACE : "";
1522 
1523             resContent += NAPI_NEW_LINE + templateStr + NAPI_UNION_TOKEN +
1524                     NAPI_BLANK_SPACE + unionName + NAPI_LEFT_BRACE;
1525 
1526             List<ParamObj> paList = uo.getMemList();
1527             for (ParamObj paItem : paList) {
1528                 String paType = paItem.getType();
1529                 String paName = paItem.getName();
1530                 resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + ts2CppKey(paType)
1531                         + NAPI_BLANK_SPACE + paName + NAPI_SEMICOLON;
1532             }
1533             resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE;
1534             resContent += NAPI_SEMICOLON + NAPI_NEW_LINE;
1535         }
1536         this.unionContent = resContent;
1537     };
1538 
genVarArrayList(String tmpContent, String paName, List<ParamObj> paList)1539     private String genVarArrayList(String tmpContent, String paName, List<ParamObj> paList) {
1540         String resContent = tmpContent;
1541         resContent += NAPI_NEW_LINE + NAPI_STRUCT_TOKEN + NAPI_BLANK_SPACE + paName +
1542                 NAPI_STRUCT_SUFFIX + NAPI_BLANK_SPACE + NAPI_LEFT_BRACE;
1543         List<ParamObj> paramList = paList.get(0).getPaList();
1544         for (ParamObj paItem : paramList) {
1545             String paStr = paItem.getName();
1546             String paVal = paItem.getStrValue(0);
1547             String typeStr = StringUtils.isAllDigits(paVal) ?
1548                     NAPI_NUMBER_TOKEN : NAPI_STD_STRING;
1549             typeStr = StringUtils.isBoolean(paVal) ? NAPI_BOOLEAN_TOKEN : typeStr;
1550             resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + typeStr + NAPI_BLANK_SPACE + paStr + NAPI_SEMICOLON;
1551         }
1552         resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE + NAPI_SEMICOLON + NAPI_NEW_LINE;
1553 
1554         resContent += NAPI_NEW_LINE + NAPI_CONST_TOKEN + NAPI_BLANK_SPACE + NAPI_STD_VECTOR +
1555                 NAPI_LEFT_ANGLE_BRACKET + paName + NAPI_STRUCT_SUFFIX + NAPI_RIGHT_ANGLE_BRACKET +
1556                 NAPI_BLANK_SPACE + paName + NAPI_EQUAL + NAPI_LEFT_BRACE;
1557         for (ParamObj paramListItem : paList) {
1558             List<ParamObj> subParamList = paramListItem.getPaList();
1559             resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + NAPI_LEFT_BRACE;
1560             for (ParamObj paItem : subParamList) {
1561                 String paVal = paItem.getStrValue(0);
1562                 resContent += paVal + NAPI_COMMA + NAPI_BLANK_SPACE;
1563             }
1564             resContent = StringUtils.removeLastCharacter(resContent, 2);
1565             resContent += NAPI_RIGHT_BRACE + NAPI_COMMA;
1566         }
1567         resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE + NAPI_SEMICOLON + NAPI_NEW_LINE;
1568         return resContent;
1569     };
1570 
genCppValContent(ParamObj po)1571     private String genCppValContent(ParamObj po) {
1572         String paName = po.getName();
1573         String paType = ts2CppKey(po.getType()).isEmpty() ? NAPI_AUTO_TOKEN : ts2CppKey(po.getType());
1574         String paValue = po.getStrValue(0);
1575         List<ParamObj> paList = po.getPaList();
1576         String resContent = "";
1577         if (paList.isEmpty()) {
1578             resContent += NAPI_NEW_LINE + NAPI_EXTENDS_TOKEN + NAPI_BLANK_SPACE + NAPI_CONST_TOKEN +
1579                     NAPI_BLANK_SPACE + paType + NAPI_BLANK_SPACE + paName + NAPI_EQUAL + paValue;
1580 
1581             resContent += NAPI_SEMICOLON + NAPI_NEW_LINE;
1582         } else if (paList.get(0).getPaList().isEmpty()) {
1583             String valType = StringUtils.isAllDigits(paList.get(0).getStrValue(0)) ?
1584                     NAPI_NUMBER_TOKEN : NAPI_STD_STRING;
1585             resContent += NAPI_NEW_LINE + NAPI_EXTENDS_TOKEN + NAPI_BLANK_SPACE + NAPI_CONST_TOKEN +
1586                     NAPI_BLANK_SPACE + NAPI_STD_MAP + NAPI_LEFT_ANGLE_BRACKET + NAPI_STD_STRING +
1587                     NAPI_COMMA + NAPI_BLANK_SPACE + valType + NAPI_RIGHT_BRACE + NAPI_BLANK_SPACE +
1588                     paName + NAPI_EQUAL + NAPI_LEFT_BRACE;
1589             for (ParamObj paItem : paList) {
1590                 String pName = paItem.getName();
1591                 String pVal = paItem.getStrValue(0);
1592                 resContent += NAPI_NEW_LINE + NAPI_TAB_SPACE + NAPI_LEFT_BRACE + NAPI_DOUBLE_QUOTATION +
1593                         pName + NAPI_DOUBLE_QUOTATION + NAPI_COMMA + NAPI_BLANK_SPACE + pVal +
1594                         NAPI_RIGHT_BRACE + NAPI_COMMA;
1595             }
1596             resContent = StringUtils.removeLastCharacter(resContent, 1);
1597             resContent += NAPI_NEW_LINE + NAPI_RIGHT_BRACE + NAPI_SEMICOLON + NAPI_NEW_LINE;
1598         } else if (!(paList.get(0).getPaList().isEmpty())) {
1599             resContent = genVarArrayList(resContent, paName, paList);
1600         }
1601         return resContent;
1602     };
1603 
genNapiValContent(ParamObj po)1604     private String genNapiValContent(ParamObj po) {
1605         String paramAttributeContent = "";
1606         String paramAttributeProperty = "";
1607         String structName = "GNAPI";
1608         {
1609             String getAttributeContent = NAPI_VAL_GET_DECLARE.replace(
1610                     NAPI_CLASS_ATTRIBUTE_NAME, po.getName());
1611             getAttributeContent = getAttributeContent.replace(NAPI_CLASS_NAME, structName);
1612             String setAttributeContent = NAPI_VAL_SET_DECLARE.replace(
1613                     NAPI_CLASS_ATTRIBUTE_NAME, po.getName());
1614             setAttributeContent = setAttributeContent.replace(NAPI_CLASS_NAME, structName);
1615             paramAttributeContent += getAttributeContent + setAttributeContent;
1616 
1617             String classAttributeStr = NAPI_CLASS_ATTRIBUTE_PROPERTY_DECLARE.replace(
1618                     NAPI_CLASS_ATTRIBUTE_NAME, po.getName());
1619             classAttributeStr = classAttributeStr.replace(NAPI_CLASS_NAME, structName);
1620             paramAttributeProperty += classAttributeStr;
1621         }
1622 
1623         String classDeclare = "";
1624         classDeclare += paramAttributeContent;
1625 
1626         String classPropertyStr = NAPI_CLASS_PROPERTY_DECLARE.replace(NAPI_CLASS_NAME, structName);
1627         classPropertyStr = classPropertyStr.replace(NAPI_CLASS_ATTRIBUTE_PROPERTY, paramAttributeProperty);
1628         classPropertyStr = classPropertyStr.replace(NAPI_CLASS_METHOD_PROPERTY, "");
1629         classDeclare += classPropertyStr;
1630 
1631         return classDeclare;
1632     }
1633 
1634     /**
1635      * 生成输出内容
1636      *
1637      * @param pol 常量列表
1638      */
1639     @Override
genVarList(List<ParamObj> pol)1640     public void genVarList(List<ParamObj> pol) {
1641         System.out.println("genVarList : " + pol.toString());
1642 
1643         String resContent = "";
1644         for (ParamObj po : pol) {
1645             resContent += genCppValContent(po);
1646             resContent += genNapiValContent(po);
1647         }
1648         this.constContent = resContent;
1649         System.out.println("genVarList : " + resContent);
1650     }
1651 }
1652