From 2c45caf25194217cfa93bca3d04a8803b2cebb4d Mon Sep 17 00:00:00 2001 From: raylras Date: Fri, 29 Nov 2024 18:50:26 +0800 Subject: [PATCH] feat: async parser --- packages/zenscript/src/module.ts | 2 ++ packages/zenscript/src/parser/async-parser.ts | 12 ++++++++++++ packages/zenscript/src/parser/worker.ts | 13 +++++++++++++ packages/zenscript/tsup.config.ts | 1 + 4 files changed, 28 insertions(+) create mode 100644 packages/zenscript/src/parser/async-parser.ts create mode 100644 packages/zenscript/src/parser/worker.ts diff --git a/packages/zenscript/src/module.ts b/packages/zenscript/src/module.ts index f9ccc6a1..881a5a1b 100644 --- a/packages/zenscript/src/module.ts +++ b/packages/zenscript/src/module.ts @@ -9,6 +9,7 @@ import { ZenScriptCompletionProvider } from './lsp/completion-provider' import { ZenScriptInlayHintProvider } from './lsp/inlay-hint-provider' import { ZenScriptNodeKindProvider } from './lsp/node-kind-provider' import { ZenScriptSemanticTokenProvider } from './lsp/semantic-token-provider' +import { AsyncParser } from './parser/async-parser' import { ZenScriptDynamicProvider } from './reference/dynamic-provider' import { ZenScriptMemberProvider } from './reference/member-provider' import { ZenScriptNameProvider } from './reference/name-provider' @@ -86,6 +87,7 @@ export const ZenScriptModule: Module new CustomTokenBuilder(), ValueConverter: () => new CustomValueConverter(), + AsyncParser: services => new AsyncParser(services), }, typing: { TypeComputer: services => new ZenScriptTypeComputer(services), diff --git a/packages/zenscript/src/parser/async-parser.ts b/packages/zenscript/src/parser/async-parser.ts new file mode 100644 index 00000000..4289095d --- /dev/null +++ b/packages/zenscript/src/parser/async-parser.ts @@ -0,0 +1,12 @@ +import type { LangiumCoreServices } from 'langium' +import path from 'node:path' +import { WorkerThreadAsyncParser } from 'langium/node' + +const workerPath = path.resolve(__dirname, 'parser', 'worker.cjs') + +export class AsyncParser extends WorkerThreadAsyncParser { + constructor(services: LangiumCoreServices) { + super(services, workerPath) + this.threadCount = 4 + } +} diff --git a/packages/zenscript/src/parser/worker.ts b/packages/zenscript/src/parser/worker.ts new file mode 100644 index 00000000..073e28fa --- /dev/null +++ b/packages/zenscript/src/parser/worker.ts @@ -0,0 +1,13 @@ +import { parentPort } from 'node:worker_threads' +import { EmptyFileSystem } from 'langium' +import { createZenScriptServices } from '../module' + +const services = createZenScriptServices(EmptyFileSystem) +const parser = services.parser.LangiumParser +const hydrator = services.serializer.Hydrator + +parentPort!.on('message', (text) => { + const result = parser.parse(text) + const dehydrated = hydrator.dehydrate(result) + parentPort!.postMessage(dehydrated) +}) diff --git a/packages/zenscript/tsup.config.ts b/packages/zenscript/tsup.config.ts index 48d5bd8d..8a72cc85 100644 --- a/packages/zenscript/tsup.config.ts +++ b/packages/zenscript/tsup.config.ts @@ -9,6 +9,7 @@ const builtinsDest = resolve(__dirname, outDir, 'builtins') export default defineConfig({ ...DefaultConfig, + entry: ['src/main.ts', 'src/parser/worker.ts'], outDir, noExternal: ['vscode-languageserver', 'langium', '@intellizen/shared'], async onSuccess() {