From 4a50f32cb38945d969586b85c88b16d4add5ca97 Mon Sep 17 00:00:00 2001 From: gou-jingjing Date: Fri, 12 Jul 2024 20:35:04 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=84=E4=B8=AA?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=E4=BD=BF=E7=94=A8=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gou-jingjing --- README.md | 151 ++-------- src/cli/cmake2gn/cmake2gn_README_ZH.md | 282 ++---------------- .../docs/figures/dts2cpp_outResult.png | Bin 0 -> 20626 bytes src/cli/dts2cpp/dts2cpp_README.md | 133 --------- src/cli/dts2cpp/dts2cpp_README_ZH.md | 68 +++++ src/cli/h2dts/h2dts_README_ZH.md | 140 +++------ src/cli/h2dtscpp/h2dtscpp_README.md | 63 ++++ src/cli/h2sa/docs/figures/h2sa_outRes.png | Bin 0 -> 13447 bytes src/cli/h2sa/h2sa_README_ZH.md | 86 ++---- src/tool/api/scan_README_ZH.md | 68 +---- 10 files changed, 267 insertions(+), 724 deletions(-) create mode 100644 src/cli/dts2cpp/docs/figures/dts2cpp_outResult.png delete mode 100644 src/cli/dts2cpp/dts2cpp_README.md create mode 100644 src/cli/dts2cpp/dts2cpp_README_ZH.md create mode 100644 src/cli/h2dtscpp/h2dtscpp_README.md create mode 100644 src/cli/h2sa/docs/figures/h2sa_outRes.png diff --git a/README.md b/README.md index 72688fc5..04d479ff 100644 --- a/README.md +++ b/README.md @@ -1,118 +1,33 @@ -# Readme - -## 简介 - -napi_generator仓包含以下工具:NAPI框架代码生成工具(dts2cpp)可以根据用户指定路径下的ts(typescript)接口文件一键生成NAPI框架代码、业务代码框架、GN文件等。TS接口生成工具(h2dts)可以根据定义在c++头文件中的接口,生成type-script语言的ts接口文件。GN脚本生成工具(cmake2gn),它可以根据三方库的CMakeLists.txt文件,编译转换生成BUILD.gn脚本文件。SERVICE框架生成工具(h2sa),它可以根据一个定义远程方法的.h头文件,生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。NATIVE生成工具(h2dtscpp),它可以根据定义在c++头文件中的接口,生成type-script语言的ts接口文件、NAPI框架代码、和自动化测试用例代码。dts2ets工具,它可以根据用户指定路径下的ts(typescript)接口文件生成ets页面代码。API扫描工具,它可以扫描三方库中包含OpenHarmony源码不包含的接口,并输出result.xlsx文档。 - -## 目录 - -``` -├── napi_generator # 工具集 -│ ├── docs # 工具索引文档 -│ │ ├── readme.md # 所有工具 readme 索引 -│ │ ├── develop.md # 工具设计文档索引 -│ │ ├── usage.md # 工具使用文档索引 -│ │ ├── log -│ │ │ ├── meeting.md # 会议纪要 -│ │ │ ├── release-notes.md # 工具版本说明和规划索引 -│ ├── src # 工具源码 -│ │ ├── cli # 脚手架源码 -│ │ | ├── cmake2gn # gn脚本生成工具 -│ │ | | ├── docs -│ │ | | | ├── figures # 文档图片资源 -│ │ | | | ├── guide # 开发文档 -│ │ | | | ├── usage # 使用文档 -│ │ | | | ├── release-notes # 版本说明文档 -│ │ | | ├── src # 源码 -│ │ | | ├── README_ZH.md -│ │ | |── dts2cpp # napi框架生成工具 -│ │ | | ├── docs -│ │ | | | ├── figures # 文档图片资源 -│ │ | | | ├── guide # 开发文档 -│ │ | | | ├── usage # 使用文档 -│ │ | | | ├── release-notes # 版本说明文档 -│ │ | | | ├── requirement # roadmap.md -│ │ | | ├── src # 源码 -│ │ | | ├── README_ZH.md -│ │ | |── dts2ets # ets页面生成工具 -│ │ | | ├── appCodeGen # 源码 -│ │ | |── h2dts # ts生成工具 -│ │ | | ├── docs -│ │ | | | ├── figures # 文档图片资源 -│ │ | | | ├── guide # 开发文档 -│ │ | | | ├── usage # 使用文档 -│ │ | | | ├── release-notes # 版本说明文档 -│ │ | | | ├── requirement # roadmap.md -│ │ | | ├── src # 源码 -│ │ | | ├── examples # 工具输入示例.h文件 -│ │ | | ├── README_ZH.md -│ │ | |── h2dtscpp # native生成工具 -│ │ | | ├── docs -│ │ | | | ├── figures # 文档图片资源 -│ │ | | | ├── guide # 开发文档 -│ │ | | | ├── usage # 使用文档 -│ │ | | ├── src # 源码 -│ │ | | ├── README_ZH.md -│ │ | |── h2sa # service生成工具 -│ │ | | ├── docs -│ │ | | | ├── figures # 文档图片资源 -│ │ | | | ├── guide # 开发文档 -│ │ | | | ├── usage # 使用文档 -│ │ | | | ├── release-notes # 版本说明文档 -│ │ | | | ├── requirement # roadmap.md -│ │ | | ├── src # 源码 -│ │ | | ├── examples # 工具输入示例.h文件 -│ │ | | ├── README_ZH.md -│ │ ├── intellij_plugin -│ │ | ├── cmake2gn # gn脚本生成工具 -│ │ | | | ├── gn_IntelliJ_plugin # IntelliJ插件 -│ │ | |── dts2cpp # napi框架生成工具 -│ │ | | | ├── napi_IntelliJ_plugin # IntelliJ插件 -│ │ | |── h2dts # ts生成工具 -│ │ | | | ├── ts_IntelliJ_plugin # IntelliJ插件 -│ │ | |── h2dtscpp # native生成工具 -│ │ | | | ├── native_IntelliJ_plugin # IntelliJ插件 -│ │ | |── h2sa # service生成工具 -│ │ | | | ├── service_IntelliJ_plugin # IntelliJ插件 -│ │ | |── assist # 统一入口插件 -│ │ | | | ├── assist_tools_IntelliJ_plugin # IntelliJ插件 -│ │ ├── vscode_plugin -│ │ | ├── cmake2gn # gn脚本生成工具 -│ │ | | | ├── gn_vs_plugin # vs插件 -│ │ | |── dts2cpp # napi框架生成工具 -│ │ | | | ├── napi_vs_plugin # vs插件 -│ │ | |── h2dts # ts生成工具 -│ │ | | | ├── ts_vs_plugin # vs插件 -│ │ | |── h2sa # service生成工具 -│ │ | | | ├── service_vs_plugin # vs插件 -│ │ | |── assist # 统一入口插件 -│ │ | | | ├── assist_tools_vs_plugin # vs插件 -│ │ ├── tool -│ │ | |── api # api扫描工具 -│ │ | | ├── api_scan_IntelliJ_plugin # api扫描工具IntelliJ插件 -│ │ | | ├── api_scan_vs_plugin # api扫描工具vs插件 -│ │ | | ├── docs # 文档 -│ │ | | ├── figures # 文档图片资源 -│ │ | | ├── src # api扫描工具源码 -│ │ | | ├── FAQ.md -│ │ | | ├── README_ZH.md -│ ├── test -│ │ ├── dts2cpp # dts2cpp工具使用example -│ │ | |── ts -│ │ | |── README.md -│ │ ├── storytest # dts2cpp工具st -│ │ ├── unittest # dts2cpp工具ut -│ │ ├── debug_entry.js -│ │ ├── README_zh.md -│ ├── sample # 样例 -│ │ ├── napitutorials -│ └── README.md # readme -``` - -## 工具介绍 - -所有工具相关文档介绍如下所示: -[readme索引](https://gitee.com/openharmony/napi_generator/blob/master/docs/readme.md) -[usage索引](https://gitee.com/openharmony/napi_generator/blob/master/docs/usage.md) -[develop索引](https://gitee.com/openharmony/napi_generator/blob/master/docs/develop.md) -[release-notes索引](https://gitee.com/openharmony/napi_generator/blob/master/docs/log/release-notes.md) \ No newline at end of file +# 简介 + +- dts2cpp工具可以根据用户指定路径下的ts(typescript)接口文件一键生成NAPI框架代码、业务代码框架、GN文件等。 + + [readme](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/dts2cpp_README_ZH.md) + + [版本说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/dts2cpp/docs/release-notes) + +- h2dts工具可以根据定义在c++头文件中的接口,生成type-script语言的ts接口文件。 + + [readme](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/h2dts/h2dts_README_ZH.md) + + [版本说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/h2dts/docs/release-notes/ts_Gen-1.0.md) + +- cmake2gn工具可以根据三方库的CMakeLists.txt文件,编译转换生成BUILD.gn脚本文件。 + + [readme](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/cmake2gn/cmake2gn_README_ZH.md) + + [版本说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/cmake2gn/docs/release-notes/gn-gen-release-notes-0.0.2.md) + +- h2sa工具可以根据一个定义远程方法的.h头文件,生成整个Service框架的代码,包含Ability注册、proxy/stub类实现、MessageParcel数据包构造、Service子系统编译及开机自启动相关配置文件。 + + [readme](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/h2sa/h2sa_README_ZH.md) + + [版本说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/h2sa/docs/release-notes/Service-1.0.md) + +- h2dtscpp工具可以根据定义在c++头文件中的接口,生成type-script语言的ts接口文件、NAPI框架代码、和自动化测试用例代码。 + + [readme](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/h2dtscpp/h2dtscpp_README_ZH.md) + +- scan工具,它可以扫描三方库中包含OpenHarmony源码不包含的接口,并输出result.xlsx文档。 + + [readme](https://gitee.com/openharmony/napi_generator/blob/master/src/tool/api/scan_README_ZH.md) \ No newline at end of file diff --git a/src/cli/cmake2gn/cmake2gn_README_ZH.md b/src/cli/cmake2gn/cmake2gn_README_ZH.md index 02d8d091..925d01e0 100644 --- a/src/cli/cmake2gn/cmake2gn_README_ZH.md +++ b/src/cli/cmake2gn/cmake2gn_README_ZH.md @@ -2,25 +2,7 @@ ## 简介 -cmake2gn工具,即GN脚本转换工具,它可以根据三方库的CMakeLists.txt文件,编译转换生成BUILD.gn脚本文件。当前OpenHarmony源码只支持BUILD.gn文件编译,开发者无法移植CMakeLists.txt编译方式的三方库到OpenHarmony中。此时,开发者可使用GN脚本转换工具,根据CMakeLists.txt文件生成BUILD.gn脚本文件,降低移植难度,提高开发效率。目前工具支持可执行文件、VS Code插件两种入口。 - - ├── napi_generator # 工具集 - │ ├── ... # 其它文件 - │ ├── src - │ │ ├── ... - │ │ ├── cli - │ │ | ├── ... # 其它工具 - │ │ | ├── cmake2gn - │ │ | | ├── src - │ │ | | | ├── main.js # 工具源码入口 - │ │ | | | ├── package.json # package.json文件 - │ │ | | | |── src - │ │ | | | | |── analyze_cmake.js # cmake解析器 - │ │ | | | | |── analyze_command.js # command解析器 - │ │ | | | | |── analyze_make.js # make解析器 - │ │ | | | | |── generate_gn.js # 生成器 - │ │ | | | | |── logger.js # log日志 - │ │ | | | | |── tool.js # 公共模块代码 +cmake2gn工具,它可以根据三方库的CMakeLists.txt文件,编译转换生成BUILD.gn脚本文件。当前OpenHarmony源码只支持BUILD.gn文件编译,开发者无法移植CMakeLists.txt编译方式的三方库到OpenHarmony中。此时,开发者可使用GN脚本转换工具,根据CMakeLists.txt文件生成BUILD.gn脚本文件,降低移植难度,提高开发效率。 ## 约束 系统:建议Ubuntu 20.04或者Windows 10 @@ -29,271 +11,63 @@ cmake2gn工具,即GN脚本转换工具,它可以根据三方库的CMakeLists ## 使用方法 -### 使用对象 +### 生成 -系统开发者 -### 使用场景 +1、安装cmake,安装命令如下: -1) 移植CMakeLists.txt编译方式的三方库到OpenHarmony源码中。 + sudo apt-get install cmake -### 工具获取 +2.下载res文件夹,并放置到napi_generator/src/cli/cmake2gn/src目录下,下载链接如下: -工具有两种类型,分别是可执行文件、VS Code插件。其中的可执行文件可根据工具使用者的开发环境选择,支持Windows,Linux和Mac。可执行文件、VS Code插件下载路径如下: +// todo -[下载链接](http://ftpkaihongdigi.i234.me:5000/fsdownload/1OjtRhtGf/gn-gen-0.0.1) +3.安装typescript:在napi_generator/src/cli/cmake2gn/src/src目录下执行命令: -### 工具输入 + npm i typescript -以CmakeLists.txt编译方式的三方库 +4.安装stdio:在napi_generator/src/cli/cmake2gn/src目录下执行命令: -根据使用者指定三方库的CMakeLists.txt文件,工具会输出对应的BUILD.gn文件。为了方便使用者快速上手工具,可供测试的三方库项目目录如下: + npm i stdio + +5.根据使用者指定三方库的CMakeLists.txt文件,工具会输出对应的BUILD.gn文件。将待转换的三方库拷贝到OpenHarmony/third_party下,为了方便使用者快速上手工具,可供测试的三方库项目目录如下: ``` Openharmony@Ubuntu-64:~/OpenHarmony/third_party/mbedtls-development$ ls 3rdparty BUGS.md ChangeLog cmake configs DartConfiguration.tcl docs include LICENSE programs scripts SUPPORT.md visualc BRANCHES.md ChangeLog.d CMakeLists.txt CONTRIBUTING.md dco.txt doxygen library Makefile README.md SECURITY.md tests ``` -### 工具使用 - -具体的工具使用步骤,可以左键单击以下链接了解: - -[工具使用说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/cmake2gn/docs/usage/INSTRUCTION_ZH.md) - -### 工具输出 - -在linux环境下的,根据输入三方库项目的CMakeLists.txt文件,生成的输出文件,如下所示: - - OpenHarmony@Ubuntu-64:~/OpenHarmony/third_party/mbedtls-development$ ls - 3rdparty BUGS.md ChangeLog cmake configs DartConfiguration.tcl docs include LICENSE programs scripts SUPPORT.md visualc BRANCHES.md build_tmp ChangeLog.d CMakeLists.txt CONTRIBUTING.md dco.txt doxygen library Makefile README.md SECURITY.md tests - OpenHarmony@Ubuntu-64:~/OpenHarmony/third_party/mbedtls-development$ cd build_tmp/ - OpenHarmony@Ubuntu-64:~/OpenHarmony/third_party/mbedtls-development/build_tmp$ ls - 3rdparty BUILD.gn cmake CMakeCache.txt CMakeFiles cmake_install.cmake CTestTestfile.cmake DartConfiguration.tcl include library Makefile ohos.toolchain.cmake programs scripts tests - -其中生成的BUILD.gn文件,内容如下所示: +6.在napi_generator/src/cli/cmake2gn/src/src下执行以下命令: ``` -import("//build/ohos.gni") - -group("all_targets") { - deps = [ - #静态库 - "//third_party/mbedtls-development/build_tmp/library:mbedcrypto", - "//third_party/mbedtls-development/build_tmp/library:mbedx509", - "//third_party/mbedtls-development/build_tmp/library:mbedtls", - - #可执行程序 - "//third_party/mbedtls-development/build_tmp/programs/aes:crypt_and_hash", - "//third_party/mbedtls-development/build_tmp/programs/cipher:cipher_aead_demo", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_x509crl", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_x509csr", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_pubkey", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_pkcs7", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_privkey", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_client", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_dtlsserver", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_dtlsclient", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_x509crt", - "//third_party/mbedtls-development/build_tmp/programs/fuzz:fuzz_server", - "//third_party/mbedtls-development/build_tmp/programs/hash:generic_sum", - "//third_party/mbedtls-development/build_tmp/programs/hash:hello", - "//third_party/mbedtls-development/build_tmp/programs/hash:md_hmac_demo", - "//third_party/mbedtls-development/build_tmp/programs/pkey:mpi_demo", - "//third_party/mbedtls-development/build_tmp/programs/pkey:key_app", - "//third_party/mbedtls-development/build_tmp/programs/pkey:pk_encrypt", - "//third_party/mbedtls-development/build_tmp/programs/pkey:gen_key", - "//third_party/mbedtls-development/build_tmp/programs/pkey:ecdsa", - "//third_party/mbedtls-development/build_tmp/programs/pkey:rsa_encrypt", - "//third_party/mbedtls-development/build_tmp/programs/pkey:dh_client", - "//third_party/mbedtls-development/build_tmp/programs/pkey:dh_server", - "//third_party/mbedtls-development/build_tmp/programs/pkey:dh_genprime", - "//third_party/mbedtls-development/build_tmp/programs/pkey:ecdh_curve25519", - "//third_party/mbedtls-development/build_tmp/programs/pkey:pk_decrypt", - "//third_party/mbedtls-development/build_tmp/programs/pkey:pk_sign", - "//third_party/mbedtls-development/build_tmp/programs/pkey:key_app_writer", - "//third_party/mbedtls-development/build_tmp/programs/pkey:pk_verify", - "//third_party/mbedtls-development/build_tmp/programs/pkey:rsa_decrypt", - "//third_party/mbedtls-development/build_tmp/programs/pkey:rsa_genkey", - "//third_party/mbedtls-development/build_tmp/programs/pkey:rsa_sign", - "//third_party/mbedtls-development/build_tmp/programs/pkey:rsa_sign_pss", - "//third_party/mbedtls-development/build_tmp/programs/pkey:rsa_verify", - "//third_party/mbedtls-development/build_tmp/programs/pkey:rsa_verify_pss", - "//third_party/mbedtls-development/build_tmp/programs/psa:key_ladder_demo", - "//third_party/mbedtls-development/build_tmp/programs/psa:crypto_examples", - "//third_party/mbedtls-development/build_tmp/programs/psa:aead_demo", - "//third_party/mbedtls-development/build_tmp/programs/psa:hmac_demo", - "//third_party/mbedtls-development/build_tmp/programs/psa:psa_constant_names", - "//third_party/mbedtls-development/build_tmp/programs/random:gen_entropy", - "//third_party/mbedtls-development/build_tmp/programs/random:gen_random_ctr_drbg", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_pthread_server", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_client1", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_client2", - "//third_party/mbedtls-development/build_tmp/programs/ssl:mini_client", - "//third_party/mbedtls-development/build_tmp/programs/ssl:dtls_server", - "//third_party/mbedtls-development/build_tmp/programs/ssl:dtls_client", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_server", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_server2", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_context_info", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_fork_server", - "//third_party/mbedtls-development/build_tmp/programs/ssl:ssl_mail_client", - "//third_party/mbedtls-development/build_tmp/programs/test:selftest", - "//third_party/mbedtls-development/build_tmp/programs/test:benchmark", - "//third_party/mbedtls-development/build_tmp/programs/test:udp_proxy", - "//third_party/mbedtls-development/build_tmp/programs/test:query_compile_time_config", - "//third_party/mbedtls-development/build_tmp/programs/test:zeroize", - "//third_party/mbedtls-development/build_tmp/programs/util:pem2der", - "//third_party/mbedtls-development/build_tmp/programs/util:strerror", - "//third_party/mbedtls-development/build_tmp/programs/x509:load_roots", - "//third_party/mbedtls-development/build_tmp/programs/x509:cert_req", - "//third_party/mbedtls-development/build_tmp/programs/x509:cert_write", - "//third_party/mbedtls-development/build_tmp/programs/x509:crl_app", - "//third_party/mbedtls-development/build_tmp/programs/x509:req_app", - "//third_party/mbedtls-development/build_tmp/programs/x509:cert_app", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_x509write", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_x509parse", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_its", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_storage_format.current", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_timing", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_ssl", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_rsa", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_entropy", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_shax", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_hmac_drbg.pr", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_dhm", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_ecdsa", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.des", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_poly1305", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_ctr_drbg", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.null", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.gcm", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_storage_format.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_ccm", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.camellia", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_chachapoly", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_mdx", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_des", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.chacha20", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum.generated", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum_mod", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_chacha20", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_aria", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_not_supported.generated", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.padding", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.nist_kw", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_aes.ofb", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_hmac_drbg.nopr", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_aes.ecb", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_hkdf", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_aes.cfb", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.ccm", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pkcs5", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.aes", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_aes.rest", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cmac", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_camellia", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_ecdh", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_md", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.chachapoly", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_storage_format.v0", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_asn1parse", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_asn1write", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_base64", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum_mod_raw.generated", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_oid", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum_core.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_ecjpake", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum_core.generated", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum_mod_raw", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_random", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_aes.cbc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pk", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_version", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_se_driver_hal_mocks", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_bignum_mod.generated", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_debug", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pkcs1_v21", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.aes128_de", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_cipher.aria", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.aes128_en", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.aes192_de", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.camellia", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.aes192_en", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.aes256_de", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.aes256_en", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_gcm.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_hmac_drbg.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_hmac_drbg.no_reseed", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_lms", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_mps", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_memory_buffer_alloc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_net", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_nist_kw", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_metadata", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pkparse", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_hash", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pem", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pkcs12", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_attributes", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_aes.xts", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_op_fail.generated", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pkcs1_v15", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pkcs7", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_pkwrite", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_not_supported.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_driver_wrappers", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_entropy", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_generate_key.generated", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_init", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_op_fail.misc", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_error", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_pake", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_lmots", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_persistent_key", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_se_driver_hal", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_ecp", - "//third_party/mbedtls-development/build_tmp/tests:test_suite_psa_crypto_slot_management", - - ] -} - +node main.js -o out/rk3568 -p /home/OpenHarmony -f third_party/mbedtls-development/CMakeLists.txt -t cmake -s test_subsystem -m mbedtls-development ``` -### 集成 +其中,参数详情如下: -具体的将三方库集成到OpenHarmony的步骤,可以左键单击以下链接了解: - -[将三方库集成到OpenHarmony的方法](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/cmake2gn/docs/usage/ENSEMBLE_METHOD_ZH.md) - -## 工具开发说明 + -o:必填参数,ohos产品输出相对路径(例如:out/rk3568); -### 对象 + -p:必填参数,ohos项目路径(例如:/home/OpenHarmony); -工具的开发者 + -f:必选参数,待转换三方库cmake文件相对路径(例如:third_party/mbedtls-development/CMakeLists.txt); -### 开发场景 + -t:可选参数,默认为cmake; -若当前工具的功能已经不能满足开发者的全部需求,则开发者可以基于已有的源码对工具进行二次开发,来增强工具的能力,编译打包生成自定义的可执行文件和插件。 + -s:可选参数,默认填写“test_subsystem”,使用者可根据实际情况修改子系统名称; -### 开发步骤 + -m:可选参数,工具默认填写“test_part”,使用者可根据实际情况修改组件名称; -开发者可以根据如下的步骤来完成对工具的开发: + -d:可选参数,工具默认填写待转换三方库cmake文件所在文件夹相对路径,使用者可根据实际情况修改路径; - [工具开发说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/cmake2gn/docs/guide/DEVELOP_ZH.md) + -a:可选参数,待转换三方库中引用其它三方库时需填写该选项,具体填写方法可参考FAQ中libcoap转换时问题解决方法,详细FAQ内容可左键单击以下链接了解:[FAQ](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/cmake2gn/docs/guide/FAQ.md); -## 版本说明 +7.运行成功后会在/OpenHarmony/third_party/mbedtls-development目录下生成build_tmp文件夹,build_tmp文件夹中包含BUILD.gn文件,如下所示: -[版本说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/cmake2gn/docs/release-notes/gn-gen-release-notes-0.0.2.md) +![](./docs/figures/pic-build-tmp.png) -## FAQ - - [FAQ](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/cmake2gn/docs/guide/FAQ.md) +### 集成 -## 参与贡献 +具体的将三方库集成到OpenHarmony的步骤,可以左键单击以下链接了解: -暂无 +[将三方库集成到OpenHarmony的方法](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/cmake2gn/docs/usage/ENSEMBLE_METHOD_ZH.md) -## 相关仓 -暂无 diff --git a/src/cli/dts2cpp/docs/figures/dts2cpp_outResult.png b/src/cli/dts2cpp/docs/figures/dts2cpp_outResult.png new file mode 100644 index 0000000000000000000000000000000000000000..fc689ae660fcf0b2bbf1d149a0818ae63dea38a4 GIT binary patch literal 20626 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 literal 0 HcmV?d00001 diff --git a/src/cli/dts2cpp/dts2cpp_README.md b/src/cli/dts2cpp/dts2cpp_README.md deleted file mode 100644 index 1f5e5d52..00000000 --- a/src/cli/dts2cpp/dts2cpp_README.md +++ /dev/null @@ -1,133 +0,0 @@ -# dts2cpp工具 - -## 简介 -dts2cpp工具,即NAPI框架生成工具,它可以根据用户指定路径下的ts(typescript)接口文件一键生成NAPI框架代码、业务代码框架、GN文件等。在开发JS应用与NAPI间接口时,底层框架开发者无需关注js语法、C++与JS之间的数据类型转换等上层应用转换逻辑,只关注底层业务逻辑即可,专业的人做专业的事,从而可以大大提高开发效率。目前工具支持可执行文件、VS Code插件、DevEco Studio上使用的IntelliJ插件三种入口。 - -## 目录 - - ├── napi_generator # 工具集 - │ ├── ... # 其它文件 - │ ├── src - │ │ ├── ... - │ │ ├── cli - │ │ | ├── ... # 其它工具 - │ │ | ├── dts2cpp - │ │ | | ├── src/gen # napi工具源码 - │ │ | | | ├── analyze # 解析器 - │ │ | | | |── extend # 扩展模块,包括gn文件生成、linux环境适配代码等 - │ │ | | | |── generate # 生成器 - │ │ | | | └── tools # 公共模块代码,包括消息体校验、文件读写、正则表达式转换等 - │ │ | │ └── README # 工具使用指导 - -## 约束 -系统:建议Ubuntu 20.04或者Windows 10 - -依赖版本:VS Code 1.62.0 - -## 使用方法 - -### 使用对象 - -系统开发者 - -### 使用场景 - -1) 系统框架层新增子系统,需对应用层提供接口。 -2) 系统框架层子系统能力增强后,需对应用层提供新接口。 - -### 工具获取 - -工具有三种类型,分别是可执行文件、VS Code插件、DevEco Studio上使用的IntelliJ插件。其中的可执行文件可根据工具使用者的开发环境选择,支持Windows,Linux和Mac。 - -可执行文件下载路径如下(由于网络原因,可能会导致有的下载链接失效,因此提供了以下三个下载链接): - -[可执行文件下载链接1](http://ftpkaihongdigi.i234.me:5000/sharing/yaRiKSjBI) - -[可执行文件下载链接2](http://ftp.kaihong.com:5000/fsdownload/yaRiKSjBI/) - -[可执行文件下载链接3](http://ftp.kaihongdigi.com:5000/fsdownload/yaRiKSjBI/) - -访问密码:kaihong - -压缩包解压密码:kaihong20231121 - -DevEco Studio上使用的IntelliJ插件下载路径如下: - -[DevEco Studio上使用的IntelliJ插件下载链接](https://plugins.jetbrains.com/plugin/19593-napi-generator/versions) - -### 工具输入 - -根据使用者指定的typescript文件,工具会输出NAPI框架代码、业务代码框架、GN脚本等文件。 - -为了方便使用者快速上手工具,可供测试的typescript文件@ohos.napitest.d.ts示例如下: - -``` -declare namespace napitest { - function funcTest(v1: number, v2: number): number; -} - -export default napitest; -``` - -### 工具使用 - -具体的工具使用步骤,可以左键单击以下链接了解: - -[工具使用说明](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/usage/dts2cpp_INSTRUCTION_ZH.md) - -### 工具输出 - -在window环境下的,根据输入文件@ohos.napitest.d.ts生成的输出文件,如下所示: - -![](./docs/figures/pic-d-ts-transition_result.png) - -### 代码集成 - -为了实现工具生成的接口被其它子系统或者应用调用,需将生成的代码编译集成到OpenHarmony系统中,编译生成动态库。 - -把工具的生成代码集成到OpenHarmony的具体操作步骤,可以左键单击以下链接了解: - -[生成代码集成到OpenHarmony的方法](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/usage/dts2cpp_ENSEMBLE_METHOD_ZH.md) - -### 测试调用 - -为验证工具生成的接口是否可被应用调用,需编写app进行测试。具体如何操作可左键单击以下链接了解: - -[工具集成测试](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/usage/dts2cpp_INTEGRATION_TESTING_ZH.md) - -## 工具开发说明 - -### 对象 - -工具的开发者 - -### 开发场景 - -若当前工具的功能已经不能满足开发者的全部需求,则开发者可以基于已有的源码对工具进行二次开发,来增强工具的能力,编译打包生成自定义的可执行文件和插件。 - -### 开发步骤 - -开发者可以根据如下的步骤来完成对工具的开发: - - [工具开发说明](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/guide/DEVELOP_ZH.md) - -## 版本说明 - - 当前版本已支持的特性和待开发的特性,如下所示: - - [已支持特性](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/release-notes) - - [待支持特性](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/requirement/ROADMAP_ZH.md) - -## FAQ -对于常见问题解决方法指导如下: - - [FAQ](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/guide/FAQ.md) - -## 参与贡献 - -暂无 - -## 相关仓 - -[ts生成工具README_zh](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/h2dts/README_ZH.md) \ No newline at end of file diff --git a/src/cli/dts2cpp/dts2cpp_README_ZH.md b/src/cli/dts2cpp/dts2cpp_README_ZH.md new file mode 100644 index 00000000..7c47b22f --- /dev/null +++ b/src/cli/dts2cpp/dts2cpp_README_ZH.md @@ -0,0 +1,68 @@ +# dts2cpp工具 + +## 简介 +dts2cpp工具,它可以根据用户指定路径下的ts(typescript)接口文件一键生成NAPI框架代码、业务代码框架、GN文件等。在开发JS应用与NAPI间接口时,底层框架开发者无需关注js语法、C++与JS之间的数据类型转换等上层应用转换逻辑,只关注底层业务逻辑即可,专业的人做专业的事,从而可以大大提高开发效率。 + +## 约束 +系统:建议Ubuntu 20.04或者Windows 10 + +依赖版本:VS Code 1.62.0 + +## 使用方法 + +### 生成框架 + +1.安装typescript:在napi_generator/src/cli/dts2cpp/src目录下执行命令: + + npm i typescript + +2.安装stdio:在napi_generator/src/cli/dts2cpp目录下执行命令: + + npm i stdio + +3.将待转换的文件@ohos.napitest.d.ts拷贝到napi_generator/src/cli/dts2cpp/src下,并在该目录下新建out目录;@ohos.napitest.d.ts如下所示: + +``` +declare namespace napitest { + function funcTest(v: boolean): string; +} +export default napitest; +``` + +4.在napi_generator/src/cli/dts2cpp/src下执行以下命令生成napi框架代码: + +``` +node gen\cmd_gen.js -f @ohos.napitest.d.ts -o out +``` + +其中,参数详情如下: + + -f, 待转换的.d.ts文件,若同时转换多个文件,文件之间用“,”隔开; + + -d, 根据指定路径转换该文件夹中所有.d.ts文件; + + -i, 可选参数,默认false,待转换.d.ts文件中引用非basic.d.ts的ts文件时打开开关; + + -o, 可选参数,默认为当前目录,指定生成框架代码输出路径; + + -n, 可选参数,默认为uint32_t,指定生成框架代码中number类型全部为指定类型; + + -s, 可选参数,默认为不配置业务代码,指定生成框架代码的业务配置文件,用于粘合工具代码和业务代码的配置。 + + 备注1:-f与-d两个参数只选其中一个参数即可。 + + 备注2:若.d.ts文件中声明了其它.d.ts文件,将此类文件放置在待转换.d.ts文件同级目录。 + +5.输出文件如下所示: + +![](./docs/figures/dts2cpp_outResult.png) + +### 集成 + +[生成代码集成到OpenHarmony的方法](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/usage/dts2cpp_ENSEMBLE_METHOD_ZH.md) + +### 调用 + +NAPI框架代码生成后,系统框架开发者进行二次开发后,即可集成到OpenHarmony编译系统,生成对应的库文件,供应用开发者调用接口。工具集成测试的具体操作步骤可以左键单击以下链接了解: + +[工具集成测试](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/dts2cpp/docs/usage/dts2cpp_INTEGRATION_TESTING_ZH.md) \ No newline at end of file diff --git a/src/cli/h2dts/h2dts_README_ZH.md b/src/cli/h2dts/h2dts_README_ZH.md index 7762c3ce..feab44e7 100644 --- a/src/cli/h2dts/h2dts_README_ZH.md +++ b/src/cli/h2dts/h2dts_README_ZH.md @@ -1,18 +1,7 @@ # h2dts工具 ## 简介 -h2dts工具,即Ts接口生成工具,它可以根据定义在c++头文件中的接口,生成type-script语言的ts接口文件。若某个服务实现方式为c++,且供应用层访问的接口已在.h文件中定义,此时,NAPI接口开发者使用此工具可一键生成对应的ts文件,进而将生成的ts文件作为NAPI框架生成代码工具的输入,生成NAPI框架代码。串行使用ts接口生成工具、NAPI框架代码生成工具,形成工具链,达到降低NAPI接口开发难度,提高开发效率。目前工具支持可执行文件、IntelliJ插件两种入口。 - - ├── napi_generator # 工具集 - │ ├── ... # 其它文件 - │ ├── src - │ │ ├── ... - │ │ ├── cli - │ │ | ├── ... # 其它工具 - │ │ | ├── h2dts/src # 工具源码 - │ │ │ │ ├── tsGen # Ts框架工具源码 - │ │ | │ │ ├── header_parser.py # 解析C++头文件并生成表示类的数据结构 - │ │ | │ │ |── tsMain.js # Ts框架工具源码入口 +h2dts工具,即Ts接口生成工具,它可以根据定义在c++头文件中的接口,生成type-script语言的ts接口文件。若某个服务实现方式为c++,且供应用层访问的接口已在.h文件中定义,此时,NAPI接口开发者使用此工具可一键生成对应的ts文件,进而将生成的ts文件作为NAPI框架生成代码工具的输入,生成NAPI框架代码。串行使用ts接口生成工具、NAPI框架代码生成工具,形成工具链,达到降低NAPI接口开发难度,提高开发效率。 ## 约束 系统:建议Ubuntu 20.04或者Windows 10 @@ -21,108 +10,53 @@ h2dts工具,即Ts接口生成工具,它可以根据定义在c++头文件中 ## 使用方法 -### 使用对象 +1.安装typescript:在napi_generator/src/cli/h2dts/src目录下执行命令: -系统开发者、应用Native开发者 + npm i typescript -### 使用场景 +2.安装stdio:在napi_generator/src/cli/h2dts目录下执行命令: -1) 系统框架层新增子系统,需对应用层提供接口。 -2) 系统框架层子系统能力增强后,需对应用层提供新接口。 -3) 应用层引入C++三方库,需增加OpenHarmony应用层接口。 + npm i stdio -### 工具获取 - -工具有两种类型,分别是可执行文件、IntelliJ插件。其中的可执行文件可根据工具使用者的开发环境选择,支持Windows,Linux和Mac。可执行文件、IntelliJ插下载路径如下: - -[下载链接](http://ftp.kaihongdigi.com:5000/fsdownload/mKjfCmPjk/generator_outputs_NAPI_0930) - -### 工具输入 - -根据使用者指定的.h文件,工具会输出对应的ts接口文件。为了方便使用者快速上手工具,可供测试的test.h文件样例如下: +3.将待转换的文件tsTest.h拷贝到napi_generator/src/cli/h2dts/src/tsGen下;TsGenTest.h文件如下所示: ``` - - #include < string > - #include < vector > - using namespace std; - - class TestA { - public: - char16_t string1; - void add(string v, long double v1[]); - }; - double count(double v, double v1[]); - - namespace Space { - class TestBB { - public: - short string4; - bool ifExist(bool v, bool v1[]); - }; - uint32_t max(uint32_t v, uint32_t v1[]); - } +#ifndef TSGENTEST_H +#define TSGENTEST_H + +#include +#include +#include + +namespace OHOS { +class TsGenTest { +public: + std::string getServName(); + std::string getServTime(); + int32_t doSum(int32_t num1, int32_t num2); + double addCount(double newNum); +}; +} +#endif ``` -### 工具使用 - -具体的工具使用步骤,可以左键单击以下链接了解: - -[工具使用说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/h2dts/docs/usage/INSTRUCTION_ZH.md) - -### 工具输出 - -在window环境下的,根据输入文件test.h,生成的输出文件,如下所示: - -![](./docs/figures/h-2-ts-succ.png) - - -其中生成的"test.d.ts"文件,定义了应用开发接口,如下所示: - - declare class TestA { - string1: string; - add(v: string, v1: Array): void; - } - declare namespace Space { - function max(v: number, v1: Array): number; - class TestBB { - string4: number; - ifExist(v: boolean, v1: Array): boolean; - } - } - declare function count(v: number, v1: Array): number; - - export default Space; - +4.在napi_generator/src/cli/h2dts/src/tsGen下执行以下命令生成ts声明文件: -## 工具开发说明 - -### 对象 - -工具的开发者 - -### 开发场景 - -若当前工具的功能已经不能满足开发者的全部需求,则开发者可以基于已有的源码对工具进行二次开发,来增强工具的能力,编译打包生成自定义的可执行文件和插件。 - -### 开发步骤 - -开发者可以根据如下的步骤来完成对工具的开发: - - [工具开发说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/h2dts/docs/guide/DEVELOP_ZH.md) - -## 版本说明 - - [版本说明](https://gitee.com/openharmony/napi_generator/blob/master/src/cli/h2dts/docs/release-notes/ts_Gen-1.0.md) - -## FAQ +``` +node cmd_gen.js -f TsGenTest.h +``` - [FAQ](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/h2dts/docs/guide/FAQ.md) +其中,参数详情如下: + -f, 待转换的.h文件,若同时转换多个文件,文件之间用“,”隔开; + -d, 根据指定路径转换该文件夹中所有.h文件; + -t, 区分ts生成与napi转换工具,值为true时表示ts生成,false表示napi转换,默认为false; + -o, 可选参数,默认为当前目录,指定生成框架代码输出路径。 -## 参与贡献 + 备注:-f与-d两个参数只选其中一个参数即可。 -暂无 +5.执行成功后在napi_generator/src/cli/h2dts/src/tsGen下生成TsGenTest.d.ts声明文件 -## 相关仓 +``` +TsGenTest.d.ts +``` -暂无 diff --git a/src/cli/h2dtscpp/h2dtscpp_README.md b/src/cli/h2dtscpp/h2dtscpp_README.md new file mode 100644 index 00000000..cd14bb49 --- /dev/null +++ b/src/cli/h2dtscpp/h2dtscpp_README.md @@ -0,0 +1,63 @@ +# h2dtscpp工具 + +## 简介 + +h2dtscpp工具即NATIVE生成工具,该工具由C++语法解释器和代码生成器两部分组成。C++语法解释器解析用户输入的.h文件内容,通过C++语法解析,将文件内容分解为类、方法、入参、成员属性等元素;代码生成器根据从语法解析器得到的这些元素,转换为对应的typescript语法的接口、方法、参数代码,生成.ts文件内容;同时通过语法解析器得到的元素,生成.h文件对应的napi框架代码和接口调用测试代码。 + +## 约束 + +系统:建议Windows 10 + +## 使用方法 + +### 生成 + +1.安装typescript:使用管理员身份在napi_generator/src/cli/h2dtscpp/src目录下执行命令: + + npm i typescript + +2.安装stdio:使用管理员身份在napi_generator/src/cli/h2dtscpp/src目录下执行命令: + + npm i stdio + +3.将待转换的.h文件拷贝到napi_generator/src/cli/h2dtscpp/src下,如 [cJSON测试三方库](https://gitee.com/openharmony/napi_generator/releases/tag/测试用资源) 的cJSON.h,并新建out目录。 + +4.在napi_generator/src/cli/h2dtscpp/src执行以下命令: + +``` +node src\main.js -f cJSON.h -o out +``` + +其中,参数详情如下: + +-f, 必选参数,待转换的.h文件;如cJSON.h。 + +-t, 可选参数,测试用例文件Ability.test.ets文件路径,默认路径为.h文件目录下testout文件夹下创建的xxxAbility.test.ets文件路径(如:testout/cJSONAbility.test.ets)。 + +-i, 可选参数,ts声明文件index.s.ts文件路径,默认路径为.h文件目录下tsout文件夹下创建的index.d.ts文件路径(如:tsout/index.d.ts) + +index.d.ts文件路径; + +-o, 可选参数,生成的.cpp文件所在路径,默认路径为.h文件目录下创建的cppout文件夹路径; + +5.执行成功后在out目录下生成以下文件夹 + +![](./docs/figures/h2dtscpp_out_example.png) + +tsout文件夹下内容如下所示: + +![](./docs/figures/h2dtscpp_dtsout_example.png) + +testout文件夹下内容如下所示: + +![](./docs/figures/h2dtscpp_testout_example.png) + +cppout文件夹下内容(部分文件截图)如下所示: + +![](./docs/figures/h2dtscpp_cppout_example.png) + +### 测试 + +查看生成代码是否能正确编译,点击下面链接查看: + +[工具使用说明](https://gitee.com/openharmony/napi_generator/tree/master/src/cli/h2dtscpp/docs/usage/INSTRUCTION_ZH.md) \ No newline at end of file diff --git a/src/cli/h2sa/docs/figures/h2sa_outRes.png b/src/cli/h2sa/docs/figures/h2sa_outRes.png new file mode 100644 index 0000000000000000000000000000000000000000..44d248df72f23296679e3ead80d08e3a931687b6 GIT binary patch literal 13447 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 Date: Fri, 12 Jul 2024 20:39:39 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=86=E7=A6=BBh2dts=E5=92=8Cdts2cpp?= =?UTF-8?q?=E6=BA=90=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: gou-jingjing --- src/cli/dts2cpp/src/gen/cmd_gen.js | 7 - src/cli/h2dts/src/tsGen/cmd_gen.js | 109 ++++++++ src/cli/h2dts/src/tsGen/tools/FileRW.js | 140 ++++++++++ src/cli/h2dts/src/tsGen/tools/NapiLog.js | 138 ++++++++++ src/cli/h2dts/src/tsGen/tools/re.js | 82 ++++++ src/cli/h2dts/src/tsGen/tools/tool.js | 329 +++++++++++++++++++++++ src/cli/h2dts/src/tsGen/tsMain.js | 6 +- 7 files changed, 801 insertions(+), 10 deletions(-) create mode 100644 src/cli/h2dts/src/tsGen/cmd_gen.js create mode 100644 src/cli/h2dts/src/tsGen/tools/FileRW.js create mode 100644 src/cli/h2dts/src/tsGen/tools/NapiLog.js create mode 100644 src/cli/h2dts/src/tsGen/tools/re.js create mode 100644 src/cli/h2dts/src/tsGen/tools/tool.js diff --git a/src/cli/dts2cpp/src/gen/cmd_gen.js b/src/cli/dts2cpp/src/gen/cmd_gen.js index 609bcb2d..51284bc7 100644 --- a/src/cli/dts2cpp/src/gen/cmd_gen.js +++ b/src/cli/dts2cpp/src/gen/cmd_gen.js @@ -13,7 +13,6 @@ * limitations under the License. */ const main = require('./main'); -const tsMain = require('../tsGen/tsMain'); const re = require('./tools/re'); const { checkFileError } = require('./tools/common'); const { NapiLog } = require('./tools/NapiLog'); @@ -114,12 +113,6 @@ function getJsonCfg(currentPath) { function checkGenerate(fileName) { NapiLog.logInfo('check file []'.format(fileName)); - let suffix = fileName.split('.').pop().toLowerCase(); - if (ops.tsGen === 'true' && suffix === 'h') { - NapiLog.logInfo('convert .h file to .ts file...'); - tsMain.doGenerate(fileName, ops.out); - return; - } let fn = re.getFileInPath(fileName); let tt = re.match('(@ohos\.)*([.a-z_A-Z0-9]+).d.ts', fn); if (tt) { diff --git a/src/cli/h2dts/src/tsGen/cmd_gen.js b/src/cli/h2dts/src/tsGen/cmd_gen.js new file mode 100644 index 00000000..2327c65f --- /dev/null +++ b/src/cli/h2dts/src/tsGen/cmd_gen.js @@ -0,0 +1,109 @@ +/* +* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +const tsMain = require('./tsMain'); +const { NapiLog } = require('./tools/NapiLog'); +const path = require('path'); +const stdio = require('stdio'); +var fs = require('fs'); +const { print } = require('./tools/tool'); + +let ops = stdio.getopt({ + 'filename': { key: 'f', args: 1, description: '.d.ts file', default: '' }, + 'directory': { key: 'd', args: 1, description: '.d.ts directory', default: '' }, + 'out': { key: 'o', args: 1, description: 'output directory', default: '.' }, + 'loglevel': { key: 'l', args: 1, description: 'Log Level : 0~3', default: '1' }, + 'tsGen':{key: 't', args: 1, description: 'enable or disable generate typescript file', default: false }, +}); + +NapiLog.init(ops.loglevel, path.join("" + ops.out, "napi_gen.log")); + +let fileNames = ops.filename; +var pathDir = ops.directory; +if (fileNames == null && pathDir == null) { + NapiLog.logInfo('fileNames and pathDir both cannot be empty at the same time'); +} else if (pathDir !== '') { + readDirFiles(); +} else if (fileNames !== '') { + readFiles(); +} + +function readFiles() { + fileNames = fileNames.replace(/(^\s*)|(\s*$)/g, ''); // trim before and after espace + let regex = ','; + let filenameArray = fileNames.toString().split(regex); + + let n = filenameArray.length; + for (let i = 0; i < n; i++) { + let fileName = filenameArray[i]; + if (fileName !== ' ') { + fileName = fileName.replace(/(^\s*)|(\s*$)/g, ''); + checkGenerate(fileName); + } + } +} + +function handleDirFiles(files) { + if (0 === files.length) { + NapiLog.logInfo('[Func: readDirFiles] No files in path %s!'.format(pathDir)); + return; + } + (function iterator(i) { + if (i === files.length) { + return; + } + let data = fs.statSync(path.join(pathDir + '', files[i])); + if (data.isFile()) { + let fileName = files[i]; + checkGenerate(pathDir + '/' + fileName); + } + iterator(i + 1); + })(0); +} + +function readDirFiles() { + let fileList; + try { + fileList = fs.readdirSync(pathDir + ''); + } catch (err) { + NapiLog.logError('readdir file error ' + err); + return; + } + + handleDirFiles(fileList); +} + +function checkGenerate(fileName) { + NapiLog.logInfo('check file []'.format(fileName)); + let suffix = fileName.split('.').pop().toLowerCase(); + if (suffix === 'h') { + NapiLog.logInfo('convert .h file to .ts file...'); + tsMain.doGenerate(fileName, ops.out); + return; + } + else { + NapiLog.logError('file name ' + fileName + ' format invalid in function of checkGenerate!'); + } +} + +let ret = NapiLog.getResult(); +if (ret[0]) { + print('success'); + NapiLog.logInfo('success'); +} +else { + print('fail\n' + ret[1]); + NapiLog.logInfo('fail\n' + ret[1]); +} diff --git a/src/cli/h2dts/src/tsGen/tools/FileRW.js b/src/cli/h2dts/src/tsGen/tools/FileRW.js new file mode 100644 index 00000000..8f202d87 --- /dev/null +++ b/src/cli/h2dts/src/tsGen/tools/FileRW.js @@ -0,0 +1,140 @@ +/* +* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +const fs = require('fs'); + +function utf8ArrayToStr(array) { + var out, i, len, c; + var char2, char3; + + out = ""; + len = array.length; + i = 0; + while (i < len) { + c = array[i++]; + switch (c >> 4) { + case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: + // 0xxxxxxx + out += String.fromCharCode(c); + break; + case 12: case 13: + // 110x xxxx 10xx xxxx + char2 = array[i++]; + out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); + break; + case 14: + // 1110 xxxx 10xx xxxx 10xx xxxx + char2 = array[i++]; + char3 = array[i++]; + out += String.fromCharCode(((c & 0x0F) << 12) | + ((char2 & 0x3F) << 6) | + ((char3 & 0x3F) << 0)); + break; + } + } + + return out; +} + +function stringToUint8Array(string, options = { stream: false }) { + if (options.stream) { + throw new Error(`Failed to encode: the 'stream' option is unsupported.`); + } + let pos = 0; + const len = string.length; + let at = 0; // output position + let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size + let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset + + while (pos < len) { + let value = string.charCodeAt(pos++); + let isContinue = false; + if (value >= 0xd800 && value <= 0xdbff) { + if (pos < len) {// high surrogate + const extra = string.charCodeAt(pos); + if ((extra & 0xfc00) === 0xdc00) { + ++pos; + value = ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000; + } + } + if (value >= 0xd800 && value <= 0xdbff) { + isContinue = true; // drop lone surrogate + } + } + + if (!isContinue) { + // expand the buffer if we couldn't write 4 bytes + if (at + 4 > target.length) { + tlen += 8; // minimum extra + tlen *= (1.0 + (pos / string.length) * 2); // take 2x the remaining + tlen = (tlen >> 3) << 3; // 8 byte offset + + target = uint8Array(tlen, target); + } + + let calculateResult = calculate(value, target, at); + isContinue = calculateResult[0]; + target = calculateResult[1]; + at = calculateResult[2]; + } + } + return target.slice(0, at); +} + +function calculate(value, target, at) { + let isContinue = false; + if ((value & 0xffffff80) === 0) { // 1-byte + target[at++] = value; // ASCII + isContinue = true; + } else if ((value & 0xfffff800) === 0) { // 2-byte + target[at++] = ((value >> 6) & 0x1f) | 0xc0; + } else if ((value & 0xffff0000) === 0) { // 3-byte + target[at++] = ((value >> 12) & 0x0f) | 0xe0; + target[at++] = ((value >> 6) & 0x3f) | 0x80; + } else if ((value & 0xffe00000) === 0) { // 4-byte + target[at++] = ((value >> 18) & 0x07) | 0xf0; + target[at++] = ((value >> 12) & 0x3f) | 0x80; + target[at++] = ((value >> 6) & 0x3f) | 0x80; + } else { + isContinue = true; + } + if (!isContinue) { + target[at++] = (value & 0x3f) | 0x80; + } + return [isContinue, target, at]; +} + +function uint8Array(tlen, target) { + const update = new Uint8Array(tlen); + update.set(target); + return update; +} + +function readFile(fn) { + if (!fs.existsSync(fn)) { + return ""; + } + let data = fs.readFileSync(fn); + data = utf8ArrayToStr(data); + return data; +} +function writeFile(fn, str) { + let data = stringToUint8Array(str); + fs.writeFileSync(fn, data); +} + +module.exports = { + readFile, + writeFile, +}; \ No newline at end of file diff --git a/src/cli/h2dts/src/tsGen/tools/NapiLog.js b/src/cli/h2dts/src/tsGen/tools/NapiLog.js new file mode 100644 index 00000000..b35db3cf --- /dev/null +++ b/src/cli/h2dts/src/tsGen/tools/NapiLog.js @@ -0,0 +1,138 @@ +/* +* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +const fs = require('fs'); +const path = require('path'); +let vscode = null; +try { + vscode = require('vscode'); +} +catch (err) { + vscode = null; +} + +class NapiLog { + constructor() { + } +} +NapiLog.LEV_NONE = 0; +NapiLog.LEV_ERROR = 1; +NapiLog.LEV_DEBUG = 2; +NapiLog.LEV_INFO = 3; + +const LEV_STR = ['[NON]', '[ERR]', '[DBG]', '[INF]']; +var logLevel = NapiLog.LEV_ERROR; +var logFileName = null; +var logResultMessage = [true, '']; + +function getDateString() { + let nowDate = new Date(); + return nowDate.toLocaleString(); +} + +function saveLog(dateStr, levStr, detail) { + if (logFileName) { + let logStr = dateStr + ' ' + levStr + ' ' + detail + '\n'; + fs.appendFileSync(logFileName, logStr); + } +} + +NapiLog.init = function (level, fileName) { + logLevel = level in [NapiLog.LEV_NONE, NapiLog.LEV_ERROR, NapiLog.LEV_DEBUG, NapiLog.LEV_INFO] + ? level : NapiLog.LEV_ERROR; + logFileName = fileName ? fileName : 'napi_generator.log'; +} + +/** + * 通过调用栈获取当前正在执行的方法名,代码行数及文件路径 + * @param {} callerFuncName 指定取调用栈中哪个方法名所在的帧作为目标帧 + * @returns + */ +NapiLog.getCallPath = function (callerFuncName = null) { + let callPath = ''; + let stackArray = new Error().stack.split('\n'); + + // 如果没有指定目标方法,默认在调用栈中查找当前方法"getCallPath"所在的帧 + let destFuncName = callerFuncName != null ? callerFuncName : 'getCallPath'; + + for (let i = stackArray.length - 1; i >= 0; --i) { + // debug模式和打包后的可执行程序调用栈函数名不同, 以NapiLog.log()方法为例: + // vscode debug模式下调用栈打印的方法名为NapiLog.log,而可执行程序的调用栈中显示为Function.log() + let callerMatch = (stackArray[i].indexOf('NapiLog.' + destFuncName) > 0 || + stackArray[i].indexOf('Function.' + destFuncName) > 0); + if (callerMatch) { + let stackMsg = stackArray[i + 1].trim(); + let leftIndex = stackMsg.indexOf('('); + let rightIndex = stackMsg.indexOf(')'); + + if (leftIndex > 0 && rightIndex > 0) { + let funInfo = stackMsg.substring(0, leftIndex); + let srcPath = stackMsg.substring(leftIndex + 1, rightIndex); + let colNumIndex = srcPath.lastIndexOf(':'); + let colNum = srcPath.substring(colNumIndex + 1, srcPath.length); + let lineNumIndex = srcPath.lastIndexOf(':', colNumIndex - 1); + let lineNum = srcPath.substring(lineNumIndex + 1, colNumIndex); + let filePath = srcPath.substring(0, lineNumIndex); + + callPath = '%s[%s(%s:%s)]'.format(funInfo, filePath, lineNum, colNum); + } + break; + } + } + + return callPath; +} + +function print(...args) { + if (vscode) { + vscode.window.showInformationMessage(...args); + } + console.log(args + ''); +} + +function recordLog(lev, ...args) { + let origMsgInfo = args; + let callPath = NapiLog.getCallPath('log'); + let dataStr = getDateString(); + let detail = args.join(' '); + saveLog(dataStr + ' ' + callPath, LEV_STR[lev], detail); + if (lev === NapiLog.LEV_ERROR) { + logResultMessage = [false, detail]; + } + let logStr = callPath + ' ' + detail; + if (logLevel <= lev) return logStr; + NapiLog.logInfo(origMsgInfo[0]); + return logStr; +} + +NapiLog.logError = function (...args) { + let logInfo = recordLog(NapiLog.LEV_ERROR, args); + print(logInfo); +}; + +NapiLog.logDebug = function (...args) { + recordLog(NapiLog.LEV_DEBUG, args); +}; + +NapiLog.logInfo = function (...args) { + recordLog(NapiLog.LEV_INFO, args); +}; + +NapiLog.getResult = function () { + return logResultMessage; +}; + +module.exports = { + NapiLog, +}; \ No newline at end of file diff --git a/src/cli/h2dts/src/tsGen/tools/re.js b/src/cli/h2dts/src/tsGen/tools/re.js new file mode 100644 index 00000000..6ee3f992 --- /dev/null +++ b/src/cli/h2dts/src/tsGen/tools/re.js @@ -0,0 +1,82 @@ +/* +* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +const path = require('path'); + +function search(ss, data) { + ss = replaceAll(ss, '\\.', '\\.'); + let reg = new RegExp(ss); + let tt = reg.exec(data); + if (tt == null) return null; + let ret = { 'regs': [] }; + for (let i = 0; i < tt.length; i++) { + let p = data.indexOf(tt[i]); + if (tt[i] == null) { + ret['regs'].push([-1, -1]); + } + else { + ret['regs'].push([p, p + tt[i].length]); + } + } + + return ret; +} + +function match(ss, data) { + let tt = search(ss, data); + if (tt !== null && tt !== undefined && tt.regs[0][0] == 0) { + return tt; + } + return null; +} + +function removeReg(data, reg) { + return data.substring(0, reg[0]) + data.substring(reg[1], data.length); +} + +function getReg(data, reg) { + return data.substring(reg[0], reg[1]); +} + +function getFileInPath(tpath) { + return path.parse(tpath).base; +} + +function getPathInPath(tpath) { + return path.parse(tpath).dir; +} + +function all(sfrom) { + return new RegExp(sfrom, 'g'); +} + +function replaceAll(ss, sfrom, sto) { + return ss.replace(all(sfrom), sto); +} + +function pathJoin(...args) { + return path.join(...args); +} + +module.exports = { + search, + match, + removeReg, + getReg, + getFileInPath, + getPathInPath, + pathJoin, + replaceAll, + all, +}; \ No newline at end of file diff --git a/src/cli/h2dts/src/tsGen/tools/tool.js b/src/cli/h2dts/src/tsGen/tools/tool.js new file mode 100644 index 00000000..708dcd29 --- /dev/null +++ b/src/cli/h2dts/src/tsGen/tools/tool.js @@ -0,0 +1,329 @@ +/* +* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ +const re = require('./re'); +let vscode = null; +try { + vscode = require('vscode'); +} +catch (err) { + vscode = null; +} + +const NUM_CONST_MAP = new Map([ + [0, 'XNapiTool::ZERO'], [1, 'XNapiTool::ONE'], [2, 'XNapiTool::TWO'], [3, 'XNapiTool::THREE'], + [4, 'XNapiTool::FOUE'], [5, 'XNapiTool::FIVE'], [6, 'XNapiTool::SIX'], [7, 'XNapiTool::SEVEN'], + [8, 'XNapiTool::EIGHT'], [9, 'XNapiTool::NINE'] +]); + +function print(...args) { + if (vscode) { + vscode.window.showInformationMessage(...args); + } + console.log(...args); +} + +String.prototype.format = function (...args) { + var result = this; + let reg = new RegExp('%[sd]{1}') + for (let i = 0; i < args.length; i++) { + let p = result.search(reg) + if (p < 0) break; + result = result.substring(0, p) + args[i] + result.substring(p + 2, result.length) + } + return result; +}; + +String.prototype.replaceAll = function (...args) { + let result = this; + while (result.indexOf(args[0]) >= 0) { + result = result.replace(args[0], args[1]); + } + return result; +}; + +function checkOutBody(body, off, flag, binside) { + off = off || 0; + flag = flag || ['{', '}']; + binside = binside || false; + let idx = { + '(': ')', + '{': '}', + '<': '>', + //'<': '<', + //'>': '>', + }; + let csl = {}; + let csr = {}; + for (let f in idx) { + csl[f] = 0; + csr[idx[f]] = 0; + } + let cs1 = 0; + if (flag[0].length > 0 && body.substring(off, off + flag[0].length) !== flag[0]) { + return null; + } + + for (let i = off + flag[0].length; i < body.length; i++) { + if (body[i] === '"') { + cs1 += 1; + } + if (cs1 % 2 === 0) { + let tb1 = getTb1(csl, csr, idx); + if (tb1 && body.substring(i, i + flag[1].length) === flag[1]) { + if (binside) { + return body.substring(off + flag[0].length, i); + } + return body.substring(off, i + flag[1].length); + } + checkOutBody2(body, i, csl, csr); + } + } + return null; +} + +function checkOutBody2(body, i, csl, csr) { + if (body[i] in csl) { + csl[body[i]] += 1; + if (body[i] in csr) { + csr[body[i]] += 1; + } + } + if (body[i] in csr) { + if (!(body[i] === '>' && body[i - 1] === '=')) { // 尖括号匹配时忽略关键字 "=>" + csr[body[i]] += 1; + } + } +} + +function getTb1(csl, csr, idx) { + let tb1 = true; + for (let k in csl) { + if (csl[k] !== csr[idx[k]]) { + tb1 = false; + break; + } + } + return tb1; +} + +function removeExplains(data) { + // 去除 /** */ 类型的注释 + while (data.indexOf('/*') >= 0) { + let i1 = data.indexOf('/*'); + let i2 = data.indexOf('*/') + 2; + data = data.substring(0, i1) + data.substring(i2, data.length); + } + + // 去除 namespace 域外 // 类型的注释 + // 如果换行格式是\r\n, 去除\r, 统一成\n格式 + while (data.indexOf('\r') >= 0) { + data = data.replace('\r', ''); + } + while (data.indexOf('//') >= 0) { + let i1 = data.indexOf('//'); + let i2 = data.indexOf('\n'); + let end = data.indexOf('declare namespace '); + while (i2 < end && i1 < end) { + while (i1 > i2) { + data = data.substring(0, i2) + data.substring(i2 + 2, data.length); + i2 = data.indexOf('\n'); + i1 = data.indexOf('//'); + } + data = data.substring(0, i1) + data.substring(i2 + 1, data.length); + i1 = data.indexOf('//'); + i2 = data.indexOf('\n'); + end = data.indexOf('declare namespace '); + } + if (i2 > end || i1 > end) { + break; + } + } + + return data; +} + +function getLicense(data) { + while (data.indexOf('/*') >= 0) { + let i1 = data.indexOf('/*'); + let i2 = data.indexOf('*/') + 2; + let licenseData = data.substring(i1, i2); + if (licenseData.search('Copyright') !== -1) { + return licenseData; + } else { + return null; + } + } +} + +function removeEmptyLine(data) { + while (data.indexOf('\r') >= 0) { + data = data.replace('\r', ''); + } + while (data.indexOf('\t') >= 0) { + data = data.replace('\t', ''); + } + while (data.indexOf(' \n') >= 0) { + data = data.replace(' \n', '\n'); + } + while (data.indexOf('\n ') >= 0) { + data = data.replace('\n ', '\n'); + } + while (data.indexOf('\n\n') >= 0) { + data = data.replace('\n\n', '\n'); + } + while (data.indexOf('\n') === 0) { + data = data.substring(1, data.length); + } + while (data.indexOf(' ') === 0) { + data = data.substring(1, data.length); + } + return data; +} + +function replaceTab(data) { + while (data.indexOf('\t') >= 0) { + data = data.replace('\t', ' '); + } + return data; +} + +function removeEmptyLine2(data) { + while (data.indexOf(' \n')); + data = data.replace(' \n', '\n'); + while (data.indexOf('\n\n\n')); + data = data.replace('\n\n\n', '\n\n'); + return data; +} + +function replaceAll(s, sfrom, sto) { + while (s.indexOf(sfrom) >= 0) { + s = s.replace(sfrom, sto); + } + return s; +} + +/** + * 比较两个方法是否完全相同 + * @param func1 方法1 + * @param func2 方法2 + * @returns 方法名称与形参是否完全相同 + */ +function isSameFunc(func1, func2) { + if (func1.name !== func2.name) { // 判断方法名称是否相同 + return false; + } + + let func1ParamCount = func1.value.length; + if (func1ParamCount !== func2.value.length) { // 判断方法形参个数是否一样 + return false; + } + + for (let i in func1.value) { // 判断方法每个形参数据类型是否相同 + if (func1.value[i].type !== func2.value[i].type) { + if (!(func1.value[i].type.indexOf('NUMBER_TYPE_') >= 0 && + func2.value[i].type.indexOf('NUMBER_TYPE_') >= 0)) { + return false; + } + } + } + + // 以上全部相同,判定为相同方法 + return true; +} + +/** + * 将方法对象插入列表(重复的方法对象不插入) + * @param obj 待插入的方法对象 + * @param list 目标列表 + * @returns 是否成功插入列表 + */ +function addUniqFunc2List(obj, list) { + for (let i in list) { + if (isSameFunc(obj, list[i])) { + return false; + } + } + list.push(obj); + return true; +} + +/** + * 找到子类中重写父类的方法并将它设置为override + * @param parentFunc 父类被重写的方法名 + * @param childFunclist 子类全部方法列表 + * @returns void + */ +function setOverrideFunc(parentFunc, childFunclist) { + for (let i in childFunclist) { + if (isSameFunc(parentFunc, childFunclist[i])) { + childFunclist[i].isOverride = true; + return; + } + } +} + +/** + * 将对象插入列表(名称重复的属性对象不插入) + * @param obj 待插入的对象 + * @param list 目标列表 + * @returns void + */ +function addUniqObj2List(obj, list) { + for (let i in list) { + if (list[i].name === obj.name) { + return; + } + } + list.push(obj); +} + +/** + * 如果方法所在的类为基类,生成的c++函数定义为虚函数 + * @param data 方法所在的类信息 + * @param funcInfo 方法信息 + * return tabStr 缩进,staticStr 静态函数关键词,virtualStr 虚函数关键词, overrideStr 重写关键词 + */ +function getPrefix(data, funcInfo) { + let isStatic = funcInfo.isStatic; + let tabStr = ''; + let virtualStr = ''; + let staticStr = isStatic ? 'static ' : ''; + if (data.childList) { + tabStr = ' ' // 类中的方法增加一个缩进 + virtualStr = (data.childList.length > 0 && !isStatic) ? 'virtual ' : '' //如果是基类中的非静态方法,定义为虚函数 + } + let overrideStr = funcInfo.isOverride ? ' override' : '' // 重写了父类方法,需要加上override关键字,否则触发c++门禁告警 + return [tabStr, staticStr, virtualStr, overrideStr]; +} + +function getConstNum(num) { + return NUM_CONST_MAP.get(parseInt(num)); +} + +module.exports = { + checkOutBody, + removeExplains, + removeEmptyLine, + removeEmptyLine2, + replaceAll, + print, + getLicense, + replaceTab, + addUniqObj2List, + addUniqFunc2List, + getPrefix, + getConstNum, + setOverrideFunc, +}; diff --git a/src/cli/h2dts/src/tsGen/tsMain.js b/src/cli/h2dts/src/tsGen/tsMain.js index ee77776d..cb35d70b 100644 --- a/src/cli/h2dts/src/tsGen/tsMain.js +++ b/src/cli/h2dts/src/tsGen/tsMain.js @@ -12,10 +12,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const { NapiLog } = require('../gen/tools/NapiLog'); -const { writeFile } = require('../gen/tools/FileRW'); +const { NapiLog } = require('./tools/NapiLog'); +const { writeFile } = require('./tools/FileRW'); const path = require('path'); -const re = require('../gen/tools/re'); +const re = require('./tools/re'); const fs = require('fs'); const os = require('os'); -- Gitee From c9cdbeee5d9ca44cea71e7305b8f8f030c695038 Mon Sep 17 00:00:00 2001 From: gou-jingjing Date: Mon, 15 Jul 2024 09:19:59 +0800 Subject: [PATCH 3/4] fix codecheck Signed-off-by: gou-jingjing --- src/cli/h2dts/src/tsGen/cmd_gen.js | 18 +- src/cli/h2dts/src/tsGen/tools/FileRW.js | 30 +-- src/cli/h2dts/src/tsGen/tools/NapiLog.js | 8 +- src/cli/h2dts/src/tsGen/tools/re.js | 10 +- src/cli/h2dts/src/tsGen/tools/tool.js | 329 ----------------------- 5 files changed, 42 insertions(+), 353 deletions(-) delete mode 100644 src/cli/h2dts/src/tsGen/tools/tool.js diff --git a/src/cli/h2dts/src/tsGen/cmd_gen.js b/src/cli/h2dts/src/tsGen/cmd_gen.js index 2327c65f..5c3a4c56 100644 --- a/src/cli/h2dts/src/tsGen/cmd_gen.js +++ b/src/cli/h2dts/src/tsGen/cmd_gen.js @@ -18,7 +18,6 @@ const { NapiLog } = require('./tools/NapiLog'); const path = require('path'); const stdio = require('stdio'); var fs = require('fs'); -const { print } = require('./tools/tool'); let ops = stdio.getopt({ 'filename': { key: 'f', args: 1, description: '.d.ts file', default: '' }, @@ -28,7 +27,15 @@ let ops = stdio.getopt({ 'tsGen':{key: 't', args: 1, description: 'enable or disable generate typescript file', default: false }, }); -NapiLog.init(ops.loglevel, path.join("" + ops.out, "napi_gen.log")); +let vscode = null; +try { + vscode = require('vscode'); +} +catch (err) { + vscode = null; +} + +NapiLog.init(ops.loglevel, path.join('' + ops.out, 'napi_gen.log')); let fileNames = ops.filename; var pathDir = ops.directory; @@ -40,6 +47,13 @@ if (fileNames == null && pathDir == null) { readFiles(); } +function print(...args) { + if (vscode) { + vscode.window.showInformationMessage(...args); + } + console.log(...args); +} + function readFiles() { fileNames = fileNames.replace(/(^\s*)|(\s*$)/g, ''); // trim before and after espace let regex = ','; diff --git a/src/cli/h2dts/src/tsGen/tools/FileRW.js b/src/cli/h2dts/src/tsGen/tools/FileRW.js index 8f202d87..648b6918 100644 --- a/src/cli/h2dts/src/tsGen/tools/FileRW.js +++ b/src/cli/h2dts/src/tsGen/tools/FileRW.js @@ -18,7 +18,7 @@ function utf8ArrayToStr(array) { var out, i, len, c; var char2, char3; - out = ""; + out = ''; len = array.length; i = 0; while (i < len) { @@ -53,15 +53,15 @@ function stringToUint8Array(string, options = { stream: false }) { } let pos = 0; const len = string.length; - let at = 0; // output position - let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size - let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset + let at = 0; // output position + let tlen = Math.max(32, len + (len >> 1) + 7); // 1.5x size + let target = new Uint8Array((tlen >> 3) << 3); // ... but at 8 byte offset while (pos < len) { let value = string.charCodeAt(pos++); let isContinue = false; if (value >= 0xd800 && value <= 0xdbff) { - if (pos < len) {// high surrogate + if (pos < len) { // high surrogate const extra = string.charCodeAt(pos); if ((extra & 0xfc00) === 0xdc00) { ++pos; @@ -69,16 +69,16 @@ function stringToUint8Array(string, options = { stream: false }) { } } if (value >= 0xd800 && value <= 0xdbff) { - isContinue = true; // drop lone surrogate + isContinue = true; // drop lone surrogate } } if (!isContinue) { // expand the buffer if we couldn't write 4 bytes if (at + 4 > target.length) { - tlen += 8; // minimum extra - tlen *= (1.0 + (pos / string.length) * 2); // take 2x the remaining - tlen = (tlen >> 3) << 3; // 8 byte offset + tlen += 8; // minimum extra + tlen *= (1.0 + (pos / string.length) * 2); // take 2x the remaining + tlen = (tlen >> 3) << 3; // 8 byte offset target = uint8Array(tlen, target); } @@ -94,15 +94,15 @@ function stringToUint8Array(string, options = { stream: false }) { function calculate(value, target, at) { let isContinue = false; - if ((value & 0xffffff80) === 0) { // 1-byte - target[at++] = value; // ASCII + if ((value & 0xffffff80) === 0) { // 1-byte + target[at++] = value; // ASCII isContinue = true; - } else if ((value & 0xfffff800) === 0) { // 2-byte + } else if ((value & 0xfffff800) === 0) { // 2-byte target[at++] = ((value >> 6) & 0x1f) | 0xc0; - } else if ((value & 0xffff0000) === 0) { // 3-byte + } else if ((value & 0xffff0000) === 0) { // 3-byte target[at++] = ((value >> 12) & 0x0f) | 0xe0; target[at++] = ((value >> 6) & 0x3f) | 0x80; - } else if ((value & 0xffe00000) === 0) { // 4-byte + } else if ((value & 0xffe00000) === 0) { // 4-byte target[at++] = ((value >> 18) & 0x07) | 0xf0; target[at++] = ((value >> 12) & 0x3f) | 0x80; target[at++] = ((value >> 6) & 0x3f) | 0x80; @@ -123,7 +123,7 @@ function uint8Array(tlen, target) { function readFile(fn) { if (!fs.existsSync(fn)) { - return ""; + return ''; } let data = fs.readFileSync(fn); data = utf8ArrayToStr(data); diff --git a/src/cli/h2dts/src/tsGen/tools/NapiLog.js b/src/cli/h2dts/src/tsGen/tools/NapiLog.js index b35db3cf..634fd017 100644 --- a/src/cli/h2dts/src/tsGen/tools/NapiLog.js +++ b/src/cli/h2dts/src/tsGen/tools/NapiLog.js @@ -52,7 +52,7 @@ NapiLog.init = function (level, fileName) { logLevel = level in [NapiLog.LEV_NONE, NapiLog.LEV_ERROR, NapiLog.LEV_DEBUG, NapiLog.LEV_INFO] ? level : NapiLog.LEV_ERROR; logFileName = fileName ? fileName : 'napi_generator.log'; -} +}; /** * 通过调用栈获取当前正在执行的方法名,代码行数及文件路径 @@ -92,7 +92,7 @@ NapiLog.getCallPath = function (callerFuncName = null) { } return callPath; -} +}; function print(...args) { if (vscode) { @@ -111,7 +111,9 @@ function recordLog(lev, ...args) { logResultMessage = [false, detail]; } let logStr = callPath + ' ' + detail; - if (logLevel <= lev) return logStr; + if (logLevel <= lev) { + return logStr; + } NapiLog.logInfo(origMsgInfo[0]); return logStr; } diff --git a/src/cli/h2dts/src/tsGen/tools/re.js b/src/cli/h2dts/src/tsGen/tools/re.js index 6ee3f992..5bb9dc27 100644 --- a/src/cli/h2dts/src/tsGen/tools/re.js +++ b/src/cli/h2dts/src/tsGen/tools/re.js @@ -18,15 +18,17 @@ function search(ss, data) { ss = replaceAll(ss, '\\.', '\\.'); let reg = new RegExp(ss); let tt = reg.exec(data); - if (tt == null) return null; + if (tt == null) { + return null; + } let ret = { 'regs': [] }; for (let i = 0; i < tt.length; i++) { let p = data.indexOf(tt[i]); if (tt[i] == null) { - ret['regs'].push([-1, -1]); + ret.regs.push([-1, -1]); } else { - ret['regs'].push([p, p + tt[i].length]); + ret.regs.push([p, p + tt[i].length]); } } @@ -35,7 +37,7 @@ function search(ss, data) { function match(ss, data) { let tt = search(ss, data); - if (tt !== null && tt !== undefined && tt.regs[0][0] == 0) { + if (tt !== null && tt !== undefined && tt.regs[0][0] === 0) { return tt; } return null; diff --git a/src/cli/h2dts/src/tsGen/tools/tool.js b/src/cli/h2dts/src/tsGen/tools/tool.js deleted file mode 100644 index 708dcd29..00000000 --- a/src/cli/h2dts/src/tsGen/tools/tool.js +++ /dev/null @@ -1,329 +0,0 @@ -/* -* Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd. -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -*/ -const re = require('./re'); -let vscode = null; -try { - vscode = require('vscode'); -} -catch (err) { - vscode = null; -} - -const NUM_CONST_MAP = new Map([ - [0, 'XNapiTool::ZERO'], [1, 'XNapiTool::ONE'], [2, 'XNapiTool::TWO'], [3, 'XNapiTool::THREE'], - [4, 'XNapiTool::FOUE'], [5, 'XNapiTool::FIVE'], [6, 'XNapiTool::SIX'], [7, 'XNapiTool::SEVEN'], - [8, 'XNapiTool::EIGHT'], [9, 'XNapiTool::NINE'] -]); - -function print(...args) { - if (vscode) { - vscode.window.showInformationMessage(...args); - } - console.log(...args); -} - -String.prototype.format = function (...args) { - var result = this; - let reg = new RegExp('%[sd]{1}') - for (let i = 0; i < args.length; i++) { - let p = result.search(reg) - if (p < 0) break; - result = result.substring(0, p) + args[i] + result.substring(p + 2, result.length) - } - return result; -}; - -String.prototype.replaceAll = function (...args) { - let result = this; - while (result.indexOf(args[0]) >= 0) { - result = result.replace(args[0], args[1]); - } - return result; -}; - -function checkOutBody(body, off, flag, binside) { - off = off || 0; - flag = flag || ['{', '}']; - binside = binside || false; - let idx = { - '(': ')', - '{': '}', - '<': '>', - //'<': '<', - //'>': '>', - }; - let csl = {}; - let csr = {}; - for (let f in idx) { - csl[f] = 0; - csr[idx[f]] = 0; - } - let cs1 = 0; - if (flag[0].length > 0 && body.substring(off, off + flag[0].length) !== flag[0]) { - return null; - } - - for (let i = off + flag[0].length; i < body.length; i++) { - if (body[i] === '"') { - cs1 += 1; - } - if (cs1 % 2 === 0) { - let tb1 = getTb1(csl, csr, idx); - if (tb1 && body.substring(i, i + flag[1].length) === flag[1]) { - if (binside) { - return body.substring(off + flag[0].length, i); - } - return body.substring(off, i + flag[1].length); - } - checkOutBody2(body, i, csl, csr); - } - } - return null; -} - -function checkOutBody2(body, i, csl, csr) { - if (body[i] in csl) { - csl[body[i]] += 1; - if (body[i] in csr) { - csr[body[i]] += 1; - } - } - if (body[i] in csr) { - if (!(body[i] === '>' && body[i - 1] === '=')) { // 尖括号匹配时忽略关键字 "=>" - csr[body[i]] += 1; - } - } -} - -function getTb1(csl, csr, idx) { - let tb1 = true; - for (let k in csl) { - if (csl[k] !== csr[idx[k]]) { - tb1 = false; - break; - } - } - return tb1; -} - -function removeExplains(data) { - // 去除 /** */ 类型的注释 - while (data.indexOf('/*') >= 0) { - let i1 = data.indexOf('/*'); - let i2 = data.indexOf('*/') + 2; - data = data.substring(0, i1) + data.substring(i2, data.length); - } - - // 去除 namespace 域外 // 类型的注释 - // 如果换行格式是\r\n, 去除\r, 统一成\n格式 - while (data.indexOf('\r') >= 0) { - data = data.replace('\r', ''); - } - while (data.indexOf('//') >= 0) { - let i1 = data.indexOf('//'); - let i2 = data.indexOf('\n'); - let end = data.indexOf('declare namespace '); - while (i2 < end && i1 < end) { - while (i1 > i2) { - data = data.substring(0, i2) + data.substring(i2 + 2, data.length); - i2 = data.indexOf('\n'); - i1 = data.indexOf('//'); - } - data = data.substring(0, i1) + data.substring(i2 + 1, data.length); - i1 = data.indexOf('//'); - i2 = data.indexOf('\n'); - end = data.indexOf('declare namespace '); - } - if (i2 > end || i1 > end) { - break; - } - } - - return data; -} - -function getLicense(data) { - while (data.indexOf('/*') >= 0) { - let i1 = data.indexOf('/*'); - let i2 = data.indexOf('*/') + 2; - let licenseData = data.substring(i1, i2); - if (licenseData.search('Copyright') !== -1) { - return licenseData; - } else { - return null; - } - } -} - -function removeEmptyLine(data) { - while (data.indexOf('\r') >= 0) { - data = data.replace('\r', ''); - } - while (data.indexOf('\t') >= 0) { - data = data.replace('\t', ''); - } - while (data.indexOf(' \n') >= 0) { - data = data.replace(' \n', '\n'); - } - while (data.indexOf('\n ') >= 0) { - data = data.replace('\n ', '\n'); - } - while (data.indexOf('\n\n') >= 0) { - data = data.replace('\n\n', '\n'); - } - while (data.indexOf('\n') === 0) { - data = data.substring(1, data.length); - } - while (data.indexOf(' ') === 0) { - data = data.substring(1, data.length); - } - return data; -} - -function replaceTab(data) { - while (data.indexOf('\t') >= 0) { - data = data.replace('\t', ' '); - } - return data; -} - -function removeEmptyLine2(data) { - while (data.indexOf(' \n')); - data = data.replace(' \n', '\n'); - while (data.indexOf('\n\n\n')); - data = data.replace('\n\n\n', '\n\n'); - return data; -} - -function replaceAll(s, sfrom, sto) { - while (s.indexOf(sfrom) >= 0) { - s = s.replace(sfrom, sto); - } - return s; -} - -/** - * 比较两个方法是否完全相同 - * @param func1 方法1 - * @param func2 方法2 - * @returns 方法名称与形参是否完全相同 - */ -function isSameFunc(func1, func2) { - if (func1.name !== func2.name) { // 判断方法名称是否相同 - return false; - } - - let func1ParamCount = func1.value.length; - if (func1ParamCount !== func2.value.length) { // 判断方法形参个数是否一样 - return false; - } - - for (let i in func1.value) { // 判断方法每个形参数据类型是否相同 - if (func1.value[i].type !== func2.value[i].type) { - if (!(func1.value[i].type.indexOf('NUMBER_TYPE_') >= 0 && - func2.value[i].type.indexOf('NUMBER_TYPE_') >= 0)) { - return false; - } - } - } - - // 以上全部相同,判定为相同方法 - return true; -} - -/** - * 将方法对象插入列表(重复的方法对象不插入) - * @param obj 待插入的方法对象 - * @param list 目标列表 - * @returns 是否成功插入列表 - */ -function addUniqFunc2List(obj, list) { - for (let i in list) { - if (isSameFunc(obj, list[i])) { - return false; - } - } - list.push(obj); - return true; -} - -/** - * 找到子类中重写父类的方法并将它设置为override - * @param parentFunc 父类被重写的方法名 - * @param childFunclist 子类全部方法列表 - * @returns void - */ -function setOverrideFunc(parentFunc, childFunclist) { - for (let i in childFunclist) { - if (isSameFunc(parentFunc, childFunclist[i])) { - childFunclist[i].isOverride = true; - return; - } - } -} - -/** - * 将对象插入列表(名称重复的属性对象不插入) - * @param obj 待插入的对象 - * @param list 目标列表 - * @returns void - */ -function addUniqObj2List(obj, list) { - for (let i in list) { - if (list[i].name === obj.name) { - return; - } - } - list.push(obj); -} - -/** - * 如果方法所在的类为基类,生成的c++函数定义为虚函数 - * @param data 方法所在的类信息 - * @param funcInfo 方法信息 - * return tabStr 缩进,staticStr 静态函数关键词,virtualStr 虚函数关键词, overrideStr 重写关键词 - */ -function getPrefix(data, funcInfo) { - let isStatic = funcInfo.isStatic; - let tabStr = ''; - let virtualStr = ''; - let staticStr = isStatic ? 'static ' : ''; - if (data.childList) { - tabStr = ' ' // 类中的方法增加一个缩进 - virtualStr = (data.childList.length > 0 && !isStatic) ? 'virtual ' : '' //如果是基类中的非静态方法,定义为虚函数 - } - let overrideStr = funcInfo.isOverride ? ' override' : '' // 重写了父类方法,需要加上override关键字,否则触发c++门禁告警 - return [tabStr, staticStr, virtualStr, overrideStr]; -} - -function getConstNum(num) { - return NUM_CONST_MAP.get(parseInt(num)); -} - -module.exports = { - checkOutBody, - removeExplains, - removeEmptyLine, - removeEmptyLine2, - replaceAll, - print, - getLicense, - replaceTab, - addUniqObj2List, - addUniqFunc2List, - getPrefix, - getConstNum, - setOverrideFunc, -}; -- Gitee From e6b557d2cdfbcb286796ea81dfdfe1357d5aed02 Mon Sep 17 00:00:00 2001 From: gou-jingjing Date: Mon, 15 Jul 2024 10:43:17 +0800 Subject: [PATCH 4/4] fix h2dts bugs Signed-off-by: gou-jingjing --- src/cli/h2dts/src/tsGen/cmd_gen.js | 5 +++-- src/cli/h2dts/src/tsGen/tools/NapiLog.js | 4 +++- src/cli/h2dts/src/tsGen/tsMain.js | 15 ++++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/cli/h2dts/src/tsGen/cmd_gen.js b/src/cli/h2dts/src/tsGen/cmd_gen.js index 5c3a4c56..88422f13 100644 --- a/src/cli/h2dts/src/tsGen/cmd_gen.js +++ b/src/cli/h2dts/src/tsGen/cmd_gen.js @@ -18,6 +18,7 @@ const { NapiLog } = require('./tools/NapiLog'); const path = require('path'); const stdio = require('stdio'); var fs = require('fs'); +const util = require('util'); let ops = stdio.getopt({ 'filename': { key: 'f', args: 1, description: '.d.ts file', default: '' }, @@ -71,7 +72,7 @@ function readFiles() { function handleDirFiles(files) { if (0 === files.length) { - NapiLog.logInfo('[Func: readDirFiles] No files in path %s!'.format(pathDir)); + NapiLog.logInfo(util.format('[Func: readDirFiles] No files in path %s!', pathDir)); return; } (function iterator(i) { @@ -100,7 +101,7 @@ function readDirFiles() { } function checkGenerate(fileName) { - NapiLog.logInfo('check file []'.format(fileName)); + NapiLog.logInfo(util.format('check file []', fileName)); let suffix = fileName.split('.').pop().toLowerCase(); if (suffix === 'h') { NapiLog.logInfo('convert .h file to .ts file...'); diff --git a/src/cli/h2dts/src/tsGen/tools/NapiLog.js b/src/cli/h2dts/src/tsGen/tools/NapiLog.js index 634fd017..135741d3 100644 --- a/src/cli/h2dts/src/tsGen/tools/NapiLog.js +++ b/src/cli/h2dts/src/tsGen/tools/NapiLog.js @@ -14,6 +14,8 @@ */ const fs = require('fs'); const path = require('path'); +const util = require('util'); + let vscode = null; try { vscode = require('vscode'); @@ -85,7 +87,7 @@ NapiLog.getCallPath = function (callerFuncName = null) { let lineNum = srcPath.substring(lineNumIndex + 1, colNumIndex); let filePath = srcPath.substring(0, lineNumIndex); - callPath = '%s[%s(%s:%s)]'.format(funInfo, filePath, lineNum, colNum); + callPath = util.format('%s[%s(%s:%s)]', funInfo, filePath, lineNum, colNum); } break; } diff --git a/src/cli/h2dts/src/tsGen/tsMain.js b/src/cli/h2dts/src/tsGen/tsMain.js index cb35d70b..23e1e88f 100644 --- a/src/cli/h2dts/src/tsGen/tsMain.js +++ b/src/cli/h2dts/src/tsGen/tsMain.js @@ -18,6 +18,7 @@ const path = require('path'); const re = require('./tools/re'); const fs = require('fs'); const os = require('os'); +const util = require('util'); function parseFileAll(hFilePath) { let execSync = require('child_process').execSync; @@ -132,7 +133,7 @@ function getJsTypeFromC(cType, typeInfo) { } let jsType = basicC2js(basicCtype); if (typeInfo.array) { - jsType = 'Array<%s>'.format(jsType); + jsType = util.format('Array<%s>', jsType); } return jsType; } @@ -188,7 +189,7 @@ function putFuncIntoNamespace(funcInfo, namespaces) { return; } } - NapiLog.logError('The namespace [%s] of function %s is not found.'.format(funcInfo.namespace, funcInfo.name)); + NapiLog.logError(util.format('The namespace [%s] of function %s is not found.', funcInfo.namespace, funcInfo.name)); } function analyzeRootFunction(rootInfo, parseResult) { @@ -248,7 +249,7 @@ function putClassIntoNamespace(classInfo, namespaces) { return; } } - NapiLog.logError('The namespace [%s] of class %s is not found.'.format(classInfo.namespace, classInfo.name)); + NapiLog.logError(util.format('The namespace [%s] of class %s is not found.', classInfo.namespace, classInfo.name)); } function analyzeClasses(rootInfo, parseResult) { @@ -283,7 +284,7 @@ function genFunction(func, tabLv, needDeclare = false) { funcParams += func.params[i].name + ': ' + func.params[i].type; } let declareStr = needDeclare ? 'declare ' : ''; - return '%s%s%s%s%s(%s): %s;\n'.format(tab, declareStr, funcPrefix, func.static, func.name, funcParams, func.retType); + return util.format('%s%s%s%s%s(%s): %s;\n', tab, declareStr, funcPrefix, func.static, func.name, funcParams, func.retType); } function genClass(classInfo, tabLv, needDeclare = false) { @@ -292,7 +293,7 @@ function genClass(classInfo, tabLv, needDeclare = false) { let tsClass = tab + declareStr + 'class ' + classInfo.name + ' {\n'; let tab1 = getTab(tabLv + 1); for (var i = 0; i < classInfo.properties.length; ++i) { - tsClass += '%s%s: %s;\n'.format(tab1, classInfo.properties[i].name, classInfo.properties[i].type); + tsClass += util.format('%s%s: %s;\n', tab1, classInfo.properties[i].name, classInfo.properties[i].type); } for (var i = 0; i < classInfo.functions.length; ++i) { tsClass += genFunction(classInfo.functions[i], tabLv + 1); @@ -303,7 +304,7 @@ function genClass(classInfo, tabLv, needDeclare = false) { function genNamespace(namespace, tabLv) { let tab = getTab(tabLv); - let tsNamespace = tab + 'declare namespace %s {\n'.format(namespace.name); + let tsNamespace = tab + util.format('declare namespace %s {\n', namespace.name); for (var i = 0; i < namespace.functions.length; ++i) { tsNamespace += genFunction(namespace.functions[i], tabLv + 1); } @@ -331,7 +332,7 @@ function genTsContent(rootInfo) { if (rootInfo.namespaces.length > 0) { // export the first namespace as default - tsContent += '\nexport default %s;'.format(rootInfo.namespaces[0].name); + tsContent += util.format('\nexport default %s;', rootInfo.namespaces[0].name); } return tsContent; -- Gitee