diff --git a/src/vscode_plugin/package.json b/src/vscode_plugin/package.json index 476386296cfb456878bc2b49b0961fed3335c408..c2eeda75c5fcfede1a5981892094ec986205c0a5 100644 --- a/src/vscode_plugin/package.json +++ b/src/vscode_plugin/package.json @@ -10,7 +10,8 @@ "vscode": "^1.34.0" }, "categories": [ - "Other" + "Other", + "Snippets" ], "activationEvents": [ "onCommand:extension.h2dts", @@ -106,7 +107,12 @@ "group": "2_workspace" } ] - } + "snippets": [ + { + "language": "cpp", + "path": "./snippets/napi_class_snippets.json" + } + ] }, "scripts": { "vscode:prepublish": "npm run compile", diff --git a/src/vscode_plugin/snippets/napi_class_snippets.json b/src/vscode_plugin/snippets/napi_class_snippets.json new file mode 100644 index 0000000000000000000000000000000000000000..a5c03b409eb826e85658ddb8ae125cd587eb10f7 --- /dev/null +++ b/src/vscode_plugin/snippets/napi_class_snippets.json @@ -0,0 +1,83 @@ +{ + "Napi Class": { + "prefix": "napiclass", + "body": [ + "class HelloWorld {", + " public:", + " static napi_value Init(napi_env env, napi_value exports);", + " static void Destructor(napi_env env, void* nativeObject, void* finalize_hint);", + " private:", + " explicit HelloWorld();", + " ~HelloWorld();", + " static napi_value New(napi_env env, napi_callback_info info);", + " static napi_value GetValue(napi_env env, napi_callback_info info);", + " static napi_value SetValue(napi_env env, napi_callback_info info);", + " static napi_value Hello(napi_env env, napi_callback_info info);", + " std::string value_;", + " napi_env env_;", + " napi_ref wrapper_;", + "};", + "HelloWorld::HelloWorld(): value_(\"\"), env_(nullptr), wrapper_(nullptr) {}", + "HelloWorld::~HelloWorld() { napi_delete_reference(env_, wrapper_); }", + "void HelloWorld::Destructor(napi_env env, void* nativeObject, [[maybe_unused]] void* finalize_hint)", + "{", + " reinterpret_cast(nativeObject)->~HelloWorld();", + "}", + "napi_value HelloWorld::New(napi_env env, napi_callback_info info)", + "{", + " napi_value newTarget;", + " // Check if the constructor was invoked with new.", + " napi_get_new_target(env, info, &newTarget);", + " if (newTarget != nullptr) {", + " // Invoked as the constructor `new HelloWorld()`.", + " napi_value jsThis;", + " // Retrieve the callback's context and arguments.", + " napi_get_cb_info(env, info, nullptr, nullptr, &jsThis, nullptr);", + " HelloWorld* obj = new HelloWorld();", + " obj->env_ = env;", + " // Wrap the C++ object obj in the ArkTS object jsThis.", + " napi_wrap(env, jsThis, reinterpret_cast(obj), HelloWorld::Destructor, nullptr, &obj->wrapper_);", + " return jsThis;", + " } else {", + " OH_LOG_ERROR(LOG_APP, \"HelloWorld must be invoked as a constructor with `new`\");", + " return nullptr;", + " }", + "}", + "napi_value HelloWorld::GetValue(napi_env env, napi_callback_info info)", + "{", + " // Todo: you can use \"napiobjectin\" command that get object param from js.", + " HelloWorld* obj;", + " // Retrieve obj (the C++ object) previously wrapped in jsThis (the ArkTS object), and perform subsequent operations.", + " napi_unwrap(env, jsThis, reinterpret_cast(&obj));", + " // Todo: you can use \"napistringutf8out\" command that return string utf8 value to js.", + "}", + "napi_value HelloWorld::SetValue(napi_env env, napi_callback_info info)", + "{", + " // Todo: you can use \"napiobjectin\" command that get object param from js.", + " HelloWorld* obj;", + " napi_unwrap(env, jsThis, reinterpret_cast(&obj));", + " // Todo: you can use \"napistringutf8in\" command that get string utf8 param from js.", + " return nullptr;", + "}", + "napi_value HelloWorld::Hello(napi_env env, napi_callback_info info)", + "{", + " OH_LOG_INFO(LOG_APP, \"HelloWorld::Hello World!\");", + " return nullptr;", + "}", + "napi_value HelloWorld::Init(napi_env env, napi_value exports)", + "{", + " // Define properties and methods for a N-API object", + " napi_property_descriptor properties[] = {", + " { \"value\", 0, 0, GetValue, SetValue, 0, napi_default, 0 },", + " { \"hello\", nullptr, Hello, nullptr, nullptr, nullptr, napi_default, nullptr }", + " };", + " napi_value cons;", + " // Define a js class", + " napi_define_class(env, \"HelloWorld\", NAPI_AUTO_LENGTH, New, nullptr, 2, properties, &cons);", + " // Set the 'HelloWorld' class on the exports object.", + " napi_set_named_property(env, exports, \"HelloWorld\", cons);", + " return exports;", + "}" + ] + } +} \ No newline at end of file