Skip to content

Commit 54eae2a

Browse files
committed
perf: optimize configuration file update handling
Use dirty flag to detect changes in pgsql_hacker_helper.json and update internal state lazily instead of constant parsing this file each time.
1 parent 4f7e386 commit 54eae2a

File tree

4 files changed

+48
-99
lines changed

4 files changed

+48
-99
lines changed

src/configuration.ts

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import * as vscode from 'vscode';
33
import * as vars from './variables';
44
import * as utils from './utils';
55
import { Log as logger } from './logger';
6+
import { Configuration } from './extension';
67

78
export interface VariablesConfiguration {
89
/* Array special members */
@@ -504,7 +505,7 @@ export function parseVariablesConfiguration(configFile: unknown): VariablesConfi
504505
}
505506
}
506507

507-
export async function readConfigFile(file: vscode.Uri) {
508+
async function readConfigFile(file: vscode.Uri) {
508509
let document;
509510
try {
510511
document = await vscode.workspace.openTextDocument(file);
@@ -543,54 +544,52 @@ let formatterConfig: PgindentConfiguration | undefined;
543544
/* Flag indicating that configuration file should be refreshed */
544545
let configDirty = true;
545546

546-
export function getVariablesConfiguration(): VariablesConfiguration | undefined {
547-
return variablesConfig;
548-
}
549-
550-
export function getFormatterConfiguration(): PgindentConfiguration | undefined {
551-
return formatterConfig;
552-
}
553-
554-
export async function refreshVariablesConfiguration(file: vscode.Uri) {
547+
async function checkConfigurationFresh() {
555548
if (!configDirty) {
556549
return;
557550
}
558-
559-
const config = await readConfigFile(file);
560-
if (!config) {
561-
return;
562-
}
563551

564-
variablesConfig = parseVariablesConfiguration(config);
552+
await refreshConfiguration();
565553
configDirty = false;
566554
}
567555

568-
export async function refreshFormatterConfiguration(file: vscode.Uri) {
569-
if (!configDirty) {
570-
return;
571-
}
572-
573-
const config = await readConfigFile(file);
574-
if (!config) {
575-
return;
576-
}
556+
export async function getVariablesConfiguration() {
557+
await checkConfigurationFresh();
558+
return variablesConfig;
559+
}
577560

578-
formatterConfig = parseFormatterConfiguration(config);
579-
configDirty = false;
561+
export async function getFormatterConfiguration() {
562+
await checkConfigurationFresh();
563+
return formatterConfig;
580564
}
581565

582-
export async function refreshConfiguration(file: vscode.Uri) {
583-
if (!configDirty) {
584-
return;
585-
}
566+
export async function refreshConfiguration() {
567+
/* Do not check 'dirtyFlag', because this function must be invoked explicitly */
586568

587-
const config = await readConfigFile(file);
588-
if (!config) {
569+
if (!vscode.workspace.workspaceFolders?.length) {
589570
return;
590571
}
591572

592-
formatterConfig = parseFormatterConfiguration(config);
593-
variablesConfig = parseVariablesConfiguration(config);
573+
for (const folder of vscode.workspace.workspaceFolders) {
574+
const file = Configuration.getConfigFile(folder.uri);
575+
const config = await readConfigFile(file);
576+
if (!config) {
577+
return;
578+
}
579+
580+
try {
581+
formatterConfig = parseFormatterConfiguration(config);
582+
} catch (err) {
583+
logger.error('could not parse formatter configuration', err);
584+
}
585+
586+
try {
587+
variablesConfig = parseVariablesConfiguration(config);
588+
} catch (err) {
589+
logger.error('could not parse variables configuration', err);
590+
}
591+
}
592+
594593
configDirty = false;
595594
}
596595

src/extension.ts

Lines changed: 10 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Features } from './utils';
44
import * as vars from './variables';
55
import * as dbg from './debugger';
66
import * as dap from './dap';
7-
import { refreshConfiguration, refreshVariablesConfiguration } from './configuration';
7+
import { markConfigFileDirty, refreshConfiguration } from './configuration';
88
import { Log as logger } from './logger';
99
import { setupPgConfSupport } from './pgconf';
1010
import { setupFormatting } from './formatter';
@@ -515,49 +515,16 @@ function setupPgVariablesView(context: vscode.ExtensionContext) {
515515
const pgvars = createPgVariablesView(context, nodeVars);
516516

517517
setupNodeTagFiles(context, nodeVars);
518-
519-
/* Refresh config files when debug session starts */
520-
vscode.debug.onDidStartDebugSession(async _ => {
521-
if (!vscode.workspace.workspaceFolders?.length) {
522-
return;
523-
}
524-
525-
for (const folder of vscode.workspace.workspaceFolders) {
526-
logger.info('refreshing configuration files due to debug session start');
527-
try {
528-
const file = Configuration.getConfigFile(folder.uri);
529-
await refreshVariablesConfiguration(file);
530-
} catch (err: unknown) {
531-
logger.error('could not refresh configuration in workspace %s', folder.uri.fsPath, err);
532-
}
533-
}
534-
}, undefined, context.subscriptions);
535518

536519
return pgvars;
537520
}
538521

539522
function setupConfigurationFile(context: vscode.ExtensionContext) {
540523
/* Mark configuration dirty when user changes it - no eager parsing */
541-
/*
542-
* TODO: use dirty flag, instead of eager parsing
543-
* const configFileWatcher = vscode.workspace.createFileSystemWatcher(Configuration.ExtensionSettingsFileName, false, false, true);
544-
* context.subscriptions.push(configFileWatcher);
545-
* configFileWatcher.onDidChange(() => markConfigFileDirty());
546-
* configFileWatcher.onDidCreate(() => markConfigFileDirty());
547-
*/
548-
549-
/* Refresh config files when debug session starts */
550-
vscode.debug.onDidStartDebugSession(async _ => {
551-
if (!vscode.workspace.workspaceFolders?.length) {
552-
return;
553-
}
554-
555-
logger.info('refreshing configuration files due to debug session start');
556-
for (const folder of vscode.workspace.workspaceFolders) {
557-
const file = Configuration.getConfigFile(folder.uri);
558-
await refreshVariablesConfiguration(file);
559-
}
560-
}, undefined, context.subscriptions);
524+
const configFileWatcher = vscode.workspace.createFileSystemWatcher(Configuration.ExtensionSettingsFileName, false, false, true);
525+
context.subscriptions.push(configFileWatcher);
526+
configFileWatcher.onDidChange(markConfigFileDirty, undefined, context.subscriptions);
527+
configFileWatcher.onDidCreate(markConfigFileDirty, undefined, context.subscriptions);
561528
}
562529

563530
function registerCommands(context: vscode.ExtensionContext, pgvars: vars.PgVariablesViewProvider) {
@@ -611,18 +578,11 @@ function registerCommands(context: vscode.ExtensionContext, pgvars: vars.PgVaria
611578

612579
/* Refresh config file command */
613580
const refreshConfigCmd = async () => {
614-
if (!vscode.workspace.workspaceFolders?.length) {
615-
return;
616-
}
617-
618581
logger.info('refreshing config file due to command execution');
619-
for (const folder of vscode.workspace.workspaceFolders) {
620-
try {
621-
const file = Configuration.getConfigFile(folder.uri);
622-
await refreshConfiguration(file);
623-
} catch (err: unknown) {
624-
logger.error('could not refresh configuration in workspace %s', folder.uri.fsPath, err);
625-
}
582+
try {
583+
await refreshConfiguration();
584+
} catch (err: unknown) {
585+
logger.error('could not refresh configuration', err);
626586
}
627587
};
628588

@@ -761,6 +721,7 @@ function registerCommands(context: vscode.ExtensionContext, pgvars: vars.PgVaria
761721

762722
async function setupNodeTagFiles(context: vscode.ExtensionContext,
763723
nodeVars: vars.NodeVarRegistry) {
724+
/* TODO: remove this thing with setting */
764725
const getNodeTagFiles = () => {
765726
/* TODO: remove this setting */
766727
const customNodeTagFiles = Configuration.getCustomNodeTagFiles();

src/formatter.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ import * as utils from './utils';
44
import { Log as logger } from './logger';
55
import { getWellKnownBuiltinContribs } from './constants';
66
import { Configuration } from './extension';
7-
import { parseFormatterConfiguration,
8-
PgindentConfiguration,
9-
readConfigFile } from './configuration';
7+
import { getFormatterConfiguration,
8+
PgindentConfiguration } from './configuration';
109
import { PghhError } from './error';
1110
import * as path from 'path';
1211
import * as os from 'os';
@@ -237,17 +236,7 @@ class PgindentDocumentFormatterProvider implements vscode.DocumentFormattingEdit
237236
}
238237

239238
private async getTypedefsFromConfiguration(workspace: vscode.WorkspaceFolder) {
240-
const file = Configuration.getConfigFile(workspace.uri);
241-
if (!await utils.fileExists(file)) {
242-
return [];
243-
}
244-
245-
const configObj = await readConfigFile(file);
246-
if (!configObj) {
247-
return [];
248-
}
249-
250-
const config = parseFormatterConfiguration(configObj);
239+
const config = await getFormatterConfiguration();
251240
if (!config?.typedefs?.length) {
252241
return [];
253242
}

src/variables.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5433,7 +5433,7 @@ export class PgVariablesViewProvider implements vscode.TreeDataProvider<Variable
54335433
}
54345434

54355435
async initializeExecContextFromConfig(context: ExecContext) {
5436-
const config = getVariablesConfiguration();
5436+
const config = await getVariablesConfiguration();
54375437
if (!config) {
54385438
return;
54395439
}

0 commit comments

Comments
 (0)