From 59339e8624d5836666ef57ac6dd93ed98c9279f3 Mon Sep 17 00:00:00 2001 From: sunlian Date: Wed, 23 Apr 2025 16:55:55 +0800 Subject: [PATCH 1/4] add async, promise dts Signed-off-by: sunlian --- .../ohosgen/src/main/java/gen/GenDtsFile.java | 283 ++++++++++++++---- .../src/test/java/gen/GenDtsFileTest.java | 47 ++- 2 files changed, 275 insertions(+), 55 deletions(-) diff --git a/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java b/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java index cb744412..43793f02 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java +++ b/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java @@ -71,6 +71,8 @@ public class GenDtsFile extends GeneratorBase { private static final String TS_ASYNC_TOKEN = "async"; private static final String TS_AWAIT_TOKEN = "await"; private static final String TS_YIELD_TOKEN = "yield"; + private static final String TS_VOID_TOKEN = "void"; + private static final String TS_ARROW_TOKEN = "=>"; private static final String TS_NEW_LINE = "\n"; private static final String TS_TAB_SPACE = "\t"; private static final String TS_BLANK_SPACE = " "; @@ -88,7 +90,13 @@ public class GenDtsFile extends GeneratorBase { private static final String TS_LEFT_ANGLE_BRACKET = "<"; private static final String TS_RIGHT_ANGLE_BRACKET = ">"; + private static final String TS_RET_TYPE = "TS_RET_TYPE"; + private static final String TS_CB_TEMP = "cb: (err: string, res: TS_RET_TYPE) => void"; + private static final String TS_CB_VOID_TEMP = "cb: (err: string) => void"; + private static final String TS_PROMISE_TEMP = "Promise"; private static final String TS_FILE_PREFIX = "ag_"; + private static final String TS_AYNC_SUFFIX = "Async"; + private static final String TS_PROMISE_SUFFIX = "Promise"; private static final String TS_FILE_SUFFIX = ".d.ts"; private String interfaceContent = ""; @@ -137,6 +145,18 @@ public class GenDtsFile extends GeneratorBase { Map.entry(")", "") ); + /** + * const style + */ + public static int CONV_CONST_STYLE = 1; + + /** + * declare style + */ + public static int CONV_DECLARE_STYLE = 2; + + private int styleType = CONV_DECLARE_STYLE; + /** * 构造函数 */ @@ -144,6 +164,50 @@ public class GenDtsFile extends GeneratorBase { } + /** + * 设置 style type + * + * @param styleType 转换类型 + */ + public void setStyleType(int styleType) { + this.styleType = styleType; + } + + /** + * 获取 style type + * + * @return 转换类型 + */ + public int getStyleType() { + return styleType; + } + + private String genArrowStr() { + if (styleType == CONV_CONST_STYLE) { + return TS_ARROW_TOKEN; + } + + if (styleType == CONV_DECLARE_STYLE) { + return TS_COLON; + } + + return ""; + } + + private String genExportStr(String funcName, String suffix) { + if (styleType == CONV_CONST_STYLE) { + return TS_NEW_LINE + TS_EXPORT_TOKEN + TS_BLANK_SPACE + TS_CONST_TOKEN + TS_BLANK_SPACE + + replaceCppToken(funcName) + suffix + TS_COLON + TS_BLANK_SPACE + TS_LEFT_PARENTHESES; + } + + if (styleType == CONV_DECLARE_STYLE) { + return TS_NEW_LINE + TS_EXPORT_TOKEN + TS_BLANK_SPACE + TS_FUNCTION_TOKEN + + TS_BLANK_SPACE + replaceCppToken(funcName) + suffix + TS_LEFT_PARENTHESES; + } + + return ""; + } + /** * 将 cpp key 转换成 ts key * @@ -343,6 +407,86 @@ public class GenDtsFile extends GeneratorBase { this.enumContent = resContent; }; + private String genClassFuncDts(FuncObj fo) { + String resContent = ""; + String funcName = fo.getName(); + funcName = !funcName.isEmpty() ? funcName : fo.getAlias(); + List paList = fo.getParamList(); + int i = 0; + resContent += TS_NEW_LINE + TS_TAB_SPACE + replaceCppToken(funcName) + TS_LEFT_PARENTHESES; + + for (ParamObj poItem : paList) { + String paType = cpp2TsKey(poItem.getType()); + String paName = poItem.getName(); + + resContent += !paName.isEmpty() ? replaceCppToken(paName) + TS_COLON + + TS_BLANK_SPACE + paType + TS_COMMA + TS_BLANK_SPACE : + paType + TS_COMMA + TS_BLANK_SPACE; + } + if (paList.size() > 0) { + resContent = StringUtils.removeLastCharacter(resContent, 2); + } + + String retValue = fo.getRetValue(); + resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + TS_COLON + + TS_BLANK_SPACE + cpp2TsKey(retValue) + TS_SEMICOLON; + return resContent; + } + + private String genClassAsyncFuncDts(FuncObj fo) { + String resContent = ""; + String funcName = fo.getName(); + funcName = !funcName.isEmpty() ? funcName : fo.getAlias(); + List paList = fo.getParamList(); + int i = 0; + resContent += TS_NEW_LINE + TS_TAB_SPACE + replaceCppToken(funcName) + TS_AYNC_SUFFIX + TS_LEFT_PARENTHESES; + + for (ParamObj poItem : paList) { + String paType = cpp2TsKey(poItem.getType()); + String paName = poItem.getName(); + + resContent += !paName.isEmpty() ? replaceCppToken(paName) + TS_COLON + + TS_BLANK_SPACE + paType + TS_COMMA + TS_BLANK_SPACE : + paType + TS_COMMA + TS_BLANK_SPACE; + } + String retValue = fo.getRetValue(); + resContent += retValue.equals(TS_VOID_TOKEN) ? TS_CB_VOID_TEMP : + TS_CB_TEMP.replace(TS_RET_TYPE, cpp2TsKey(retValue)); + + resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + TS_COLON + + TS_BLANK_SPACE + TS_VOID_TOKEN + TS_SEMICOLON; + return resContent; + } + + private String genClassPromiseFuncDts(FuncObj fo) { + String resContent = ""; + String funcName = fo.getName(); + funcName = !funcName.isEmpty() ? funcName : fo.getAlias(); + List paList = fo.getParamList(); + int i = 0; + resContent += TS_NEW_LINE + TS_TAB_SPACE + replaceCppToken(funcName) + TS_PROMISE_SUFFIX + TS_LEFT_PARENTHESES; + + for (ParamObj poItem : paList) { + String paType = cpp2TsKey(poItem.getType()); + String paName = poItem.getName(); + + resContent += !paName.isEmpty() ? replaceCppToken(paName) + TS_COLON + + TS_BLANK_SPACE + paType + TS_COMMA + TS_BLANK_SPACE : + paType + TS_COMMA + TS_BLANK_SPACE; + } + + if (paList.size() > 0) { + resContent = StringUtils.removeLastCharacter(resContent, 2); + } + + String retValue = fo.getRetValue(); + String promiseStr = TS_PROMISE_TEMP.replace(TS_RET_TYPE, cpp2TsKey(retValue)); + + resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + TS_COLON + + TS_BLANK_SPACE + promiseStr + TS_SEMICOLON; + return resContent; + } + /** * 生成输出内容 * @@ -376,20 +520,9 @@ public class GenDtsFile extends GeneratorBase { List funcList = co.getFuncList(); for (FuncObj funcItem : funcList) { - resContent += TS_NEW_LINE + TS_TAB_SPACE + replaceCppToken(funcItem.getName()) + TS_LEFT_PARENTHESES; - List pol = funcItem.getParamList(); - for (ParamObj poItem : pol) { - String retType = cpp2TsKey(poItem.getType()); - resContent += replaceCppToken(poItem.getName()) + TS_COLON + - TS_BLANK_SPACE + retType + TS_COMMA + TS_BLANK_SPACE; - } - if (pol.size() > 0) { - resContent = StringUtils.removeLastCharacter(resContent, 2); - } - - String retValue = funcItem.getRetValue(); - resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + TS_COLON + - TS_BLANK_SPACE + cpp2TsKey(retValue) + TS_SEMICOLON; + resContent += genClassFuncDts(funcItem); + resContent += genClassAsyncFuncDts(funcItem); + resContent += genClassPromiseFuncDts(funcItem); } resContent = StringUtils.removeLastSpace(resContent); @@ -398,6 +531,86 @@ public class GenDtsFile extends GeneratorBase { this.classContent = resContent; }; + private String genFuncDts(FuncObj fo) { + String resContent = ""; + String funcName = fo.getName(); + funcName = !funcName.isEmpty() ? funcName : fo.getAlias(); + List paList = fo.getParamList(); + int i = 0; + resContent += genExportStr(funcName, ""); + + for (ParamObj poItem : paList) { + String paType = cpp2TsKey(poItem.getType()); + String paName = poItem.getName(); + + resContent += !paName.isEmpty() ? replaceCppToken(paName) + TS_COLON + + TS_BLANK_SPACE + paType + TS_COMMA + TS_BLANK_SPACE : + paType + TS_COMMA + TS_BLANK_SPACE; + } + if (paList.size() > 0) { + resContent = StringUtils.removeLastCharacter(resContent, 2); + } + + String retValue = fo.getRetValue(); + resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + genArrowStr() + + TS_BLANK_SPACE + cpp2TsKey(retValue) + TS_SEMICOLON; + return resContent; + } + + private String genAsyncFuncDts(FuncObj fo) { + String resContent = ""; + String funcName = fo.getName(); + funcName = !funcName.isEmpty() ? funcName : fo.getAlias(); + List paList = fo.getParamList(); + int i = 0; + resContent += genExportStr(funcName, TS_AYNC_SUFFIX); + + for (ParamObj poItem : paList) { + String paType = cpp2TsKey(poItem.getType()); + String paName = poItem.getName(); + + resContent += !paName.isEmpty() ? replaceCppToken(paName) + TS_COLON + + TS_BLANK_SPACE + paType + TS_COMMA + TS_BLANK_SPACE : + paType + TS_COMMA + TS_BLANK_SPACE; + } + String retValue = fo.getRetValue(); + resContent += retValue.equals(TS_VOID_TOKEN) ? TS_CB_VOID_TEMP : + TS_CB_TEMP.replace(TS_RET_TYPE, cpp2TsKey(retValue)); + + resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + genArrowStr() + + TS_BLANK_SPACE + TS_VOID_TOKEN + TS_SEMICOLON; + return resContent; + } + + private String genPromiseFuncDts(FuncObj fo) { + String resContent = ""; + String funcName = fo.getName(); + funcName = !funcName.isEmpty() ? funcName : fo.getAlias(); + List paList = fo.getParamList(); + int i = 0; + resContent += genExportStr(funcName, TS_PROMISE_SUFFIX); + + for (ParamObj poItem : paList) { + String paType = cpp2TsKey(poItem.getType()); + String paName = poItem.getName(); + + resContent += !paName.isEmpty() ? replaceCppToken(paName) + TS_COLON + + TS_BLANK_SPACE + paType + TS_COMMA + TS_BLANK_SPACE : + paType + TS_COMMA + TS_BLANK_SPACE; + } + + if (paList.size() > 0) { + resContent = StringUtils.removeLastCharacter(resContent, 2); + } + + String retValue = fo.getRetValue(); + String promiseStr = TS_PROMISE_TEMP.replace(TS_RET_TYPE, cpp2TsKey(retValue)); + + resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + genArrowStr() + + TS_BLANK_SPACE + promiseStr + TS_SEMICOLON; + return resContent; + } + /** * 生成输出内容 * @@ -408,28 +621,9 @@ public class GenDtsFile extends GeneratorBase { System.out.println("genFuncList : " + fol.toString()); String resContent = ""; for (FuncObj fo : fol) { - String funcName = fo.getName(); - funcName = !funcName.isEmpty() ? funcName : fo.getAlias(); - List paList = fo.getParamList(); - int i = 0; - resContent += TS_NEW_LINE + TS_EXPORT_TOKEN + TS_BLANK_SPACE + TS_FUNCTION_TOKEN + - TS_BLANK_SPACE + replaceCppToken(funcName) + TS_LEFT_PARENTHESES; - - for (ParamObj poItem : paList) { - String paType = cpp2TsKey(poItem.getType()); - String paName = poItem.getName(); - - resContent += !paName.isEmpty() ? replaceCppToken(paName) + TS_COLON + - TS_BLANK_SPACE + paType + TS_COMMA + TS_BLANK_SPACE : - paType + TS_COMMA + TS_BLANK_SPACE; - } - if (paList.size() > 0) { - resContent = StringUtils.removeLastCharacter(resContent, 2); - } - - String retValue = fo.getRetValue(); - resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + TS_COLON + - TS_BLANK_SPACE + cpp2TsKey(retValue) + TS_SEMICOLON; + resContent += genFuncDts(fo); + resContent += genAsyncFuncDts(fo); + resContent += genPromiseFuncDts(fo); } this.funcContent = resContent; System.out.println("genFuncList : " + resContent); @@ -468,20 +662,9 @@ public class GenDtsFile extends GeneratorBase { List funcList = so.getFuncList(); for (FuncObj funcItem : funcList) { - resContent += TS_NEW_LINE + TS_TAB_SPACE + replaceCppToken(funcItem.getName()) + TS_LEFT_PARENTHESES; - List pol = funcItem.getParamList(); - for (ParamObj poItem : pol) { - String retType = cpp2TsKey(poItem.getType()); - resContent += replaceCppToken(poItem.getName()) + TS_COLON + - TS_BLANK_SPACE + retType + TS_COMMA + TS_BLANK_SPACE; - } - if (!pol.isEmpty()) { - resContent = StringUtils.removeLastCharacter(resContent, 2); - } - - String retValue = funcItem.getRetValue(); - resContent += TS_RIGHT_PARENTHESES + TS_BLANK_SPACE + TS_COLON + - TS_BLANK_SPACE + cpp2TsKey(retValue) + TS_SEMICOLON; + resContent += genClassFuncDts(funcItem); + resContent += genClassAsyncFuncDts(funcItem); + resContent += genClassPromiseFuncDts(funcItem); } resContent = StringUtils.removeLastSpace(resContent); diff --git a/src/intellij_plugin/ohosgen/src/test/java/gen/GenDtsFileTest.java b/src/intellij_plugin/ohosgen/src/test/java/gen/GenDtsFileTest.java index 64bb2517..795603d9 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/gen/GenDtsFileTest.java +++ b/src/intellij_plugin/ohosgen/src/test/java/gen/GenDtsFileTest.java @@ -199,10 +199,12 @@ class GenDtsFileTest { String classContent = gdf.getClassContent(); System.out.println("genClass: " + classContent); String expect = "\nexport class TestClass {\n" + - "\tname: string;\n" + - "\tage: number;\n" + - "\tadd(a: number, b: number) : number;\n" + - "};\n"; + "\tname: string;\n" + + "\tage: number;\n" + + "\tadd(a: number, b: number) : number;\n" + + "\taddAsync(a: number, b: number, cb: (err: string, res: number) => void) : void;\n" + + "\taddPromise(a: number, b: number) : Promise;\n" + + "};\n"; assertEquals(expect, classContent); } } @@ -225,11 +227,44 @@ class GenDtsFileTest { if (gb instanceof GenDtsFile gdf) { String funcContent = gdf.getFuncContent(); System.out.println("genFunc: " + funcContent); - String expect = "\nexport function TestFunc(name: string, age: number) : void;"; + String expect = "\nexport function TestFunc(name: string, age: number) : void;\n" + + "export function TestFuncAsync(name: string, age: number, cb: (err: string) => void) : void;\n" + + "export function TestFuncPromise(name: string, age: number) : Promise;"; assertEquals(expect, funcContent); } } + @Test + void genFuncList2() { + FuncObj fo = new FuncObj(); + fo.setName("TestFunc"); + + fo.addParam("name", "char*"); + fo.addParam("age", "int"); + + List fol = new CopyOnWriteArrayList<>(); + fol.add(fo); + ParseObj po = new ParseObj(); + po.setFuncList(fol); + GeneratorBase gb = GenerateFactory.getGenerator("DTS"); + + if (gb instanceof GenDtsFile gdts) { + gdts.setStyleType(GenDtsFile.CONV_CONST_STYLE); + } + + gb.genFuncList(po.getFuncList()); + + if (gb instanceof GenDtsFile gdf) { + String funcContent = gdf.getFuncContent(); + System.out.println("genFunc: " + funcContent); + String expect = "\nexport const TestFunc: (name: string, age: number) => void;\n" + + "export const TestFuncAsync: (name: string, age: number, cb: (err: string) => void) => void;\n" + + "export const TestFuncPromise: (name: string, age: number) => Promise;"; + assertEquals(expect, funcContent); + } + } + + @Test void genStructList() { StructObj so = new StructObj(); @@ -265,6 +300,8 @@ class GenDtsFileTest { "\tname: string;\n" + "\tage: number;\n" + "\tadd(a: number, b: number) : number;\n" + + "\taddAsync(a: number, b: number, cb: (err: string, res: number) => void) : void;\n" + + "\taddPromise(a: number, b: number) : Promise;\n" + "};\n"; assertEquals(expect, structContent); } -- Gitee From 44deef4c87b56e465d5b00b232f12fe85b3e9eb0 Mon Sep 17 00:00:00 2001 From: sunlian Date: Wed, 23 Apr 2025 16:57:02 +0800 Subject: [PATCH 2/4] add async, promise cpp Signed-off-by: sunlian --- .../src/main/java/gen/GenNapiCppFile.java | 187 +++++++++++++++++- .../src/test/java/gen/GenAkiCppFileTest.java | 16 +- 2 files changed, 198 insertions(+), 5 deletions(-) diff --git a/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java b/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java index c13e9ac2..4936f2ee 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java +++ b/src/intellij_plugin/ohosgen/src/main/java/gen/GenNapiCppFile.java @@ -114,6 +114,8 @@ public class GenNapiCppFile extends GeneratorBase { private static final String NAPI_STD_MULTIMAP = "std::multimap"; private static final String NAPI_STD_MULTISET = "std::multiset"; + private static final String NAPI_ASYNC_SUFFIX = "Async"; + private static final String NAPI_PROMISE_SUFFIX = "Promise"; private static final String NAPI_STR_SUFFIX = "STR"; private static final String NAPI_FILE_PREFIX = "ag_"; private static final String NAPI_FILE_H_SUFFIX = ".h"; @@ -320,7 +322,7 @@ public class GenNapiCppFile extends GeneratorBase { private static final String NAPI_FUNCTION_INIT = "napi_property_descriptor funcDesc[] = {\n" + "NAPI_FUNCTION_DESC_DECLARE" + "};\n" + - "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);"; + "napi_define_properties(env, exports, sizeof(funcDesc) / sizeof(funcDesc[0]), funcDesc);\n"; private static final String NAPI_VAL_GET_DECLARE = "\nnapi_value GetNAPI_CLASS_ATTRIBUTE_NAMENAPI_CLASS_NAME(napi_env env, napi_callback_info info)\n" + @@ -357,6 +359,60 @@ public class GenNapiCppFile extends GeneratorBase { "\treturn nullptr;\n" + "};\n"; + private static final String NAPI_ASYNC_DATA_PARAM = "NAPI_ASYNC_DATA_PARAM"; + + private static final String NAPI_RET_TYPE = "NAPI_RET_TYPE"; + + private static final String NAPI_CREATE_RET_TYPE = "NAPI_CREATE_RET_TYPE"; + + private static final String NAPI_ASYNC_DATA = "\nstruct NAPI_FUNCTION_NAMEAsyncData {\n" + + "\tnapi_async_work work;\t\t\t// 异步工作句柄\n" + + "\tnapi_deferred deferred;\t\t\t// Promise句柄(如果使用Promise)\n" + + "\tnapi_ref callback_ref;\t\t\t// JS回调引用\n" + + "\tNAPI_ASYNC_DATA_PARAM\n" + + "\tNAPI_RET_TYPE result;\t\t\t// 返回值\n" + + "\tnapi_status status;\t\t\t// 执行状态\n" + + "};\n"; + + private static final String NAPI_EXECUTE_WORK = "\n// 实际执行计算的线程池任务\n" + + "void NAPI_FUNCTION_NAMEExecuteWork(napi_env env, void* data) {\n" + + "\tNAPI_FUNCTION_NAMEAsyncData* async_data = static_cast(data);\n" + + "\t// 调用原始类方法\n" + + "\tNAPI_CLASS_CALL_METHOD_DECLARE\n" + + "\tasync_data->result = res; // 实际计算\n" + + "}\n"; + + private static final String NAPI_COMPLETE_WORK = "\n// 计算结果返回给JS事件循环\n" + + "void NAPI_FUNCTION_NAMECompleteWork(napi_env env, napi_status status, void* data) {\n" + + "\tNAPI_FUNCTION_NAMEAsyncData* async_data = static_cast(data);\n" + + "\n" + + "\t// 准备回调参数\n" + + "\tnapi_value argv[2] = { nullptr };\n" + + "\tif (async_data->status == napi_ok) {\n" + + "\t\tNAPI_CREATE_RET_TYPE\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t} else {\n" + + "\t\tnapi_value error_msg;\n" + + "\t\tnapi_create_string_utf8(env, \"NAPI_FUNCTION_NAME failed\", NAPI_AUTO_LENGTH, &error_msg);\n" + + "\t\tnapi_create_error(env, NULL, error_msg, &argv[1]);\n" + + "\t\tnapi_get_null(env, &argv[0]);\n" + + "\t}\n" + + "\n" + + "\t// 获取JS回调函数\n" + + "\tnapi_value callback;\n" + + "\tnapi_get_reference_value(env, async_data->callback_ref, &callback);\n" + + "\n" + + "\t// 调用回调\n" + + "\tnapi_value global;\n" + + "\tnapi_get_global(env, &global);\n" + + "\tnapi_call_function(env, global, callback, 2, argv, nullptr);\n" + + "\n" + + "\t// 清理资源\n" + + "\tnapi_delete_async_work(env, async_data->work);\n" + + "\tnapi_delete_reference(env, async_data->callback_ref);\n" + + "\tdelete async_data;\n" + + "};\n"; + private String interfaceContent = ""; private String enumContent = ""; private String classContent = ""; @@ -547,6 +603,73 @@ public class GenNapiCppFile extends GeneratorBase { "\n\treturn thisVar;\n") ); + private final Map createTypeMap = Map.ofEntries( + Map.entry("void", ""), + Map.entry("bool", "if (napi_create_uint32(env, async_data->result, &argv[1]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_uint32 error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_uint32\");\n" + + "\treturn;\n" + + "};\n" + + "\n" + + "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" + + "\treturn;\n" + + "};"), + Map.entry("string", "if (napi_create_string_utf8(env, async_data->result, &argv[1]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_string_utf8 error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_string_utf8\");\n" + + "\treturn;\n" + + "};\n" + + "\n" + + "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" + + "\treturn;\n" + + "};"), + Map.entry("number", "if (napi_create_int32(env, async_data->result, &argv[1]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_int32 error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_int32\");\n" + + "\treturn;\n" + + "};\n" + + "\n" + + "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" + + "\treturn;\n" + + "};"), + Map.entry("double", "if (napi_create_double(env, async_data->result, &argv[1]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_double error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_double\");\n" + + "\treturn;\n" + + "};\n" + + "\n" + + "if (napi_get_null(env, &argv[0]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_get_null error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_get_null\");\n" + + "\treturn;\n" + + "};"), + Map.entry("object", "if (napi_create_object(env, &argv[1]) != napi_ok) {\n" + + "\tOH_LOG_Print(LOG_APP, LOG_INFO, GLOBAL_RESMGR, \"Log\", \"napi_create_object error\");\n" + + "\tnapi_throw_error(env, \"EINTYPE\", \"error napi_create_object\");\n" + + "\treturn;\n" + + "} else {\n" + + "\t// 设置对象的属性\n" + + "\tnapi_value name = nullptr;\n" + + "\t// 设置属性名为\"name\"\n" + + "\tnapi_create_string_utf8(env, \"tag\", NAPI_AUTO_LENGTH, &name);\n" + + "\tnapi_value value = nullptr;\n" + + "\t// 设置属性值为\"Hello from Node-API!\"\n" + + "\tnapi_create_int32(env, async_data->result, &value);\n" + + "\t// 将属性设置到对象上\n" + + "\tnapi_set_property(env, argv[1], name, value);\n" + + "}\n") + ); + /** * 构造函数 */ @@ -1050,6 +1173,66 @@ public class GenNapiCppFile extends GeneratorBase { return resContent; } + private String genNapiAsyncFunctionContent(FuncObj fo) { + String funcName = fo.getName(); + funcName = funcName.isEmpty() ? fo.getAlias() : funcName; + funcName = StringUtils.unCapitalFirst(funcName) + NAPI_ASYNC_SUFFIX; + + String funcGetParamStr = ""; + String funcCallStr = ""; + String funcRetStr = ""; + int i = 0; + for (ParamObj pa : fo.getParamList()) { + funcGetParamStr += genGetParam(pa, i); + i++; + } + funcCallStr += genFuncCall(fo); + funcRetStr += genFuncRet(fo.getRetValue()); + String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT, Integer.toString(fo.getParamList().size())); + String funcDeclareStr = NAPI_FUNCTION_DECLARE.replace(NAPI_FUNCTION_NAME, funcName); + funcDeclareStr = funcDeclareStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr); + funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr); + funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_RETURN_VALUE_DECLARE, funcRetStr); + + String funcPropertyStr = NAPI_FUNCTION_DESC_DECLARE.replace(NAPI_FUNCTION_NAME, + funcName); + String funcInitStr = NAPI_FUNCTION_INIT.replace(NAPI_FUNCTION_DESC_PROPERTY, + funcPropertyStr); + String resContent = ""; + resContent += funcDeclareStr + funcInitStr; + return resContent; + } + + private String genNapiPromiseFunctionContent(FuncObj fo) { + String funcName = fo.getName(); + funcName = funcName.isEmpty() ? fo.getAlias() : funcName; + funcName = StringUtils.unCapitalFirst(funcName) + NAPI_PROMISE_SUFFIX; + + String funcGetParamStr = ""; + String funcCallStr = ""; + String funcRetStr = ""; + int i = 0; + for (ParamObj pa : fo.getParamList()) { + funcGetParamStr += genGetParam(pa, i); + i++; + } + funcCallStr += genFuncCall(fo); + funcRetStr += genFuncRet(fo.getRetValue()); + String paCheckStr = NAPI_PARAM_CHECK.replace(NAPI_PARAM_CNT, Integer.toString(fo.getParamList().size())); + String funcDeclareStr = NAPI_FUNCTION_DECLARE.replace(NAPI_FUNCTION_NAME, funcName); + funcDeclareStr = funcDeclareStr.replace(NAPI_GET_ARGUMENTS_DECLARE, paCheckStr + funcGetParamStr); + funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_CALL_METHOD_DECLARE, funcCallStr); + funcDeclareStr = funcDeclareStr.replace(NAPI_CLASS_RETURN_VALUE_DECLARE, funcRetStr); + + String funcPropertyStr = NAPI_FUNCTION_DESC_DECLARE.replace(NAPI_FUNCTION_NAME, + funcName); + String funcInitStr = NAPI_FUNCTION_INIT.replace(NAPI_FUNCTION_DESC_PROPERTY, + funcPropertyStr); + String resContent = ""; + resContent += funcDeclareStr + funcInitStr; + return resContent; + } + /** * 生成输出内容 * @@ -1062,6 +1245,8 @@ public class GenNapiCppFile extends GeneratorBase { for (FuncObj fo : fol) { resContent += genCppFunctionContent(fo); resContent += genNapiFunctionContent(fo); + resContent += genNapiAsyncFunctionContent(fo); + resContent += genNapiPromiseFunctionContent(fo); } this.funcContent = resContent; System.out.println("genFuncList : " + resContent); diff --git a/src/intellij_plugin/ohosgen/src/test/java/gen/GenAkiCppFileTest.java b/src/intellij_plugin/ohosgen/src/test/java/gen/GenAkiCppFileTest.java index 5c66433a..53d645bf 100644 --- a/src/intellij_plugin/ohosgen/src/test/java/gen/GenAkiCppFileTest.java +++ b/src/intellij_plugin/ohosgen/src/test/java/gen/GenAkiCppFileTest.java @@ -1578,10 +1578,18 @@ class GenAkiCppFileTest { String structContent = gdf.getStructContent(); System.out.println("genStruct: " + structContent); String expect = "\nstruct TestStruct {\n" + - "\tchar* name;\n" + - "\tint age;\n" + - "\tint add(int a, int b);\n" + - "};\n"; + "\tchar* name;\n" + + "\tint age;\n" + + "\tint add(int a, int b);\n" + + "};\n" + + "\n" + + "JSBIND_CLASS(TestStruct)\n" + + "{\n" + + "\tJSBIND_METHOD(add, \"add\");\n" + + "\tJSBIND_PMETHOD(add, \"addPromise\");\n" + + "\tJSBIND_PROPERTY(name);\n" + + "\tJSBIND_PROPERTY(age);\n" + + "};\n"; assertEquals(expect, structContent); } } -- Gitee From 8bc066397f2d9172a2bdb433c9903d005066ee20 Mon Sep 17 00:00:00 2001 From: sunlian Date: Wed, 23 Apr 2025 17:41:31 +0800 Subject: [PATCH 3/4] fix code check Signed-off-by: sunlian --- .../ohosgen/src/main/java/gen/GenDtsFile.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java b/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java index 43793f02..ea40edb4 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java +++ b/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java @@ -138,7 +138,7 @@ public class GenDtsFile extends GeneratorBase { Map.entry("export", "") ); - private final Map cppTokenMap = Map.ofEntries( + private final MapcppTokenMap = Map.ofEntries( Map.entry("*", ""), Map.entry("&", ""), Map.entry("(", ""), @@ -148,12 +148,12 @@ public class GenDtsFile extends GeneratorBase { /** * const style */ - public static int CONV_CONST_STYLE = 1; + public final static int CONV_CONST_STYLE = 1; /** * declare style */ - public static int CONV_DECLARE_STYLE = 2; + public final static int CONV_DECLARE_STYLE = 2; private int styleType = CONV_DECLARE_STYLE; -- Gitee From bb75bac45e90d411e17bad7b1b916678ed5229b9 Mon Sep 17 00:00:00 2001 From: sunlian Date: Thu, 24 Apr 2025 09:18:36 +0800 Subject: [PATCH 4/4] fix code check Signed-off-by: sunlian --- .../ohosgen/src/main/java/gen/GenDtsFile.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java b/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java index ea40edb4..141d3335 100644 --- a/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java +++ b/src/intellij_plugin/ohosgen/src/main/java/gen/GenDtsFile.java @@ -33,6 +33,16 @@ import java.util.Map; * @version 1.0 */ public class GenDtsFile extends GeneratorBase { + /** + * const style + */ + public static final int CONV_CONST_STYLE = 1; + + /** + * declare style + */ + public static final int CONV_DECLARE_STYLE = 2; + private static final String TS_ENUM_TOKEN = "enum"; private static final String TS_CLASS_TOKEN = "class"; private static final String TS_EXPORT_TOKEN = "export"; @@ -145,16 +155,6 @@ public class GenDtsFile extends GeneratorBase { Map.entry(")", "") ); - /** - * const style - */ - public final static int CONV_CONST_STYLE = 1; - - /** - * declare style - */ - public final static int CONV_DECLARE_STYLE = 2; - private int styleType = CONV_DECLARE_STYLE; /** -- Gitee