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 4928430..ec2a669 100644 --- a/package.json +++ b/package.json @@ -877,6 +877,7 @@ ], "extensions": [ ".sv", + ".svh", ".SV" ], "configuration": "./config/systemverilog.configuration.json", @@ -1161,8 +1162,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/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 ff6cb06..e4c1a69 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,30 +9,42 @@ import { extensionUrl } from '../resources/hdlParser'; import * as lspClient from './function/lsp-client'; -async function registerCommand(context: vscode.ExtensionContext) { - manager.registerManagerCommands(context); + +async function registerCommand(context: vscode.ExtensionContext) { func.registerFunctionCommands(context); func.registerLsp(context); func.registerToolCommands(context); func.registerFSM(context); func.registerNetlist(context); func.registerWaveViewer(context); - // lspClient.activate(context); + + lspClient.activate(context); + await LspClient.MainClient?.onReady(); // lspClient.activateVHDL(context); } 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); @@ -61,6 +73,6 @@ export function activate(context: vscode.ExtensionContext) { } export function deactivate() { - // lspClient.deactivate(); + lspClient.deactivate(); // lspClient.deactivateVHDL(); } \ No newline at end of file diff --git a/src/function/index.ts b/src/function/index.ts index beddf92..799d3f1 100644 --- a/src/function/index.ts +++ b/src/function/index.ts @@ -74,14 +74,14 @@ 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.registerDocumentSemanticTokensProvider(vlogSelector, lspDocSemantic.vlogDocSenmanticProvider, lspDocSemantic.vlogLegend); + // 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); // vhdl lsp 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..ceb7cba --- /dev/null +++ b/src/global/lsp.ts @@ -0,0 +1,41 @@ +import * as vscode from 'vscode'; +import { LanguageClient, RequestType, ProtocolConnection } from 'vscode-languageclient/node'; +import { Fast } from '../../resources/hdlParser'; + + +interface IDigitalIDELspClient { + MainClient?: LanguageClient, + VhdlClient?: LanguageClient +} + +export const LspClient: IDigitalIDELspClient = { + MainClient: undefined, + VhdlClient: undefined +}; + +/** + * @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 4546ae8..441f827 100644 --- a/src/hdlParser/core.ts +++ b/src/hdlParser/core.ts @@ -227,9 +227,9 @@ class HdlParam { private async doHdlFast(path: AbsPath) { try { - 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, @@ -247,12 +247,12 @@ class HdlParam { } } - public async initialize(hdlFiles: AbsPath[] | Generator) { + public async initialize(hdlFiles: AbsPath[] | Generator) { await this.initHdlFiles(hdlFiles); 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) {