Skip to content

Commit

Permalink
perf: cache configs
Browse files Browse the repository at this point in the history
close #2062
  • Loading branch information
johnsoncodehk committed Nov 28, 2022
1 parent 0de974b commit 5fdd89c
Show file tree
Hide file tree
Showing 10 changed files with 30 additions and 20 deletions.
12 changes: 11 additions & 1 deletion packages/language-server/src/utils/configurationHost.ts
Expand Up @@ -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<string, any> = {};

connection.onDidChangeConfiguration(async () => {
for (const cb of callbacks) {
Expand All @@ -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 */;
}
}
8 changes: 4 additions & 4 deletions plugins/css/src/index.ts
Expand Up @@ -45,7 +45,7 @@ export default function (): LanguageServicePlugin {
if (!context.env.documentContext)
return;

const settings = await context.env.configurationHost?.getConfiguration<css.LanguageSettings>(document.languageId, document.uri);
const settings = await context.env.configurationHost?.getConfiguration<css.LanguageSettings>(document.languageId);
const cssResult = await cssLs.doComplete2(document, position, stylesheet, context.env.documentContext, settings?.completion);

return cssResult;
Expand Down Expand Up @@ -95,7 +95,7 @@ export default function (): LanguageServicePlugin {
async onSyntactic(document) {
return worker(document, async (stylesheet, cssLs) => {

const settings = await context.env.configurationHost?.getConfiguration<css.LanguageSettings>(document.languageId, document.uri);
const settings = await context.env.configurationHost?.getConfiguration<css.LanguageSettings>(document.languageId);

return cssLs.doValidation(document, stylesheet, settings) as vscode.Diagnostic[];
});
Expand All @@ -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<css.LanguageSettings>(document.languageId, document.uri);
const settings = await context.env.configurationHost?.getConfiguration<css.LanguageSettings>(document.languageId);

return cssLs.doHover(document, position, stylesheet, settings?.hover);
});
Expand Down Expand Up @@ -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<css.CSSFormatConfiguration & { enable: boolean; }>(document.languageId + '.format', document.uri);
const options_2 = await context.env.configurationHost?.getConfiguration<css.CSSFormatConfiguration & { enable: boolean; }>(document.languageId + '.format');

if (options_2?.enable === false) {
return;
Expand Down
8 changes: 4 additions & 4 deletions plugins/html/src/index.ts
Expand Up @@ -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.CompletionConfiguration>('html.completion', document.uri);
const configs = await context.env.configurationHost?.getConfiguration<html.CompletionConfiguration>('html.completion');

if (context.env.documentContext) {
return htmlLs.doComplete2(document, position, htmlDocument, context.env.documentContext, configs);
Expand All @@ -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.HoverSettings>('html.hover', document.uri);
const hoverSettings = await context.env.configurationHost?.getConfiguration<html.HoverSettings>('html.hover');

return htmlLs.doHover(document, position, htmlDocument, hoverSettings);
});
Expand Down Expand Up @@ -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.HTMLFormatConfiguration & { enable: boolean; }>('html.format', document.uri);
const options_2 = await context.env.configurationHost?.getConfiguration<html.HTMLFormatConfiguration & { enable: boolean; }>('html.format');

if (options_2?.enable === false) {
return;
Expand Down Expand Up @@ -166,7 +166,7 @@ export default function (options: {

if (enabled) {

const text = htmlLs.doQuoteComplete(document, position, htmlDocument, await context.env.configurationHost?.getConfiguration<html.CompletionConfiguration>('html.completion', document.uri));
const text = htmlLs.doQuoteComplete(document, position, htmlDocument, await context.env.configurationHost?.getConfiguration<html.CompletionConfiguration>('html.completion'));

if (text) {
return text;
Expand Down
2 changes: 1 addition & 1 deletion plugins/json/src/index.ts
Expand Up @@ -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.FormattingOptions & { enable: boolean; }>('json.format', document.uri);
const options_2 = await context.env.configurationHost?.getConfiguration<json.FormattingOptions & { enable: boolean; }>('json.format');

if (options_2?.enable === false) {
return;
Expand Down
4 changes: 2 additions & 2 deletions plugins/pug/src/index.ts
Expand Up @@ -63,7 +63,7 @@ export default function (): LanguageServicePlugin & ReturnType<typeof useHtmlPlu
doHover(document, position) {
return worker(document, async (pugDocument) => {

const hoverSettings = await context.env.configurationHost?.getConfiguration<html.HoverSettings>('html.hover', document.uri);
const hoverSettings = await context.env.configurationHost?.getConfiguration<html.HoverSettings>('html.hover');

return pugLs.doHover(pugDocument, position, hoverSettings);
});
Expand Down Expand Up @@ -114,7 +114,7 @@ export default function (): LanguageServicePlugin & ReturnType<typeof useHtmlPlu

if (enabled) {

const text = pugLs.doQuoteComplete(pugDocument, position, await context.env.configurationHost?.getConfiguration<html.CompletionConfiguration>('html.completion', document.uri));
const text = pugLs.doQuoteComplete(pugDocument, position, await context.env.configurationHost?.getConfiguration<html.CompletionConfiguration>('html.completion'));

if (text) {
return text;
Expand Down
2 changes: 1 addition & 1 deletion plugins/typescript/src/configs/getFormatCodeSettings.ts
Expand Up @@ -9,7 +9,7 @@ export async function getFormatCodeSettings(
options?: vscode.FormattingOptions,
): Promise<ts.FormatCodeSettings> {

let config = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript.format' : 'javascript.format', uri);
let config = await getConfiguration(isTypeScriptDocument(uri) ? 'typescript.format' : 'javascript.format');

config = config ?? {};

Expand Down
4 changes: 2 additions & 2 deletions plugins/typescript/src/configs/getUserPreferences.ts
Expand Up @@ -10,8 +10,8 @@ export async function getUserPreferences(
workspaceFolder: URI | undefined,
): Promise<ts.UserPreferences> {

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),
Expand Down
2 changes: 1 addition & 1 deletion plugins/typescript/src/createLanguageService.ts
Expand Up @@ -35,7 +35,7 @@ export * from './configs/getFormatCodeSettings';
export * from './configs/getUserPreferences';

export interface GetConfiguration {
<T = any>(section: string, scopeUri: string): Promise<T | undefined>;
<T = any>(section: string): Promise<T | undefined>;
};

export function createLanguageService(
Expand Down
6 changes: 3 additions & 3 deletions plugins/typescript/src/index.ts
Expand Up @@ -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,
);
},
Expand Down Expand Up @@ -281,7 +281,7 @@ export default function (): LanguageServicePlugin {
async format(document, range, options_2) {
if (isTsDocument(document)) {

const enable = await context.env.configurationHost?.getConfiguration<boolean>(getConfigTitle(document) + '.format.enable', document.uri);
const enable = await context.env.configurationHost?.getConfiguration<boolean>(getConfigTitle(document) + '.format.enable');

if (enable === false) {
return;
Expand All @@ -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<boolean>(getConfigTitle(document) + '.format.enable', document.uri);
const enable = await context.env.configurationHost?.getConfiguration<boolean>(getConfigTitle(document) + '.format.enable');

if (enable === false) {
return;
Expand Down
2 changes: 1 addition & 1 deletion plugins/typescript/src/services/completions/resolve.ts
Expand Up @@ -84,7 +84,7 @@ export function register(

if (document) {

const useCodeSnippetsOnMethodSuggest = await getConfiguration<boolean>((isTypeScriptDocument(document.uri) ? 'typescript' : 'javascript') + '.suggest.completeFunctionCalls', document.uri) ?? false;
const useCodeSnippetsOnMethodSuggest = await getConfiguration<boolean>((isTypeScriptDocument(document.uri) ? 'typescript' : 'javascript') + '.suggest.completeFunctionCalls') ?? false;
const useCodeSnippet = useCodeSnippetsOnMethodSuggest && (item.kind === vscode.CompletionItemKind.Function || item.kind === vscode.CompletionItemKind.Method);

if (useCodeSnippet) {
Expand Down

0 comments on commit 5fdd89c

Please sign in to comment.