多线程解析
This commit is contained in:
parent
4d93f443fa
commit
306c57f07e
@ -1,6 +1,6 @@
|
|||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
|
|
||||||
import { opeParam, MainOutput, AbsPath, ReportType, LspClient } from './global';
|
import { opeParam, MainOutput, AbsPath, ReportType, LspClient, IProgress } from './global';
|
||||||
import { hdlParam } from './hdlParser';
|
import { hdlParam } from './hdlParser';
|
||||||
import * as manager from './manager';
|
import * as manager from './manager';
|
||||||
import * as func from './function';
|
import * as func from './function';
|
||||||
@ -25,7 +25,6 @@ async function registerCommand(context: vscode.ExtensionContext) {
|
|||||||
// lspClient.activateVHDL(context);
|
// lspClient.activateVHDL(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
async function launch(context: vscode.ExtensionContext) {
|
async function launch(context: vscode.ExtensionContext) {
|
||||||
await vscode.window.withProgress({
|
await vscode.window.withProgress({
|
||||||
location: vscode.ProgressLocation.Window,
|
location: vscode.ProgressLocation.Window,
|
||||||
@ -37,9 +36,9 @@ async function launch(context: vscode.ExtensionContext) {
|
|||||||
await vscode.window.withProgress({
|
await vscode.window.withProgress({
|
||||||
location: vscode.ProgressLocation.Window,
|
location: vscode.ProgressLocation.Window,
|
||||||
title: 'Initialization (Digtial-IDE)'
|
title: 'Initialization (Digtial-IDE)'
|
||||||
}, async () => {
|
}, async (progress: vscode.Progress<IProgress>, token: vscode.CancellationToken) => {
|
||||||
// 初始化解析
|
// 初始化解析
|
||||||
await manager.prjManage.initialise(context);
|
await manager.prjManage.initialise(context, progress);
|
||||||
|
|
||||||
// 这里是因为 pl 对象在 initialise 完成初始化,此处再注册它的行为
|
// 这里是因为 pl 对象在 initialise 完成初始化,此处再注册它的行为
|
||||||
manager.registerManagerCommands(context);
|
manager.registerManagerCommands(context);
|
||||||
|
@ -11,6 +11,12 @@ type RelPath = string;
|
|||||||
|
|
||||||
type AllowNull<T> = T | null;
|
type AllowNull<T> = T | null;
|
||||||
|
|
||||||
|
|
||||||
|
interface IProgress {
|
||||||
|
message?: string,
|
||||||
|
increment?: number
|
||||||
|
}
|
||||||
|
|
||||||
export {
|
export {
|
||||||
opeParam,
|
opeParam,
|
||||||
OpeParamDefaults,
|
OpeParamDefaults,
|
||||||
@ -26,5 +32,6 @@ export {
|
|||||||
WaveViewOutput,
|
WaveViewOutput,
|
||||||
ReportType,
|
ReportType,
|
||||||
AllowNull,
|
AllowNull,
|
||||||
LspClient
|
LspClient,
|
||||||
|
IProgress
|
||||||
};
|
};
|
@ -1,6 +1,6 @@
|
|||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
|
|
||||||
import { AbsPath, opeParam } from '../global';
|
import { AbsPath, IProgress, opeParam } from '../global';
|
||||||
import { HdlLangID } from '../global/enum';
|
import { HdlLangID } from '../global/enum';
|
||||||
import { MainOutput, ReportType } from '../global/outputChannel';
|
import { MainOutput, ReportType } from '../global/outputChannel';
|
||||||
|
|
||||||
@ -241,14 +241,44 @@ class HdlParam {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async initHdlFiles(hdlFiles: AbsPath[] | Generator<AbsPath>) {
|
public async initHdlFiles(hdlFiles: AbsPath[], progress?: vscode.Progress<IProgress>) {
|
||||||
for (const path of hdlFiles) {
|
let count: number = 0;
|
||||||
await this.doHdlFast(path);
|
let fileNum = hdlFiles.length;
|
||||||
|
const parallelChunk = 5;
|
||||||
|
|
||||||
|
const pools: { id: number, promise: Promise<void> }[] = [];
|
||||||
|
|
||||||
|
vscode.window.showInformationMessage("files to handle: " + fileNum);
|
||||||
|
|
||||||
|
async function consumePools() {
|
||||||
|
for (const p of pools) {
|
||||||
|
const increment = Math.floor(p.id / fileNum * 100);
|
||||||
|
await p.promise;
|
||||||
|
console.log("handle id " + p.id + ' increment: ' + increment);
|
||||||
|
|
||||||
|
progress?.report({ message: `build module tree ${p.id}/${fileNum}`, increment });
|
||||||
|
}
|
||||||
|
pools.length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const path of hdlFiles) {
|
||||||
|
count ++;
|
||||||
|
const p = this.doHdlFast(path);
|
||||||
|
pools.push({ id: count, promise: p });
|
||||||
|
if (pools.length % parallelChunk === 0) {
|
||||||
|
// 消费并发池
|
||||||
|
await consumePools();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pools.length > 0) {
|
||||||
|
await consumePools();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async initialize(hdlFiles: AbsPath[] | Generator<AbsPath>) {
|
public async initialize(hdlFiles: AbsPath[], progress: vscode.Progress<IProgress>) {
|
||||||
await this.initHdlFiles(hdlFiles);
|
await this.initHdlFiles(hdlFiles, progress);
|
||||||
|
|
||||||
for (const hdlFile of this.getAllHdlFiles()) {
|
for (const hdlFile of this.getAllHdlFiles()) {
|
||||||
hdlFile.makeInstance();
|
hdlFile.makeInstance();
|
||||||
|
@ -11,12 +11,14 @@ async function doFastApi(path: string): Promise<Fast | undefined> {
|
|||||||
const client = LspClient.MainClient;
|
const client = LspClient.MainClient;
|
||||||
const langID = hdlFile.getLanguageId(path);
|
const langID = hdlFile.getLanguageId(path);
|
||||||
if (client) {
|
if (client) {
|
||||||
|
console.log(client.initializeResult);
|
||||||
const response = await client.sendRequest(DoFastRequestType, { path });
|
const response = await client.sendRequest(DoFastRequestType, { path });
|
||||||
response.languageId = langID;
|
response.languageId = langID;
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("error happen when run doFastApi, " + error);
|
console.error("error happen when run doFastApi, " + error);
|
||||||
|
console.error("error file path: " + path);
|
||||||
return undefined;
|
return undefined;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
import * as vscode from 'vscode';
|
import * as vscode from 'vscode';
|
||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
|
|
||||||
import { AbsPath, MainOutput, opeParam, ReportType } from '../global';
|
import { AbsPath, IProgress, MainOutput, opeParam, ReportType } from '../global';
|
||||||
import { PathSet } from '../global/util';
|
import { PathSet } from '../global/util';
|
||||||
import { RawPrjInfo } from '../global/prjInfo';
|
import { RawPrjInfo } from '../global/prjInfo';
|
||||||
import { hdlDir, hdlFile, hdlPath } from '../hdlFs';
|
import { hdlDir, hdlFile, hdlPath } from '../hdlFs';
|
||||||
@ -136,7 +136,7 @@ class PrjManage {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
public async initialise(context: vscode.ExtensionContext, countTimeCost: boolean = true) {
|
public async initialise(context: vscode.ExtensionContext, progress: vscode.Progress<IProgress>, countTimeCost: boolean = true) {
|
||||||
if (countTimeCost) {
|
if (countTimeCost) {
|
||||||
console.time('launch');
|
console.time('launch');
|
||||||
}
|
}
|
||||||
@ -147,7 +147,7 @@ class PrjManage {
|
|||||||
const hdlFiles = await this.getPrjHardwareFiles();
|
const hdlFiles = await this.getPrjHardwareFiles();
|
||||||
MainOutput.report(`finish collect ${hdlFiles.length} hdl files`, ReportType.Info);
|
MainOutput.report(`finish collect ${hdlFiles.length} hdl files`, ReportType.Info);
|
||||||
|
|
||||||
await hdlParam.initialize(hdlFiles);
|
await hdlParam.initialize(hdlFiles, progress);
|
||||||
const unhandleNum = hdlParam.getUnhandleInstanceNumber();
|
const unhandleNum = hdlParam.getUnhandleInstanceNumber();
|
||||||
MainOutput.report(`finish analyse ${hdlFiles.length} hdl files, find ${unhandleNum} unsolved instances`, ReportType.Info);
|
MainOutput.report(`finish analyse ${hdlFiles.length} hdl files, find ${unhandleNum} unsolved instances`, ReportType.Info);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user