diff --git a/src/config.html b/src/config.html new file mode 100644 index 0000000000000000000000000000000000000000..356051d8396a07a934c97840e3361b38f093c0c7 --- /dev/null +++ b/src/config.html @@ -0,0 +1,84 @@ + + + + + + + Napi + + + + + +
+ 选择方式: + .d.ts文件(多个文件之间用,号分割) + 文件夹 +
+
+
+ 选择接口文件: +
+ +
+ 生成框架路径: +
+ +
+ 编译脚本路径: +
+
+ + + + + +
+ + + \ No newline at end of file diff --git a/src/extension.js b/src/extension.js index 96a30fa26ab1524019d2790caf2c0a50f636cf2f..361d38840eb4119e6e774549ef03c6bbd3294427 100644 --- a/src/extension.js +++ b/src/extension.js @@ -16,10 +16,13 @@ // The module 'vscode' contains the VS Code extensibility API // Import the module and reference it with the alias vscode in your code below const vscode = require('vscode'); +const fs = require('fs'); +const re = require("./gen/tools/re"); const xgen = require('./gen/main'); const path = require("path"); const { checkFileError } = require("./gen/tools/common"); const { NapiLog } = require("./gen/tools/NapiLog"); +const { readFile } = require('./gen/tools/FileRW'); // this method is called when your extension is activated // your extension is activated the very first time the command is executed @@ -31,96 +34,122 @@ function activate(context) { // Use the console to output diagnostic information (console.log) and errors (console.error) // This line of code will only be executed once when your extension is activated console.log('Congratulations, your extension "gnapi" is now active!'); - const panel = vscode.window.createWebviewPanel( - 'generate', // 标识webview的类型 - 'Generate Napi Frame', // 展示给用户的面板的标题 - vscode.ViewColumn.One, // 显示webview面板以编辑器新列的方式. - { - enableScripts: true, // 启用JS,默认禁用 - retainContextWhenHidden: true, // webview被隐藏时保持状态,避免被重置 - } - ); - panel.webview.html = getWebviewContent(); - panel.webview.onDidReceiveMessage(message => { - vscode.window.showInformationMessage('插件收到的消息:' + message); - }, undefined, context.subscriptions); - let disposable = vscode.commands.registerCommand('generate_napi', function (uri) { // The code you place here will be executed every time your command is executed // Display a message box to the user - let result = checkFileError(uri.fsPath); - if (result[0]) { - vscode.window.showInformationMessage("正在生成" + uri.fsPath); - NapiLog.init(1, path.join("" + path.dirname(uri.fsPath), "napi_gen.log")) - xgen.doGenerate(uri.fsPath, path.dirname(uri.fsPath)); - let ret = NapiLog.getResult(); - if (ret[0]) { - vscode.window.showInformationMessage("生成成功"); + const panel = vscode.window.createWebviewPanel( + 'generate', // 标识webview的类型 + 'Generate Napi Frame', // 展示给用户的面板的标题 + vscode.ViewColumn.One, // 显示webview面板以编辑器新列的方式. + { + enableScripts: true, // 启用JS,默认禁用 + retainContextWhenHidden: true, // webview被隐藏时保持状态,避免被重置 + } + ); + panel.webview.html = getWebviewContent(); + panel.webview.onDidReceiveMessage(message => { + if (message == "cancel") { + panel.dispose(); } else { - vscode.window.showInformationMessage("" + ret[1]); + let mode = message.mode; + let fileNames = message.fileNames; + let fileDir = message.fileDir; + let genDir = message.genFile; + if (mode == 0) { + genFiles(fileNames, genDir); + } else if (mode == 1) { + genDirPath(fileDir, genDir); + } } - } else { - vscode.window.showErrorMessage("" + result[1]); - } + }, undefined, context.subscriptions); + panel.webview.postMessage(uri.fsPath); }); context.subscriptions.push(disposable); } +function genFiles(fileNames, genDir) { + if (fileNames.indexOf(".") < 0) { + vscode.window.showErrorMessage("请输入正确的文件路径"); + return; + } + var regex = ","; + let filenameArray = fileNames.toString().split(regex); + let n = filenameArray.length; + for (let i = 0; i < n; i++) { + let fileName = filenameArray[i]; + checkGenerate(fileName, genDir); + } +} + +function genDirPath(fileDir, genDir) { + if (fileDir.indexOf(".") > 0) { + vscode.window.showErrorMessage("请输入正确的文件夹路径"); + return; + } + fs.readdir(fileDir + "", function (err, files) { + if (err) { + NapiLog.logError("readdir file error" + err); + return; + } + (function iterator(i) { + if (i == files.length) { + return; + } + fs.stat(path.join(fileDir + "", files[i]), function (err, data) { + if (err) { + NapiLog.logError("read file error" + err); + return; + } + if (data.isFile()) { + let fileName = files[i]; + checkGenerate(fileName, genDir); + } + iterator(i + 1); + }); + })(0); + }); +} + +function checkGenerate(fileName, genDir) { + let fn = re.getFileInPath(fileName); + let tt = re.match("@ohos.[a-zA-Z_0-9]+.d.ts", fn); + if (tt) { + let result = checkFileError(fileName); + if (result[0]) { + if (result[0]) { + vscode.window.showInformationMessage("正在生成" + fileName); + NapiLog.init(1, path.join("" + path.dirname(fileName), "napi_gen.log")) + xgen.doGenerate(fileName, genDir == null ? path.dirname(fileName) : genDir); + let ret = NapiLog.getResult(); + if (ret[0]) { + vscode.window.showInformationMessage("生成成功"); + } + else { + vscode.window.showInformationMessage("" + ret[1]); + } + } + else { + vscode.window.showErrorMessage("" + result[1]); + } + } + else { + NapiLog.logError(result[1]); + } + + } + else { + NapiLog.logError("file name " + fn + " format invalid, @ohos.input_sample.d.ts"); + } +} + // this method is called when your extension is deactivated function deactivate() { } function getWebviewContent() { - return ` - - - - - - - Napi - -
- 选择方式: - .d.ts文件 - 文件夹 -
-
-
- 选择接口文件: - - -
- -
- 生成框架路径: - -
- -
- 编译脚本路径: - -
-
- - - - - -
- - ` + let data = readFile('src/config.html'); + return data.toString(); } module.exports = {