From 5c9ddd25a835702ff2740342487668d053c47ce8 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Thu, 12 Sep 2024 16:01:26 +0800 Subject: [PATCH 1/3] add lsp interface --- package-lock.json | 30 +++++++++++++++++++++++------- package.json | 5 +++-- src/extension.ts | 12 ++---------- src/function/lsp-client/index.ts | 20 ++++++++++---------- src/global/index.ts | 4 +++- src/global/lsp.ts | 14 ++++++++++++++ src/hdlParser/core.ts | 4 +++- 7 files changed, 58 insertions(+), 31 deletions(-) create mode 100644 src/global/lsp.ts diff --git a/package-lock.json b/package-lock.json index 20da431..3499c5e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "showdown": "^2.1.0", "state-machine-cat": "^9.2.5", "temp": "^0.9.4", + "vscode-jsonrpc": "^8.2.1", "vscode-languageclient": "^7.0.0", "vscode-textmate": "^9.0.0", "wavedrom": "^2.9.1" @@ -3809,11 +3810,11 @@ "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==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", + "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==", "engines": { - "node": ">=8.0.0 || >=10.0.0" + "node": ">=14.0.0" } }, "node_modules/vscode-languageclient": { @@ -3838,6 +3839,14 @@ "vscode-languageserver-types": "3.16.0" } }, + "node_modules/vscode-languageserver-protocol/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-languageserver-types": { "version": "3.16.0", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", @@ -7124,9 +7133,9 @@ "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==" + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.1.tgz", + "integrity": "sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==" }, "vscode-languageclient": { "version": "7.0.0", @@ -7145,6 +7154,13 @@ "requires": { "vscode-jsonrpc": "6.0.0", "vscode-languageserver-types": "3.16.0" + }, + "dependencies": { + "vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" + } } }, "vscode-languageserver-types": { diff --git a/package.json b/package.json index 2eb854f..3629409 100644 --- a/package.json +++ b/package.json @@ -1158,8 +1158,9 @@ "showdown": "^2.1.0", "state-machine-cat": "^9.2.5", "temp": "^0.9.4", + "vscode-jsonrpc": "^8.2.1", + "vscode-languageclient": "^7.0.0", "vscode-textmate": "^9.0.0", - "wavedrom": "^2.9.1", - "vscode-languageclient": "^7.0.0" + "wavedrom": "^2.9.1" } } diff --git a/src/extension.ts b/src/extension.ts index e1cce37..2a4079d 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -18,13 +18,8 @@ async function registerCommand(context: vscode.ExtensionContext) { func.registerFSM(context); func.registerNetlist(context); func.registerWaveViewer(context); -<<<<<<< HEAD lspClient.activate(context); - lspClient.activateVHDL(context); -======= - - lspClient.activate(context); ->>>>>>> 199b7a8af3ea01baea4b20c89273a490dc0dc9d2 + // lspClient.activateVHDL(context); } @@ -67,8 +62,5 @@ export function activate(context: vscode.ExtensionContext) { export function deactivate() { lspClient.deactivate(); -<<<<<<< HEAD - lspClient.deactivateVHDL(); -======= ->>>>>>> 199b7a8af3ea01baea4b20c89273a490dc0dc9d2 + // lspClient.deactivateVHDL(); } \ No newline at end of file diff --git a/src/function/lsp-client/index.ts b/src/function/lsp-client/index.ts index 0242ac3..b931bfa 100644 --- a/src/function/lsp-client/index.ts +++ b/src/function/lsp-client/index.ts @@ -9,9 +9,7 @@ import * as vscode from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; import { platform } from "os"; - -let client: LanguageClient; -let vhdlClient: LanguageClient; +import { LspClient } from '../../global'; function getLspServerExecutionName() { const osname = platform(); @@ -58,21 +56,22 @@ export function activate(context: vscode.ExtensionContext) { ], }; - client = new LanguageClient( + const client = new LanguageClient( "Digital LSP", "Digital LSP", serverOptions, clientOptions ); - + LspClient.MainClient = client; + client.start(); } export function deactivate(): Thenable | undefined { - if (!client) { + if (!LspClient.MainClient) { return undefined; } - return client.stop(); + return LspClient.MainClient.stop(); } @@ -117,19 +116,20 @@ export function activateVHDL(context: vscode.ExtensionContext) { ], }; - client = new LanguageClient( + const client = new LanguageClient( "Digital LSP VHDL", "Digital LSP VHDL", serverOptions, clientOptions ); + LspClient.VhdlClient = client; client.start(); } export function deactivateVHDL(): Thenable | undefined { - if (!vhdlClient) { + if (!LspClient.VhdlClient) { return undefined; } - return vhdlClient.stop(); + return LspClient.VhdlClient.stop(); } \ No newline at end of file diff --git a/src/global/index.ts b/src/global/index.ts index 3c39391..4b760cf 100644 --- a/src/global/index.ts +++ b/src/global/index.ts @@ -4,6 +4,7 @@ import { MainOutput, LspOutput, YosysOutput, WaveViewOutput, ReportType } from ' import * as Enum from './enum'; import * as Lang from './lang'; +import { LspClient } from './lsp'; type AbsPath = string; type RelPath = string; @@ -24,5 +25,6 @@ export { YosysOutput, WaveViewOutput, ReportType, - AllowNull + AllowNull, + LspClient }; \ No newline at end of file diff --git a/src/global/lsp.ts b/src/global/lsp.ts new file mode 100644 index 0000000..6d20499 --- /dev/null +++ b/src/global/lsp.ts @@ -0,0 +1,14 @@ +import { LanguageClient, RequestType, ProtocolConnection } from 'vscode-languageclient/node'; + + +interface IDigitalIDELspClient { + MainClient?: LanguageClient, + VhdlClient?: LanguageClient +} + +export const LspClient: IDigitalIDELspClient = { + MainClient: undefined, + VhdlClient: undefined +}; + +export const CustomRequestType = new RequestType('custom/request'); diff --git a/src/hdlParser/core.ts b/src/hdlParser/core.ts index bae374d..d855c69 100644 --- a/src/hdlParser/core.ts +++ b/src/hdlParser/core.ts @@ -227,7 +227,8 @@ class HdlParam { private async doHdlFast(path: AbsPath) { try { - const fast = await HdlSymbol.fast(path); + // TODO: make this quick + const fast = await HdlSymbol.fast(path); if (fast) { const languageId = this.alignLanguageId(fast.languageId); new HdlFile(path, @@ -248,6 +249,7 @@ class HdlParam { } public async initialize(hdlFiles: AbsPath[] | Generator) { + // await this.initHdlFiles(hdlFiles); // for (const hdlFile of this.getAllHdlFiles()) { From b16595bd8177bc1ef886a2fbaf32720b233b5329 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Thu, 19 Sep 2024 20:58:17 +0800 Subject: [PATCH 2/3] commit --- package.json | 1 + src/extension.ts | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a24e2bf..ec2a669 100644 --- a/package.json +++ b/package.json @@ -877,6 +877,7 @@ ], "extensions": [ ".sv", + ".svh", ".SV" ], "configuration": "./config/systemverilog.configuration.json", diff --git a/src/extension.ts b/src/extension.ts index 2a4079d..9f95002 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; -import { opeParam, MainOutput, AbsPath, ReportType } from './global'; +import { opeParam, MainOutput, AbsPath, ReportType, LspClient } from './global'; import { hdlParam } from './hdlParser'; import * as manager from './manager'; import * as func from './function'; @@ -9,6 +9,8 @@ import { extensionUrl } from '../resources/hdlParser'; import * as lspClient from './function/lsp-client'; + + async function registerCommand(context: vscode.ExtensionContext) { manager.registerManagerCommands(context); @@ -18,7 +20,9 @@ async function registerCommand(context: vscode.ExtensionContext) { func.registerFSM(context); func.registerNetlist(context); func.registerWaveViewer(context); + lspClient.activate(context); + await LspClient.MainClient?.onReady(); // lspClient.activateVHDL(context); } @@ -32,7 +36,7 @@ async function launch(context: vscode.ExtensionContext) { await registerCommand(context); hdlMonitor.start(); }); - + MainOutput.report('Digital-IDE has launched, Version: 0.3.3', ReportType.Launch); MainOutput.report('OS: ' + opeParam.os, ReportType.Launch); From 5cafbc67a6bdb3e03b8e7215f9ce68a43dfcee48 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Sun, 22 Sep 2024 21:40:02 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=B8=8A=E7=BA=BF=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E5=90=8E=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/hdlParser/index.js | 2 +- src/extension.ts | 14 ++++++++-- src/global/lsp.ts | 29 +++++++++++++++++++- src/hdlParser/core.ts | 16 +++++------ src/hdlParser/util.ts | 53 ++++++++++++++++++++++++++++++++++-- 5 files changed, 98 insertions(+), 16 deletions(-) diff --git a/resources/hdlParser/index.js b/resources/hdlParser/index.js index 93f9bf3..725d901 100644 --- a/resources/hdlParser/index.js +++ b/resources/hdlParser/index.js @@ -51,7 +51,7 @@ async function callParser(path, func) { // console.log(res); debug.compute += Date.now() - s3; - console.log(path, debug); + // console.log(path, debug); return JSON.parse(res); } catch (error) { console.log(`errors happen when call wasm, path: ${path}, errors: ${error}, input params: (${path}, ${func})`); diff --git a/src/extension.ts b/src/extension.ts index 9f95002..e4c1a69 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -12,8 +12,6 @@ import * as lspClient from './function/lsp-client'; async function registerCommand(context: vscode.ExtensionContext) { - manager.registerManagerCommands(context); - func.registerFunctionCommands(context); func.registerLsp(context); func.registerToolCommands(context); @@ -28,15 +26,25 @@ async function registerCommand(context: vscode.ExtensionContext) { async function launch(context: vscode.ExtensionContext) { + await vscode.window.withProgress({ + location: vscode.ProgressLocation.Window, + title: 'Register Command (Digtial-IDE)' + }, async () => { + await registerCommand(context); + }); + await vscode.window.withProgress({ location: vscode.ProgressLocation.Window, title: 'Initialization (Digtial-IDE)' }, async () => { await manager.prjManage.initialise(context); - await registerCommand(context); + manager.registerManagerCommands(context); + hdlMonitor.start(); }); + + MainOutput.report('Digital-IDE has launched, Version: 0.3.3', ReportType.Launch); MainOutput.report('OS: ' + opeParam.os, ReportType.Launch); diff --git a/src/global/lsp.ts b/src/global/lsp.ts index 6d20499..ceb7cba 100644 --- a/src/global/lsp.ts +++ b/src/global/lsp.ts @@ -1,4 +1,6 @@ +import * as vscode from 'vscode'; import { LanguageClient, RequestType, ProtocolConnection } from 'vscode-languageclient/node'; +import { Fast } from '../../resources/hdlParser'; interface IDigitalIDELspClient { @@ -11,4 +13,29 @@ export const LspClient: IDigitalIDELspClient = { VhdlClient: undefined }; -export const CustomRequestType = new RequestType('custom/request'); +/** + * @description 构造请求参数 + * RequestType + * P: 请求的参数类型。 + * R: 请求的响应类型。 + * E: 请求的错误类型。 + * RO: 请求的可选参数类型。 + */ +export const CustomRequestType = new RequestType('custom/request'); +export const CustomParamRequestType = new RequestType('custom/paramRequest'); +export const DoFastRequestType = new RequestType('api/fast'); + +export interface ITextDocumentItem { + uri: vscode.Uri, + languageId: string, + version: number, + text: string +} + +export interface ICommonParam { + param: string +} + +export interface IDoFastParam { + +} \ No newline at end of file diff --git a/src/hdlParser/core.ts b/src/hdlParser/core.ts index 0950cdb..441f827 100644 --- a/src/hdlParser/core.ts +++ b/src/hdlParser/core.ts @@ -227,10 +227,9 @@ class HdlParam { private async doHdlFast(path: AbsPath) { try { - // TODO: make this quick - const fast = await HdlSymbol.fast(path); + const fast = await HdlSymbol.fast(path); if (fast) { - const languageId = this.alignLanguageId(fast.languageId); + const languageId = hdlFile.getLanguageId(path); new HdlFile(path, languageId, fast.macro, @@ -248,13 +247,12 @@ class HdlParam { } } - public async initialize(hdlFiles: AbsPath[] | Generator) { + public async initialize(hdlFiles: AbsPath[] | Generator) { + await this.initHdlFiles(hdlFiles); - // await this.initHdlFiles(hdlFiles); - - // for (const hdlFile of this.getAllHdlFiles()) { - // hdlFile.makeInstance(); - // } + for (const hdlFile of this.getAllHdlFiles()) { + hdlFile.makeInstance(); + } } public getTopModulesByType(type: string): HdlModule[] { diff --git a/src/hdlParser/util.ts b/src/hdlParser/util.ts index 8880ae9..30e8e28 100644 --- a/src/hdlParser/util.ts +++ b/src/hdlParser/util.ts @@ -1,9 +1,53 @@ -import { Fast, vlogAll, vlogFast, vhdlAll, svFast, svAll, vhdlFast, All } from '../../resources/hdlParser'; +import * as vscode from 'vscode'; +import { Fast, vlogAll, vhdlAll, svAll, vhdlFast, All } from '../../resources/hdlParser'; import { hdlFile } from '../hdlFs'; import { HdlLangID } from '../global/enum'; -import { AbsPath } from '../global'; +import { AbsPath, LspClient } from '../global'; +import { DoFastRequestType, ITextDocumentItem, CustomParamRequestType } from '../global/lsp'; +import { RawHdlModule } from './common'; + +async function doFastApi(path: string): Promise { + try { + const client = LspClient.MainClient; + const langID = hdlFile.getLanguageId(path); + if (client) { + const response = await client.sendRequest(DoFastRequestType, { path }) as { fast: any }; + if (response.fast instanceof Array) { + const rawModules = response.fast as RawHdlModule[]; + return { + content: rawModules, + languageId: langID, + macro: { + errors: [], + defines: [], + includes: [], + invalid: [] + } + }; + } + } + } catch (error) { + console.error("error happen when run doFastApi, " + error); + return undefined; + } +} + +async function vlogFast(path: string): Promise { + const fast = await doFastApi(path); + return fast; +} + +async function svFast(path: string): Promise { + const fast = await doFastApi(path); + return fast; +} namespace HdlSymbol { + /** + * @description 计算出模块级的信息 + * @param path 文件绝对路径 + * @returns + */ export function fast(path: AbsPath): Promise { const langID = hdlFile.getLanguageId(path); switch (langID) { @@ -14,6 +58,11 @@ namespace HdlSymbol { } } + /** + * @description 0.4.0 后丢弃 + * @param path 文件绝对路径 + * @returns + */ export function all(path: AbsPath): Promise { const langID = hdlFile.getLanguageId(path); switch (langID) {