From c86d6e57dbcddefdb0b3bb8409025e66284c9d05 Mon Sep 17 00:00:00 2001 From: Kirigaya <1193466151@qq.com> Date: Wed, 16 Aug 2023 01:17:13 +0800 Subject: [PATCH] #fix issue 8 --- src/function/index.ts | 2 +- src/function/lsp/completion/vlog.ts | 8 ++--- src/function/lsp/core/index.ts | 54 ++++++++++++++++++++++++++-- src/function/lsp/core/vlog.ts | 53 --------------------------- src/function/lsp/definition/vlog.ts | 6 ++-- src/function/lsp/docSemantic/vlog.ts | 2 +- src/function/lsp/docSymbol/vlog.ts | 4 +-- src/function/lsp/hover/vlog.ts | 21 ++++++++--- src/function/lsp/linter/vlog.ts | 4 +-- src/function/lsp/util/index.ts | 17 ++++++--- src/function/sim/simulate.ts | 11 +++--- src/hdlParser/common.ts | 5 ++- src/hdlParser/core.ts | 1 + src/monitor/event.ts | 4 +-- 14 files changed, 108 insertions(+), 84 deletions(-) delete mode 100644 src/function/lsp/core/vlog.ts diff --git a/src/function/index.ts b/src/function/index.ts index caf6cd7..06eb280 100644 --- a/src/function/index.ts +++ b/src/function/index.ts @@ -80,7 +80,7 @@ function registerLsp(context: vscode.ExtensionContext) { vscode.languages.registerDocumentSemanticTokensProvider(vlogSelector, lspDocSemantic.vlogDocSenmanticProvider, lspDocSemantic.vlogLegend); lspLinter.vlogLinter.initialise(); - lspCore.vlogSymbolStorage.initialise(); + lspCore.hdlSymbolStorage.initialise(); // vhdl lsp } diff --git a/src/function/lsp/completion/vlog.ts b/src/function/lsp/completion/vlog.ts index fb9227e..29bbe4f 100644 --- a/src/function/lsp/completion/vlog.ts +++ b/src/function/lsp/completion/vlog.ts @@ -9,7 +9,7 @@ import { Define, Include, RawSymbol } from '../../../hdlParser/common'; import { HdlInstance, HdlModule } from '../../../hdlParser/core'; import { vlogKeyword } from '../util/keyword'; import { instanceVlogCode } from '../../sim/instance'; -import { vlogSymbolStorage } from '../core'; +import { hdlSymbolStorage } from '../core'; class VlogIncludeCompletionProvider implements vscode.CompletionItemProvider { public provideCompletionItems(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken, context: vscode.CompletionContext): vscode.ProviderResult> { @@ -77,7 +77,7 @@ class VlogMacroCompletionProvider implements vscode.CompletionItemProvider { const targetWord = document.getText(targetWordRange); const filePath = document.fileName; - const symbolResult = await vlogSymbolStorage.getSymbol(filePath); + const symbolResult = await hdlSymbolStorage.getSymbol(filePath); if (!symbolResult) { return null; } @@ -113,7 +113,7 @@ class VlogPositionPortProvider implements vscode.CompletionItemProvider { try { const suggestPositionPorts: vscode.CompletionItem[] = []; const filePath = hdlPath.toSlash(document.fileName); - const symbolResult = await vlogSymbolStorage.getSymbol(filePath); + const symbolResult = await hdlSymbolStorage.getSymbol(filePath); // console.log(symbolResult?.content); // console.log(position.character, position.line); @@ -195,7 +195,7 @@ class VlogCompletionProvider implements vscode.CompletionItemProvider { completions.push(...this.makeCompilerKeywordItems(document, position)); completions.push(...this.makeSystemKeywordItems(document, position)); - const symbolResult = await vlogSymbolStorage.getSymbol(filePath); + const symbolResult = await hdlSymbolStorage.getSymbol(filePath); if (!symbolResult) { return completions; } diff --git a/src/function/lsp/core/index.ts b/src/function/lsp/core/index.ts index e1cb8c1..d2585e8 100644 --- a/src/function/lsp/core/index.ts +++ b/src/function/lsp/core/index.ts @@ -1,5 +1,55 @@ -import { vlogSymbolStorage } from './vlog'; +import * as vscode from 'vscode'; +import { All } from '../../../../resources/hdlParser'; +import { AbsPath } from '../../../global'; +import { hdlPath } from '../../../hdlFs'; +import { isHDLFile, isVerilogFile, isVhdlFile } from '../../../hdlFs/file'; +import { HdlSymbol } from '../../../hdlParser'; + +type ThenableAll = Promise; + +class SymbolStorage { + private symbolMap: Map; + private isHdlFile: (file: AbsPath) => boolean; + constructor(isHdlFile: (file: AbsPath) => boolean) { + this.symbolMap = new Map(); + this.isHdlFile = isHdlFile; + } + + public async getSymbol(path: AbsPath): ThenableAll { + path = hdlPath.toSlash(path); + const allP = this.symbolMap.get(path); + if (allP) { + return await allP; + } + this.updateSymbol(path); + const all = await this.symbolMap.get(path); + return all; + } + + public async updateSymbol(path: AbsPath) { + path = hdlPath.toSlash(path); + const allPromise = HdlSymbol.all(path); + this.symbolMap.set(path, allPromise); + } + + public async deleteSymbol(path: AbsPath) { + path = hdlPath.toSlash(path); + this.symbolMap.delete(path); + } + + public async initialise() { + for (const doc of vscode.workspace.textDocuments) { + // TODO : check support for sv + // TODO : check performance + if (isHDLFile(doc.fileName)) { + await this.updateSymbol(doc.fileName); + } + } + } +} + +const hdlSymbolStorage = new SymbolStorage(isVerilogFile); export { - vlogSymbolStorage + hdlSymbolStorage }; \ No newline at end of file diff --git a/src/function/lsp/core/vlog.ts b/src/function/lsp/core/vlog.ts deleted file mode 100644 index 05a9fad..0000000 --- a/src/function/lsp/core/vlog.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as vscode from 'vscode'; -import { All } from '../../../../resources/hdlParser'; -import { AbsPath } from '../../../global'; -import { hdlPath } from '../../../hdlFs'; -import { isVerilogFile } from '../../../hdlFs/file'; -import { HdlSymbol } from '../../../hdlParser'; - -type ThenableAll = Promise; - -class VlogSymbolStorage { - private symbolMap: Map; - constructor() { - this.symbolMap = new Map(); - } - - public async getSymbol(path: AbsPath): ThenableAll { - path = hdlPath.toSlash(path); - const allP = this.symbolMap.get(path); - if (allP) { - return await allP; - } - this.updateSymbol(path); - const all = await this.symbolMap.get(path); - return all; - } - - public async updateSymbol(path: AbsPath) { - path = hdlPath.toSlash(path); - const vlogAllPromise = HdlSymbol.all(path); - this.symbolMap.set(path, vlogAllPromise); - } - - public async deleteSymbol(path: AbsPath) { - path = hdlPath.toSlash(path); - this.symbolMap.delete(path); - } - - - public async initialise() { - for (const doc of vscode.workspace.textDocuments) { - if (isVerilogFile(doc.fileName)) { - // TODO : check performance - await this.updateSymbol(doc.fileName); - } - } - } -} - -const vlogSymbolStorage = new VlogSymbolStorage(); - -export { - vlogSymbolStorage -}; \ No newline at end of file diff --git a/src/function/lsp/definition/vlog.ts b/src/function/lsp/definition/vlog.ts index be77a98..b97b827 100644 --- a/src/function/lsp/definition/vlog.ts +++ b/src/function/lsp/definition/vlog.ts @@ -6,7 +6,7 @@ import { All } from '../../../../resources/hdlParser'; import { vlogKeyword } from '../util/keyword'; import * as util from '../util'; import { MainOutput, ReportType } from '../../../global'; -import { vlogSymbolStorage } from '../core'; +import { hdlSymbolStorage } from '../core'; class VlogDefinitionProvider implements vscode.DefinitionProvider { @@ -26,7 +26,7 @@ class VlogDefinitionProvider implements vscode.DefinitionProvider { } const filePath = document.fileName; - const vlogAll = await vlogSymbolStorage.getSymbol(filePath); + const vlogAll = await hdlSymbolStorage.getSymbol(filePath); if (!vlogAll) { return null; } else { @@ -120,6 +120,8 @@ class VlogDefinitionProvider implements vscode.DefinitionProvider { const link: vscode.LocationLink = { targetUri: instModPathUri, targetRange }; return [link]; } + + return null; } diff --git a/src/function/lsp/docSemantic/vlog.ts b/src/function/lsp/docSemantic/vlog.ts index 80509fe..a9defbd 100644 --- a/src/function/lsp/docSemantic/vlog.ts +++ b/src/function/lsp/docSemantic/vlog.ts @@ -1,7 +1,7 @@ import * as vscode from 'vscode'; import { All } from '../../../../resources/hdlParser'; import { HdlSymbol } from '../../../hdlParser'; -import { vlogSymbolStorage } from '../core'; +import { hdlSymbolStorage } from '../core'; import { transformRange } from '../util'; const tokenTypes = ['class', 'function', 'variable']; diff --git a/src/function/lsp/docSymbol/vlog.ts b/src/function/lsp/docSymbol/vlog.ts index 534417f..940bc1f 100644 --- a/src/function/lsp/docSymbol/vlog.ts +++ b/src/function/lsp/docSymbol/vlog.ts @@ -2,7 +2,7 @@ import * as vscode from 'vscode'; import { AllowNull } from '../../../global'; import { RawSymbol, Range } from '../../../hdlParser/common'; -import { vlogSymbolStorage } from '../core'; +import { hdlSymbolStorage } from '../core'; import { positionAfterEqual } from '../util'; @@ -16,7 +16,7 @@ class VlogDocSymbolProvider implements vscode.DocumentSymbolProvider { // console.log('VlogDocSymbolProvider'); const path = document.fileName; - const vlogAll = await vlogSymbolStorage.getSymbol(path); + const vlogAll = await hdlSymbolStorage.getSymbol(path); if (!vlogAll || !vlogAll.content) { return []; diff --git a/src/function/lsp/hover/vlog.ts b/src/function/lsp/hover/vlog.ts index 5c70fa8..6986650 100644 --- a/src/function/lsp/hover/vlog.ts +++ b/src/function/lsp/hover/vlog.ts @@ -7,7 +7,7 @@ import { vlogKeyword } from '../util/keyword'; import * as util from '../util'; import { MainOutput, ReportType } from '../../../global'; import { HdlLangID } from '../../../global/enum'; -import { vlogSymbolStorage } from '../core'; +import { hdlSymbolStorage } from '../core'; class VlogHoverProvider implements vscode.HoverProvider { @@ -27,7 +27,7 @@ class VlogHoverProvider implements vscode.HoverProvider { } const filePath = document.fileName; - const vlogAll = await vlogSymbolStorage.getSymbol(filePath); + const vlogAll = await hdlSymbolStorage.getSymbol(filePath); if (!vlogAll) { return null; } else { @@ -100,12 +100,21 @@ class VlogHoverProvider implements vscode.HoverProvider { // match port or param definition (position input) - if (util.isPositionInput(lineText, position.character)) { + /** for example, when you hover the ".clk" below, the branch will be entered + template u_template( + //input + .clk ( clk ), + ); + * + */ + if (util.isPositionInput(lineText, position.character)) { + console.log('enter position input'); const currentInstResult = util.filterInstanceByPosition(position, scopeSymbols.symbols, currentModule); if (!currentInstResult || !currentInstResult.instModPath) { return null; } - + console.log(currentInstResult); + const instParamPromise = util.getInstParamByPosition(currentInstResult, position, targetWord); const instPortPromise = util.getInstPortByPosition(currentInstResult, position, targetWord); @@ -130,6 +139,8 @@ class VlogHoverProvider implements vscode.HoverProvider { } return new vscode.Hover(content); } + + return null; } @@ -145,7 +156,7 @@ class VlogHoverProvider implements vscode.HoverProvider { return new vscode.Hover(content); } - // match ports + // match ports const portResult = util.matchPorts(targetWord, currentModule); if (portResult) { const portComment = await util.searchCommentAround(filePath, portResult.range); diff --git a/src/function/lsp/linter/vlog.ts b/src/function/lsp/linter/vlog.ts index 776ed64..7e76e33 100644 --- a/src/function/lsp/linter/vlog.ts +++ b/src/function/lsp/linter/vlog.ts @@ -2,7 +2,7 @@ import * as vscode from 'vscode'; import { All } from '../../../../resources/hdlParser'; import { isVerilogFile } from '../../../hdlFs/file'; import { Position, Range } from '../../../hdlParser/common'; -import { vlogSymbolStorage } from '../core'; +import { hdlSymbolStorage } from '../core'; class VlogLinter { @@ -13,7 +13,7 @@ class VlogLinter { async lint(document: vscode.TextDocument) { const filePath = document.fileName; - const vlogAll = await vlogSymbolStorage.getSymbol(filePath); + const vlogAll = await hdlSymbolStorage.getSymbol(filePath); // console.log('lint all finish'); if (vlogAll) { diff --git a/src/function/lsp/util/index.ts b/src/function/lsp/util/index.ts index 5f34a81..9d8bda2 100644 --- a/src/function/lsp/util/index.ts +++ b/src/function/lsp/util/index.ts @@ -301,11 +301,20 @@ function matchParams(singleWord: string, module: HdlModule): AllowNull = new Set(); diff --git a/src/monitor/event.ts b/src/monitor/event.ts index 2717801..f9b06aa 100644 --- a/src/monitor/event.ts +++ b/src/monitor/event.ts @@ -13,7 +13,7 @@ import { prjManage } from '../manager'; import { libManage } from '../manager/lib'; import type { HdlMonitor } from './index'; import { ToolChainType } from '../global/enum'; -import { vlogSymbolStorage } from '../function/lsp/core'; +import { hdlSymbolStorage } from '../function/lsp/core'; import { vlogLinter } from '../function/lsp/linter'; import { isVerilogFile } from '../hdlFs/file'; @@ -125,7 +125,7 @@ class HdlAction extends BaseAction { } async updateSymbolStorage(path: string) { - vlogSymbolStorage.updateSymbol(path); + hdlSymbolStorage.updateSymbol(path); } async updateLinter(path: string) {