diff --git a/packages/language-server/src/utils/configurationHost.ts b/packages/language-server/src/utils/configurationHost.ts index 20d8943f3..ba5f8279a 100644 --- a/packages/language-server/src/utils/configurationHost.ts +++ b/packages/language-server/src/utils/configurationHost.ts @@ -4,6 +4,7 @@ import { ConfigurationHost } from '@volar/language-service'; export function createConfigurationHost(params: vscode.InitializeParams, connection: vscode.Connection): ConfigurationHost & { ready(): void; } { const callbacks: Function[] = []; + let cache: Record = {}; connection.onDidChangeConfiguration(async () => { for (const cb of callbacks) { @@ -18,10 +19,19 @@ export function createConfigurationHost(params: vscode.InitializeParams, connect } }, async getConfiguration(section, scopeUri) { - return (await connection.workspace.getConfiguration({ scopeUri, section })) ?? undefined /* replace null to undefined */; + if (!scopeUri && params.capabilities.workspace?.didChangeConfiguration) { + cache[section] ??= await getConfigurationWorker(section, scopeUri); + return cache[section]; + } + return await getConfigurationWorker(section, scopeUri); }, onDidChangeConfiguration(cb) { + cache = {}; callbacks.push(cb); }, }; + + async function getConfigurationWorker(section: string, scopeUri?: string) { + return (await connection.workspace.getConfiguration({ scopeUri, section })) ?? undefined /* replace null to undefined */; + } } diff --git a/plugins/css/src/index.ts b/plugins/css/src/index.ts index 490731c4d..87ebc8002 100644 --- a/plugins/css/src/index.ts +++ b/plugins/css/src/index.ts @@ -45,7 +45,7 @@ export default function (): LanguageServicePlugin { if (!context.env.documentContext) return; - const settings = await context.env.configurationHost?.getConfiguration(document.languageId, document.uri); + const settings = await context.env.configurationHost?.getConfiguration(document.languageId); const cssResult = await cssLs.doComplete2(document, position, stylesheet, context.env.documentContext, settings?.completion); return cssResult; @@ -95,7 +95,7 @@ export default function (): LanguageServicePlugin { async onSyntactic(document) { return worker(document, async (stylesheet, cssLs) => { - const settings = await context.env.configurationHost?.getConfiguration(document.languageId, document.uri); + const settings = await context.env.configurationHost?.getConfiguration(document.languageId); return cssLs.doValidation(document, stylesheet, settings) as vscode.Diagnostic[]; }); @@ -105,7 +105,7 @@ export default function (): LanguageServicePlugin { async doHover(document, position) { return worker(document, async (stylesheet, cssLs) => { - const settings = await context.env.configurationHost?.getConfiguration(document.languageId, document.uri); + const settings = await context.env.configurationHost?.getConfiguration(document.languageId); return cssLs.doHover(document, position, stylesheet, settings?.hover); }); @@ -166,7 +166,7 @@ export default function (): LanguageServicePlugin { async format(document, range, options) { return worker(document, async (stylesheet, cssLs) => { - const options_2 = await context.env.configurationHost?.getConfiguration(document.languageId + '.format', document.uri); + const options_2 = await context.env.configurationHost?.getConfiguration(document.languageId + '.format'); if (options_2?.enable === false) { return; diff --git a/plugins/html/src/index.ts b/plugins/html/src/index.ts index c25a376f0..437604ffc 100644 --- a/plugins/html/src/index.ts +++ b/plugins/html/src/index.ts @@ -39,7 +39,7 @@ export default function (options: { async on(document, position) { return worker(document, async (htmlDocument) => { - const configs = await context.env.configurationHost?.getConfiguration('html.completion', document.uri); + const configs = await context.env.configurationHost?.getConfiguration('html.completion'); if (context.env.documentContext) { return htmlLs.doComplete2(document, position, htmlDocument, context.env.documentContext, configs); @@ -63,7 +63,7 @@ export default function (options: { async doHover(document, position) { return worker(document, async (htmlDocument) => { - const hoverSettings = await context.env.configurationHost?.getConfiguration('html.hover', document.uri); + const hoverSettings = await context.env.configurationHost?.getConfiguration('html.hover'); return htmlLs.doHover(document, position, htmlDocument, hoverSettings); }); @@ -106,7 +106,7 @@ export default function (options: { async format(document, formatRange, options) { return worker(document, async (htmlDocument) => { - const options_2 = await context.env.configurationHost?.getConfiguration('html.format', document.uri); + const options_2 = await context.env.configurationHost?.getConfiguration('html.format'); if (options_2?.enable === false) { return; @@ -166,7 +166,7 @@ export default function (options: { if (enabled) { - const text = htmlLs.doQuoteComplete(document, position, htmlDocument, await context.env.configurationHost?.getConfiguration('html.completion', document.uri)); + const text = htmlLs.doQuoteComplete(document, position, htmlDocument, await context.env.configurationHost?.getConfiguration('html.completion')); if (text) { return text; diff --git a/plugins/json/src/index.ts b/plugins/json/src/index.ts index 2b7228f30..4e3a119e7 100644 --- a/plugins/json/src/index.ts +++ b/plugins/json/src/index.ts @@ -106,7 +106,7 @@ export default function (settings?: json.LanguageSettings): LanguageServicePlugi format(document, range, options) { return worker(document, async (jsonDocument) => { - const options_2 = await context.env.configurationHost?.getConfiguration('json.format', document.uri); + const options_2 = await context.env.configurationHost?.getConfiguration('json.format'); if (options_2?.enable === false) { return; diff --git a/plugins/pug/src/index.ts b/plugins/pug/src/index.ts index ad1c412b0..46a91bf0d 100644 --- a/plugins/pug/src/index.ts +++ b/plugins/pug/src/index.ts @@ -63,7 +63,7 @@ export default function (): LanguageServicePlugin & ReturnType { - const hoverSettings = await context.env.configurationHost?.getConfiguration('html.hover', document.uri); + const hoverSettings = await context.env.configurationHost?.getConfiguration('html.hover'); return pugLs.doHover(pugDocument, position, hoverSettings); }); @@ -114,7 +114,7 @@ export default function (): LanguageServicePlugin & ReturnType('html.completion', document.uri)); + const text = pugLs.doQuoteComplete(pugDocument, position, await context.env.configurationHost?.getConfiguration('html.completion')); if (text) { return text; diff --git a/plugins/typescript/src/configs/getFormatCodeSettings.ts b/plugins/typescript/src/configs/getFormatCodeSettings.ts index f826ac1fe..ade4d688e 100644 --- a/plugins/typescript/src/configs/getFormatCodeSettings.ts +++ b/plugins/typescript/src/configs/getFormatCodeSettings.ts @@ -9,7 +9,7 @@ export async function getFormatCodeSettings( options?: vscode.FormattingOptions, ): Promise { - let config = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript.format' : 'javascript.format', uri); + let config = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript.format' : 'javascript.format'); config = config ?? {}; diff --git a/plugins/typescript/src/configs/getUserPreferences.ts b/plugins/typescript/src/configs/getUserPreferences.ts index c439eee9c..0947b326e 100644 --- a/plugins/typescript/src/configs/getUserPreferences.ts +++ b/plugins/typescript/src/configs/getUserPreferences.ts @@ -10,8 +10,8 @@ export async function getUserPreferences( workspaceFolder: URI | undefined, ): Promise { - const config = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript' : 'javascript', uri) ?? {}; - const preferencesConfig = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript.preferences' : 'javascript.preferences', uri) ?? {}; + const config = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript' : 'javascript') ?? {}; + const preferencesConfig = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript.preferences' : 'javascript.preferences') ?? {}; const preferences: ts.UserPreferences = { ...config.unstable ?? {}, quotePreference: getQuoteStylePreference(preferencesConfig), diff --git a/plugins/typescript/src/createLanguageService.ts b/plugins/typescript/src/createLanguageService.ts index 094048fde..a4553447a 100644 --- a/plugins/typescript/src/createLanguageService.ts +++ b/plugins/typescript/src/createLanguageService.ts @@ -35,7 +35,7 @@ export * from './configs/getFormatCodeSettings'; export * from './configs/getUserPreferences'; export interface GetConfiguration { - (section: string, scopeUri: string): Promise; + (section: string): Promise; }; export function createLanguageService( diff --git a/plugins/typescript/src/index.ts b/plugins/typescript/src/index.ts index 0e26dd32f..0d3118290 100644 --- a/plugins/typescript/src/index.ts +++ b/plugins/typescript/src/index.ts @@ -42,7 +42,7 @@ export default function (): LanguageServicePlugin { context.typescript.module, context.typescript.languageServiceHost, context.typescript.languageService, - (section, scopeUri) => context.env.configurationHost?.getConfiguration(section, scopeUri) as any, + (section) => context.env.configurationHost?.getConfiguration(section) as any, context.env.rootUri, ); }, @@ -281,7 +281,7 @@ export default function (): LanguageServicePlugin { async format(document, range, options_2) { if (isTsDocument(document)) { - const enable = await context.env.configurationHost?.getConfiguration(getConfigTitle(document) + '.format.enable', document.uri); + const enable = await context.env.configurationHost?.getConfiguration(getConfigTitle(document) + '.format.enable'); if (enable === false) { return; @@ -294,7 +294,7 @@ export default function (): LanguageServicePlugin { async formatOnType(document, position, key, options_2) { if (isTsDocument(document)) { - const enable = await context.env.configurationHost?.getConfiguration(getConfigTitle(document) + '.format.enable', document.uri); + const enable = await context.env.configurationHost?.getConfiguration(getConfigTitle(document) + '.format.enable'); if (enable === false) { return; diff --git a/plugins/typescript/src/services/completions/resolve.ts b/plugins/typescript/src/services/completions/resolve.ts index 09f6b6c60..0e7aeaa56 100644 --- a/plugins/typescript/src/services/completions/resolve.ts +++ b/plugins/typescript/src/services/completions/resolve.ts @@ -84,7 +84,7 @@ export function register( if (document) { - const useCodeSnippetsOnMethodSuggest = await getConfiguration((isTypeScriptDocument(document.uri) ? 'typescript' : 'javascript') + '.suggest.completeFunctionCalls', document.uri) ?? false; + const useCodeSnippetsOnMethodSuggest = await getConfiguration((isTypeScriptDocument(document.uri) ? 'typescript' : 'javascript') + '.suggest.completeFunctionCalls') ?? false; const useCodeSnippet = useCodeSnippetsOnMethodSuggest && (item.kind === vscode.CompletionItemKind.Function || item.kind === vscode.CompletionItemKind.Method); if (useCodeSnippet) {