From 199b7a8af3ea01baea4b20c89273a490dc0dc9d2 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Sat, 7 Sep 2024 23:09:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=20digital-lsp=20=E9=83=A8?= =?UTF-8?q?=E7=BD=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- CHANGELOG.md | 12 +++++ package-lock.json | 69 ++++++++++++++++++++++++- package.json | 3 +- resources/dide-lsp/README.md | 3 ++ resources/dide-viewer/README.md | 6 +++ resources/dide-viewer/index.js | 1 - resources/wavedrom/index.js | 19 ++++++- src/extension.ts | 8 ++- src/function/index.ts | 14 +++--- src/function/lsp-client/index.ts | 75 ++++++++++++++++++++++++++++ src/function/lsp/docSemantic/vlog.ts | 6 +-- 12 files changed, 199 insertions(+), 20 deletions(-) create mode 100644 resources/dide-lsp/README.md create mode 100644 resources/dide-viewer/README.md delete mode 100644 resources/dide-viewer/index.js create mode 100644 src/function/lsp-client/index.ts diff --git a/.gitignore b/.gitignore index b5bcf3a..4a4d8d8 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,5 @@ out-js/ *.pyd resources/hdlParser/parser.js resources/hdlParser/parser.wasm -resources/dide-viewer/view/* \ No newline at end of file +resources/dide-viewer/view/* +resources/dide-lsp/server/* \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 3784e8c..050b9c3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,18 @@ All notable changes to the "digital-ide" extension will be documented in this fi Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. + + +## [0.3.4] - 2024-08-28 + +Feature + +wave 渲染器 https://nc-ai-lab.feishu.cn/wiki/K7gVwwU02iNMc8krIHucPwhqnff#share-NjuodrRQAoxEotxRicOc7BXDnOh + + + +--- + ## [0.3.3] - 2024-02-05 Feature diff --git a/package-lock.json b/package-lock.json index 5658415..20da431 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,19 @@ { "name": "fpga-support", - "version": "0.3.2", + "version": "0.3.3", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "fpga-support", - "version": "0.3.2", + "version": "0.3.3", "dependencies": { "chokidar": "^3.5.3", "puppeteer-core": "^19.4.1", "showdown": "^2.1.0", "state-machine-cat": "^9.2.5", "temp": "^0.9.4", + "vscode-languageclient": "^7.0.0", "vscode-textmate": "^9.0.0", "wavedrom": "^2.9.1" }, @@ -3807,6 +3808,41 @@ "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==", "deprecated": "no longer supported" }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, "node_modules/vscode-textmate": { "version": "9.0.0", "resolved": "https://registry.npmmirror.com/vscode-textmate/-/vscode-textmate-9.0.0.tgz", @@ -7087,6 +7123,35 @@ "resolved": "https://registry.npmmirror.com/viz.js/-/viz.js-1.8.2.tgz", "integrity": "sha512-W+1+N/hdzLpQZEcvz79n2IgUE9pfx6JLdHh3Kh8RGvLL8P1LdJVQmi2OsDcLdY4QVID4OUy+FPelyerX0nJxIQ==" }, + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" + }, + "vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "requires": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + } + }, + "vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "requires": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, "vscode-textmate": { "version": "9.0.0", "resolved": "https://registry.npmmirror.com/vscode-textmate/-/vscode-textmate-9.0.0.tgz", diff --git a/package.json b/package.json index ed1cb5e..2eb854f 100644 --- a/package.json +++ b/package.json @@ -1159,6 +1159,7 @@ "state-machine-cat": "^9.2.5", "temp": "^0.9.4", "vscode-textmate": "^9.0.0", - "wavedrom": "^2.9.1" + "wavedrom": "^2.9.1", + "vscode-languageclient": "^7.0.0" } } diff --git a/resources/dide-lsp/README.md b/resources/dide-lsp/README.md new file mode 100644 index 0000000..4807daa --- /dev/null +++ b/resources/dide-lsp/README.md @@ -0,0 +1,3 @@ +dide-lsp + - server + - digital-lsp \ No newline at end of file diff --git a/resources/dide-viewer/README.md b/resources/dide-viewer/README.md new file mode 100644 index 0000000..e5378f7 --- /dev/null +++ b/resources/dide-viewer/README.md @@ -0,0 +1,6 @@ +dide-viewer + - view + - index.html + - css + - js + - ... \ No newline at end of file diff --git a/resources/dide-viewer/index.js b/resources/dide-viewer/index.js deleted file mode 100644 index b571344..0000000 --- a/resources/dide-viewer/index.js +++ /dev/null @@ -1 +0,0 @@ -// require view folder \ No newline at end of file diff --git a/resources/wavedrom/index.js b/resources/wavedrom/index.js index 5e68617..badaa3e 100644 --- a/resources/wavedrom/index.js +++ b/resources/wavedrom/index.js @@ -13,17 +13,32 @@ function selectSkin(skin) { return darkSkin; } +function replaceRectsWithCustomString(svgString, style) { + const regex = /]*)\s*\/?>/gs; + + const replacedSvgString = svgString.replace(regex, (match, attributes, content) => { + match = match.replace('fill:#FFF;', 'fill:var(--vscode-editor-background)'); + return match; + }); + + return replacedSvgString; +} + /** * * @param {number} id * @param {any} json - * @param {any} style 'dark' or 'light' + * @param {'dark' | 'light'} style * @returns {string} */ function renderWaveDrom(id, json, style) { const skin = selectSkin(style); const renderObj = renderAny(id, json, skin); - const svgString = onmlStringify(renderObj); + let svgString = onmlStringify(renderObj); + + // TODO: more elegant ? 这里是为了解决黑色模式下部分 rect 仍然是白色背景 + svgString = replaceRectsWithCustomString(svgString, style); + return svgString; } diff --git a/src/extension.ts b/src/extension.ts index 3223215..273da79 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -7,6 +7,8 @@ import * as func from './function'; import { hdlMonitor } from './monitor'; import { extensionUrl } from '../resources/hdlParser'; +import * as lspClient from './function/lsp-client'; + async function registerCommand(context: vscode.ExtensionContext) { manager.registerManagerCommands(context); @@ -16,6 +18,8 @@ async function registerCommand(context: vscode.ExtensionContext) { func.registerFSM(context); func.registerNetlist(context); func.registerWaveViewer(context); + + lspClient.activate(context); } @@ -56,4 +60,6 @@ export function activate(context: vscode.ExtensionContext) { launch(context); } -export function deactivate() {} \ No newline at end of file +export function deactivate() { + lspClient.deactivate(); +} \ No newline at end of file diff --git a/src/function/index.ts b/src/function/index.ts index 694a8c6..119b38e 100644 --- a/src/function/index.ts +++ b/src/function/index.ts @@ -71,13 +71,13 @@ function registerLsp(context: vscode.ExtensionContext) { vscode.commands.registerCommand('digital-ide.vhdl2vlog', uri => lspTranslator.vhdl2vlog(uri)); // verilog lsp - vscode.languages.registerDocumentSymbolProvider(vlogSelector, lspDocSymbol.vlogDocSymbolProvider); - vscode.languages.registerDefinitionProvider(vlogSelector, lspDefinition.vlogDefinitionProvider); - vscode.languages.registerHoverProvider(vlogSelector, lspHover.vlogHoverProvider); - vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogIncludeCompletionProvider, '/', '"'); - vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogMacroCompletionProvider, '`'); - vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogPositionPortProvider, '.'); - vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogCompletionProvider); + // vscode.languages.registerDocumentSymbolProvider(vlogSelector, lspDocSymbol.vlogDocSymbolProvider); + // vscode.languages.registerDefinitionProvider(vlogSelector, lspDefinition.vlogDefinitionProvider); + // vscode.languages.registerHoverProvider(vlogSelector, lspHover.vlogHoverProvider); + // vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogIncludeCompletionProvider, '/', '"'); + // vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogMacroCompletionProvider, '`'); + // vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogPositionPortProvider, '.'); + // vscode.languages.registerCompletionItemProvider(vlogSelector, lspCompletion.vlogCompletionProvider); // vscode.languages.registerDocumentSemanticTokensProvider(vlogSelector, lspDocSemantic.vlogDocSenmanticProvider, lspDocSemantic.vlogLegend); diff --git a/src/function/lsp-client/index.ts b/src/function/lsp-client/index.ts new file mode 100644 index 0000000..cb3f9ca --- /dev/null +++ b/src/function/lsp-client/index.ts @@ -0,0 +1,75 @@ +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, + Executable, +} from "vscode-languageclient/node"; + +import * as vscode from 'vscode'; +import * as path from 'path'; +import * as fs from 'fs'; +import { platform } from "os"; + +let client: LanguageClient; + +function getLspServerExecutionName() { + const osname = platform(); + if (osname === 'win32') { + return 'digital-lsp.exe'; + } + + return 'digital-lsp'; +} + +export function activate(context: vscode.ExtensionContext) { + const lspServerName = getLspServerExecutionName(); + const lspServerPath = context.asAbsolutePath( + path.join('resources', 'dide-lsp', 'server', lspServerName) + ); + + if (fs.existsSync(lspServerPath)) { + console.log('lsp server found at ' + lspServerPath); + } else { + console.error('cannot found lsp server at ' + lspServerPath); + } + + const run: Executable = { + command: lspServerPath, + }; + + // If the extension is launched in debug mode then the debug server options are used + // Otherwise the run options are used + let serverOptions: ServerOptions = { + run, + debug: run, + }; + + let clientOptions: LanguageClientOptions = { + documentSelector: [ + { + scheme: 'file', + language: 'systemverilog' + }, + { + scheme: 'file', + language: 'verilog' + } + ], + }; + + client = new LanguageClient( + "Digital LSP", + "Digital LSP", + serverOptions, + clientOptions + ); + + client.start(); +} + +export function deactivate(): Thenable | undefined { + if (!client) { + return undefined; + } + return client.stop(); +} \ No newline at end of file diff --git a/src/function/lsp/docSemantic/vlog.ts b/src/function/lsp/docSemantic/vlog.ts index a9defbd..cc9d725 100644 --- a/src/function/lsp/docSemantic/vlog.ts +++ b/src/function/lsp/docSemantic/vlog.ts @@ -13,11 +13,7 @@ class VlogDocSenmanticProvider implements vscode.DocumentSemanticTokensProvider public async provideDocumentSemanticTokens(document: vscode.TextDocument, token: vscode.CancellationToken): Promise { // TODO : finish this const tokensBuilder = new vscode.SemanticTokensBuilder(vlogLegend); - // const filePath = document.fileName; - // const vlogAll = await HdlSymbol.all(filePath); - // if (vlogAll) { - // this.prepareTokensBuilder(tokensBuilder, vlogAll); - // } + return tokensBuilder.build(); }