diff --git a/extensions/vscode-vue-language-features/package.json b/extensions/vscode-vue-language-features/package.json index d372c4c4d..d910db8d1 100644 --- a/extensions/vscode-vue-language-features/package.json +++ b/extensions/vscode-vue-language-features/package.json @@ -270,6 +270,14 @@ "default": false, "description": "Use second server to progress heavy diagnostic works, the main server workhorse computing intellisense, operations such as auto-complete can respond faster. Note that this will lead to more memory usage." }, + "volar.vueserver.maxOldSpaceSize": { + "type": [ + "number", + "null" + ], + "default": null, + "description": "Set --max-old-space-size option on server process. If you have problem on frequently \"Request textDocument/** failed.\" error, try setting higher memory(MB) on it." + }, "volar.codeLens.references": { "type": "boolean", "default": true, @@ -639,4 +647,4 @@ "vscode-languageclient": "^8.0.0-next.14", "vscode-nls": "5.0.0" } -} +} \ No newline at end of file diff --git a/extensions/vscode-vue-language-features/src/common.ts b/extensions/vscode-vue-language-features/src/common.ts index 3fcd1655d..9134b1197 100644 --- a/extensions/vscode-vue-language-features/src/common.ts +++ b/extensions/vscode-vue-language-features/src/common.ts @@ -95,6 +95,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang { language: 'vue' }, ]; const _useSecondServer = useSecondServer(); + const _serverMaxOldSpaceSize = serverMaxOldSpaceSize(); apiClient = createLc( 'volar-language-features', @@ -121,6 +122,7 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang const clients = [apiClient, docClient, htmlClient].filter(shared.notEmpty); registerUseSecondServerChange(); + registerServerMaxOldSpaceSizeChange(); registerRestartRequest(); registerClientRequests(); @@ -135,13 +137,27 @@ async function doActivate(context: vscode.ExtensionContext, createLc: CreateLang tsconfig.activate(context, docClient ?? apiClient); doctor.activate(context); - async function registerUseSecondServerChange() { + async function requestReloadVscode() { + const reload = await vscode.window.showInformationMessage( + 'Please reload VSCode to restart language servers.', + 'Reload Window' + ); + if (reload === undefined) return; // cancel + vscode.commands.executeCommand('workbench.action.reloadWindow'); + } + function registerUseSecondServerChange() { vscode.workspace.onDidChangeConfiguration(async () => { const nowUseSecondServer = useSecondServer(); if (_useSecondServer !== nowUseSecondServer) { - const reload = await vscode.window.showInformationMessage('Please reload VSCode to restart language servers.', 'Reload Window'); - if (reload === undefined) return; // cancel - vscode.commands.executeCommand('workbench.action.reloadWindow'); + return requestReloadVscode(); + } + }); + } + function registerServerMaxOldSpaceSizeChange() { + vscode.workspace.onDidChangeConfiguration(async () => { + const nowServerMaxOldSpaceSize = serverMaxOldSpaceSize(); + if (_serverMaxOldSpaceSize !== nowServerMaxOldSpaceSize) { + return requestReloadVscode(); } }); } @@ -196,6 +212,10 @@ function useSecondServer() { return !!vscode.workspace.getConfiguration('volar').get('vueserver.useSecondServer'); } +function serverMaxOldSpaceSize() { + return vscode.workspace.getConfiguration('volar').get('vueserver.maxOldSpaceSize'); +} + function getInitializationOptions( context: vscode.ExtensionContext, mode: 'main-language-features' | 'second-language-features' | 'document-features', diff --git a/extensions/vscode-vue-language-features/src/nodeClientMain.ts b/extensions/vscode-vue-language-features/src/nodeClientMain.ts index b2cd51817..4df6fd133 100644 --- a/extensions/vscode-vue-language-features/src/nodeClientMain.ts +++ b/extensions/vscode-vue-language-features/src/nodeClientMain.ts @@ -12,9 +12,18 @@ export function activate(context: vscode.ExtensionContext) { ) => { const serverModule = vscode.Uri.joinPath(context.extensionUri, 'server'); + const maxOldSpaceSize = vscode.workspace.getConfiguration('volar').get('vueserver.maxOldSpaceSize'); + const runOptions = { execArgv: [] }; + if (maxOldSpaceSize) { + runOptions.execArgv.push("--max-old-space-size=" + maxOldSpaceSize); + } const debugOptions = { execArgv: ['--nolazy', '--inspect=' + port] }; const serverOptions: lsp.ServerOptions = { - run: { module: serverModule.fsPath, transport: lsp.TransportKind.ipc }, + run: { + module: serverModule.fsPath, + transport: lsp.TransportKind.ipc, + options: runOptions + }, debug: { module: serverModule.fsPath, transport: lsp.TransportKind.ipc,