diff --git a/src/vscode_plugin/l10n/bundle.l10n.zh-cn.json b/src/vscode_plugin/l10n/bundle.l10n.zh-cn.json new file mode 100644 index 0000000000000000000000000000000000000000..68db9450f3f92bfca145b1597e504beea7589989 --- /dev/null +++ b/src/vscode_plugin/l10n/bundle.l10n.zh-cn.json @@ -0,0 +1,18 @@ +{ + "Hdf Framework": "Hdf框架", + "SystemAbility Framework": "SystemAbility框架", + "N-API Framework": "N-API框架", + "Please input serviceId like 19000...": "请输入serviceId... 如: 19000", + "Input cannot be empty": "输入不能为空", + "Please input a number...": "请输入一个数字", + "Inconsistent input": "所选项与输入不一致", + "Please select the version...": "请选择版本...", + "Please select framework...": "请选择框架...", + "Please confirm your selection...": "请确认您的选择...", + "Open in Explorer": "在浏览器中打开", + "Parse complete.": "转换完成", + "Generation complete:": "生成完成", + "You selected a directory:": "您选择了一个目录", + "Please select a directory.": "请选择一个目录", + "No resource selected.": "未选择资源" +} \ No newline at end of file diff --git a/src/vscode_plugin/package.json b/src/vscode_plugin/package.json index 09955203c719de7a341a42f0e70720b2566b389a..476386296cfb456878bc2b49b0961fed3335c408 100644 --- a/src/vscode_plugin/package.json +++ b/src/vscode_plugin/package.json @@ -21,6 +21,7 @@ "onCommand:extension.h2hdf" ], "main": "./out/extension.js", + "l10n":"./l10n", "contributes": { "commands": [ { @@ -46,9 +47,19 @@ }, { "command": "extension.ohcrosscompile", - "title": "OH_CrossCompile" + "title": "%extension.ohcrosscompile.title%" + }, + { + "command": "extension.ohGenerator", + "title": "%extension.ohGenerator.title%" } ], + "viewsWelcome": [ + { + "view": "workbench.explorer.emptyView", + "contents": "%Generate NAPI definition code and framework code for OpenHarmony. \n[OHGenerator](command:extension.ohGenerator)%" + } + ], "submenus": [ { "id": "gen-menulist", @@ -112,6 +123,7 @@ }, "dependencies": { "vsce": "^2.15.0", - "typescript": "^4.7.2" + "typescript": "^4.7.2", + "@vscode/l10n": "^0.0.10" } } diff --git a/src/vscode_plugin/package.nls.json b/src/vscode_plugin/package.nls.json index 755d019063b9c68a087a9c2b8d7d4a2544f3c85f..47b1df827c7eb924cd55bde092206f350c839301 100644 --- a/src/vscode_plugin/package.nls.json +++ b/src/vscode_plugin/package.nls.json @@ -1,7 +1,10 @@ { - "extension.h2sa.title": "h2sa", + "extension.h2sa.title": "h2sa", "extension.h2hdf.title": "h2hdf", - "extension.h2dts.title": "h2dts", + "extension.h2dts.title": "h2dts", "extension.h2dtscpp.title": "h2dtscpp", - "extension.dts2cpp.title": "dts2cpp" + "extension.dts2cpp.title": "dts2cpp", + "extension.ohGenerator.title": "OHGenerator", + "extension.ohcrosscompile.title": "OH_CrossCompile", + "Generate NAPI definition code and framework code for OpenHarmony. \n[OHGenerator](command:extension.ohGenerator)": "Generate NAPI definition code and framework code for OpenHarmony. \n[OHGenerator](command:extension.ohGenerator)" } \ No newline at end of file diff --git a/src/vscode_plugin/package.nls.zh-cn.json b/src/vscode_plugin/package.nls.zh-cn.json new file mode 100644 index 0000000000000000000000000000000000000000..ebc93369a1db4f7fdd9307de3a2f28c7cd4e18e6 --- /dev/null +++ b/src/vscode_plugin/package.nls.zh-cn.json @@ -0,0 +1,10 @@ +{ + "extension.h2sa.title": "h2sa", + "extension.h2hdf.title": "h2hdf", + "extension.h2dts.title": "h2dts", + "extension.h2dtscpp.title": "h2dtscpp", + "extension.dts2cpp.title": "dts2cpp", + "extension.ohGenerator.title": "OHGenerator", + "extension.ohcrosscompile.title": "OH_CrossCompile", + "Generate NAPI definition code and framework code for OpenHarmony. \n[OHGenerator](command:extension.ohGenerator)": "为OpenHarmony生成NAPI定义和框架代码。 \n[OHGenerator](command:extension.ohGenerator)" +} \ No newline at end of file diff --git a/src/vscode_plugin/src/extension.ts b/src/vscode_plugin/src/extension.ts index 4368a84ed0e87b11cb6c4a562455a791ff8bca6a..8efd6bfb8aa94df79f5c792bb19d899194df1c5b 100644 --- a/src/vscode_plugin/src/extension.ts +++ b/src/vscode_plugin/src/extension.ts @@ -26,6 +26,25 @@ import { genDtsFile } from './gendts'; import { genHdfFile } from './genhdf'; import { genDtsCppFile } from './gendtscpp'; +// ȡػַ +const SELECTED_DIR = vscode.l10n.t('You selected a directory:'); +const SELECTE_DIR = vscode.l10n.t('Please select a directory.'); +const NO_RES_SELECTED = vscode.l10n.t('No resource selected.'); +const HDF_FRAMEWORK = vscode.l10n.t('Hdf Framework'); +const SA_FRAMEWORK = vscode.l10n.t('SystemAbility Framework'); +const NAPI_FRAMEWORK = vscode.l10n.t('N-API Framework'); +const SELECT_VERSION = vscode.l10n.t('Please select the version...'); +const INPUT_SERVICEID = vscode.l10n.t('Please input serviceId like 19000...'); +const INPUT_NO_EMPTY = vscode.l10n.t('Input cannot be empty'); +const INPUT_NUMBER = vscode.l10n.t('Please input a number...'); +const SELECT_FRAMWORK = vscode.l10n.t('Please select framework...'); +const CONFIRM_SELECT = vscode.l10n.t('Please confirm your selection...'); +const INPUT_INCONSISTENT = vscode.l10n.t('Inconsistent input'); +const PARSE_COMPLETE = vscode.l10n.t('Parse complete.'); +const GEN_COMPLETE = vscode.l10n.t('Generation complete:'); +const OPEN_IN_EXPLORER = vscode.l10n.t('Open in Explorer'); + + // this method is called when your extension is activated // your extension is activated the very first time the command is executed export function activate(context: vscode.ExtensionContext) { @@ -38,12 +57,12 @@ export function activate(context: vscode.ExtensionContext) { if (uri && uri.fsPath) { const stat = await vscode.workspace.fs.stat(uri); if (stat.type === vscode.FileType.Directory) { - vscode.window.showInformationMessage(`You selected a directory: ${uri.fsPath}`); + vscode.window.showInformationMessage(SELECTED_DIR + uri.fsPath); } else { - vscode.window.showWarningMessage('Please select a directory.'); + vscode.window.showWarningMessage(SELECTE_DIR); } } else { - vscode.window.showWarningMessage('No resource selected.'); + vscode.window.showWarningMessage(NO_RES_SELECTED); } // Display a message box to the user vscode.window.showInformationMessage('ohcrosscompile!'); @@ -55,65 +74,27 @@ export function activate(context: vscode.ExtensionContext) { const h2sa = vscode.commands.registerCommand('extension.h2sa', async (uri) => { // The code you place here will be executed every time your command is executed if (uri && uri.fsPath) { - let versionTag = '3.2'; - const quickPick = vscode.window.createQuickPick(); - quickPick.title = "h2sa"; - quickPick.items = [ - { label: 'h2sa3-2' }, - { label: 'h2sa4-1'} - ]; - quickPick.canSelectMany = false; - - quickPick.onDidAccept(async () => { - const selectedItems = quickPick.selectedItems; - if (selectedItems.length > 0) { - const selectedItem = selectedItems[0].label; - if (selectedItem === 'h2sa3-2') { - versionTag = '3.2'; - } else if (selectedItem === 'h2sa4-1') { - versionTag = '4.1'; - } + let versionTag = '3.2'; + const version = await vscode.window.showQuickPick(['OpenHarmony 4.1 release', 'OpenHarmony 3.2 release'], { placeHolder: SELECT_VERSION }); + if (version === 'OpenHarmony 4.1 release') { + versionTag = '4.1' + } else if (version === 'OpenHarmony 3.2 release') { + versionTag = '3.2' + } + const serviceId = await vscode.window.showInputBox({ + placeHolder: INPUT_SERVICEID, + value: "19000", // Ĭֵ + validateInput: (input) => { + if (!input) { + return INPUT_NO_EMPTY; + } + if (!Number(input)) { + return INPUT_NUMBER + } } - - vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: "Generating SA...", - cancellable: false - }, async (progress) => { - // progress.report({ increment: 0, message: "Starting..." }); - - // analyze - let funDescList = await parseHeaderFile(uri.fsPath); - console.log('parse header file res: ', funDescList); - console.log('parse header file jsonstr: ', JSON.stringify(funDescList)); - - progress.report({ increment: 50, message: "Analyze complete." }); - - // generator - let out = path.dirname(uri.fsPath); - let serviceName = path.basename(uri.fsPath, '.h'); - let rootInfo = { - serviceName: serviceName, - funcs: funDescList.funcs, - serviceId: '19000', - versionTag: versionTag - }; - genServiceFile(rootInfo, out); - - progress.report({ increment: 100, message: "Generation complete." }); - }); - - quickPick.hide(); - }) - - quickPick.onDidHide(() => { - quickPick.dispose(); - }) - - quickPick.show(); + }); + generateSa(uri.fsPath, versionTag, serviceId as string); } - // Display a message box to the user - vscode.window.showInformationMessage('h2sa!'); }); context.subscriptions.push(h2sa); @@ -121,62 +102,13 @@ export function activate(context: vscode.ExtensionContext) { const h2hdf = vscode.commands.registerCommand('extension.h2hdf', async (uri) => { // The code you place here will be executed every time your command is executed if (uri && uri.fsPath) { - - let versionTag = '4.1'; - const quickPick = vscode.window.createQuickPick(); - quickPick.title = "h2hdf"; - quickPick.items = [ - { label: 'h2hdf4-1'} - ]; - quickPick.canSelectMany = false; - - quickPick.onDidAccept(async () => { - const selectedItems = quickPick.selectedItems; - if (selectedItems.length > 0) { - const selectedItem = selectedItems[0].label; - if (selectedItem === 'h2hdf4-1') { - versionTag = '4.1'; - } - } - - vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: "Generating DTS...", - cancellable: false - }, async (progress) => { - // progress.report({ increment: 0, message: "Starting..." }); - - // analyze - let funDescList = await parseHeaderFile(uri.fsPath); - console.log('parse header file res: ', funDescList); - console.log('parse header file jsonstr: ', JSON.stringify(funDescList)); - - progress.report({ increment: 50, message: "Analyze complete." }); - - // generator - let out = path.dirname(uri.fsPath); - let driverName = path.basename(uri.fsPath, '.h').toLocaleLowerCase(); - let rootInfo = { - driverName: driverName, - funcs: funDescList.funcs, - versionTag: versionTag - }; - genHdfFile(rootInfo, out); - - progress.report({ increment: 100, message: "Generation complete." }); - }); - - quickPick.hide(); - }) - - quickPick.onDidHide(() => { - quickPick.dispose(); - }) - - quickPick.show(); + let versionTag = '4.1'; + const version = await vscode.window.showQuickPick(['OpenHarmony 4.1 release'], { placeHolder: SELECT_VERSION }); + if (version === 'OpenHarmony 4.1 release') { + versionTag = '4.1' + } + generateHdf(uri.fsPath, versionTag); } - // Display a message box to the user - vscode.window.showInformationMessage('h2hdf!'); }); context.subscriptions.push(h2hdf); @@ -191,7 +123,7 @@ export function activate(context: vscode.ExtensionContext) { // parse let parseRes = await parseHeaderFile(uri.fsPath); console.log('parse header file res: ', parseRes); - progress.report({ increment: 50, message: "Parse complete." }); + progress.report({ increment: 50, message: PARSE_COMPLETE }); let rootInfo: GenInfo = { parseObj: parseRes, @@ -200,7 +132,7 @@ export function activate(context: vscode.ExtensionContext) { }; // generator let outPath = genDtsFile(rootInfo); - progress.report({ increment: 100, message: `Generation complete: ${outPath}.` }); + progress.report({ increment: 100, message: GEN_COMPLETE + outPath }); }); } }); @@ -209,36 +141,8 @@ export function activate(context: vscode.ExtensionContext) { const h2dtscpp = vscode.commands.registerCommand('extension.h2dtscpp', async (uri) => { // The code you place here will be executed every time your command is executed if (uri && uri.fsPath) { - vscode.window.withProgress({ - location: vscode.ProgressLocation.Notification, - title: "Generating DTS...", - cancellable: false - }, async (progress) => { - // progress.report({ increment: 0, message: "Starting..." }); - - // parse - let funDescList = await parseHeaderFile(uri.fsPath); - let fileName = path.basename(uri.fsPath, '.h'); - console.log('parse header file res: ', funDescList); - console.log('parse header file jsonstr: ', JSON.stringify(funDescList)); - - progress.report({ increment: 50, message: "Analyze complete." }); - - let rootInfo: DtscppRootInfo = { - funcs: funDescList.funcs, - rawFilePath: uri.fsPath, // e://xxx.h - fileName: fileName // xxx - }; - - // generator - let out = path.dirname(uri.fsPath); - genDtsCppFile(rootInfo, out); - - progress.report({ increment: 100, message: "Generation complete." }); - }); + generateDtscpp(uri.fsPath); } - // Display a message box to the user - vscode.window.showInformationMessage('h2dtscpp!'); }); context.subscriptions.push(h2dtscpp); @@ -253,7 +157,7 @@ export function activate(context: vscode.ExtensionContext) { // Display a message box to the user // parseTsFile(uri.fsPath) let res = parseTsFile(uri.fsPath); - console.info("res: " + JSON.stringify(res)); + console.info('res: ' + JSON.stringify(res)); vscode.window.showInformationMessage('dts2cpp!'); } else { console.log('not dts uri is : ' + uri.fsPath ); @@ -264,4 +168,154 @@ export function activate(context: vscode.ExtensionContext) { } }); context.subscriptions.push(dts2cpp); + + // ӭ˵ҳ + const ohGenerator = vscode.commands.registerCommand('extension.ohGenerator', async () => { + // The code you place here will be executed every time your command is executed + let hPath = path.join(__dirname, '../test/test.h'); + let hdfInputPath = path.join(__dirname, '../test/hello.h'); + const value = await vscode.window.showQuickPick([HDF_FRAMEWORK, SA_FRAMEWORK, NAPI_FRAMEWORK], { placeHolder: SELECT_FRAMWORK }); + await vscode.window.showInputBox({ + placeHolder: CONFIRM_SELECT, + validateInput: (input) => { + if (!input) { + return INPUT_NO_EMPTY; + } + if (input !== value) { + return INPUT_INCONSISTENT; + } + } + }); + if (value === HDF_FRAMEWORK) { + // 汾 + let versionTag = '4.1'; + const version = await vscode.window.showQuickPick(['OpenHarmony 4.1 release'], { placeHolder: SELECT_VERSION }) + if (version === 'OpenHarmony 4.1 release') { + versionTag === '4.1' + } + generateHdf(hdfInputPath, versionTag); + } else if (value === SA_FRAMEWORK) { + // 汾 + let versionTag = '3.2'; + const version = await vscode.window.showQuickPick(['OpenHarmony 3.2 release', 'OpenHarmony 4.1 release'], { placeHolder: SELECT_VERSION }) + if (version === 'OpenHarmony 4.1 release') { + versionTag = '4.1'; + } else if (version === 'OpenHarmony 3.2 release') { + versionTag = '3.2'; + } + const serviceId = await vscode.window.showInputBox({ + placeHolder: INPUT_SERVICEID, + value: "19000", + validateInput: (input) => { + if (!input) { + return INPUT_NO_EMPTY; + } + if (!Number(input)) { + return INPUT_NUMBER + } + } + }); + generateSa(hPath, versionTag, serviceId as string); + } else if (value === NAPI_FRAMEWORK) { + generateDtscpp(hPath); + } + }); + context.subscriptions.push(ohGenerator); } + +async function generateHdf(hdfInputPath: string, versionTag: string) { + vscode.window.withProgress({ + location: vscode.ProgressLocation.Notification, + title: 'Generating HDF...', + cancellable: false + }, async (progress) => { + // analyze + let funDescList = await parseHeaderFile(hdfInputPath); + console.log('parse header file res: ', funDescList); + console.log('parse header file jsonstr: ', JSON.stringify(funDescList)); + progress.report({ increment: 50, message: PARSE_COMPLETE }); + // generator + let out = path.dirname(hdfInputPath); + let driverName = path.basename(hdfInputPath, '.h').toLocaleLowerCase(); + let rootInfo = { + driverName: driverName, + funcs: funDescList.funcs, + versionTag: versionTag + }; + genHdfFile(rootInfo, out); + progress.report({ increment: 100, message: GEN_COMPLETE + out}); + }); + // ʾ· + const choice = await vscode.window.showInformationMessage('outPath:', path.dirname(hdfInputPath), OPEN_IN_EXPLORER); + if (choice === OPEN_IN_EXPLORER) { + // ļڵĿ¼ + vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(hdfInputPath)); + } +} + +async function generateSa(hPath: string, versionTag: string, serviceId: string) { + vscode.window.withProgress({ + location: vscode.ProgressLocation.Notification, + title: 'Generating SA...', + cancellable: false + }, async (progress) => { + // analyze + let funDescList = await parseHeaderFile(hPath); + console.log('parse header file res: ', funDescList); + console.log('parse header file jsonstr: ', JSON.stringify(funDescList)); + + progress.report({ increment: 50, message: PARSE_COMPLETE }); + + // generator + let out = path.dirname(hPath); + let serviceName = path.basename(hPath, '.h'); + let rootInfo = { + serviceName: serviceName, + funcs: funDescList.funcs, + serviceId: serviceId, + versionTag: versionTag + }; + genServiceFile(rootInfo, out); + progress.report({ increment: 100, message: GEN_COMPLETE + out }); + }); + // ʾ· + const choice = await vscode.window.showInformationMessage('outPath:', path.dirname(hPath), OPEN_IN_EXPLORER); + if (choice === OPEN_IN_EXPLORER) { + // ļڵĿ¼ + vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(hPath)); + } +} + +async function generateDtscpp(hFilePath: string) { + vscode.window.withProgress({ + location: vscode.ProgressLocation.Notification, + title: 'Generating DTSCPP...', + cancellable: false + }, async (progress) => { + // analyze + let funDescList = await parseHeaderFile(hFilePath); + let fileName = path.basename(hFilePath, '.h'); + console.log('parse header file res: ', funDescList); + console.log('parse header file jsonstr: ', JSON.stringify(funDescList)); + + progress.report({ increment: 50, message: PARSE_COMPLETE }); + + let rootInfo: DtscppRootInfo = { + funcs: funDescList.funcs, + rawFilePath: hFilePath, + fileName: fileName // xxx + }; + + // generator + let out = path.dirname(hFilePath); + genDtsCppFile(rootInfo, out); + progress.report({ increment: 100, message: GEN_COMPLETE + out }); + }); + // ʾ· + const choice = await vscode.window.showInformationMessage('outPath:', path.dirname(hFilePath), OPEN_IN_EXPLORER); + if (choice === OPEN_IN_EXPLORER) { + // ļڵĿ¼ + vscode.commands.executeCommand('revealFileInOS', vscode.Uri.file(hFilePath)); + } +} + diff --git a/src/vscode_plugin/test/hello.h b/src/vscode_plugin/test/hello.h new file mode 100644 index 0000000000000000000000000000000000000000..c251f379b6ae4835fa39e67cc233c2b9452de47b --- /dev/null +++ b/src/vscode_plugin/test/hello.h @@ -0,0 +1,23 @@ +/* +* Copyright (c) 2024 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. +*/ + +#ifndef HELLO_H +#define HELLO_H +#include + +namespace OHOS { + std::string Helloworld(std::string sendMsg); +} +#endif \ No newline at end of file diff --git a/src/vscode_plugin/test/test.h b/src/vscode_plugin/test/test.h new file mode 100644 index 0000000000000000000000000000000000000000..6b945d076d561db5dd194c4a960d42c48c39e3da --- /dev/null +++ b/src/vscode_plugin/test/test.h @@ -0,0 +1,22 @@ +/* +* Copyright (c) 2024 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. +*/ + +#ifndef TEST_H +#define TEST_H + +namespace OHOS { + int testFunc(int v1, int v2, bool v3); +} +#endif \ No newline at end of file