From 6e08de8878c07e331bb24ed68fadae849b0543d6 Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Mon, 24 Nov 2025 12:45:19 +0100 Subject: [PATCH 1/3] perf(ls): add cache for linting rules --- .../src/services/validation/validation-service.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/apidom-ls/src/services/validation/validation-service.ts b/packages/apidom-ls/src/services/validation/validation-service.ts index 71810b648..e2d19c5b8 100644 --- a/packages/apidom-ls/src/services/validation/validation-service.ts +++ b/packages/apidom-ls/src/services/validation/validation-service.ts @@ -74,6 +74,8 @@ export class DefaultValidationService implements ValidationService { private quickFixesMap: Record = {}; + private lintingRulesSemanticCache: Map = new Map(); + public constructor() { this.validationEnabled = true; this.commentSeverity = undefined; @@ -143,6 +145,12 @@ export class DefaultValidationService implements ValidationService { } private getLintingRulesSemantic(doc: Element, symbol: string, docNs: string): LinterMeta[] { + const cacheKey = `${docNs}-${symbol}`; + + if (this.lintingRulesSemanticCache.has(cacheKey)) { + return this.lintingRulesSemanticCache.get(cacheKey)!; + } + let meta: LinterMeta[] = []; const elementMeta = toValue(doc.meta.get('metadataMap')?.get(symbol)?.get('lint')); if (elementMeta) { @@ -152,10 +160,12 @@ export class DefaultValidationService implements ValidationService { // get namespace rules with `given` populated as array try { if (!this.settings?.metadata?.rules) { + this.lintingRulesSemanticCache.set(cacheKey, meta); return meta; } const rules = this.settings?.metadata?.rules; if (!rules[docNs]?.lint) { + this.lintingRulesSemanticCache.set(cacheKey, meta); return meta; } meta = meta.concat( @@ -179,6 +189,7 @@ export class DefaultValidationService implements ValidationService { } catch (e) { console.log('error in retrieving semantic rules', e); } + this.lintingRulesSemanticCache.set(cacheKey, meta); return meta; } From 0bf526180c1af5ccc2464c681946470618e34de3 Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Mon, 24 Nov 2025 12:59:01 +0100 Subject: [PATCH 2/3] refactor: use defined const --- .../src/services/validation/validation-service.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/packages/apidom-ls/src/services/validation/validation-service.ts b/packages/apidom-ls/src/services/validation/validation-service.ts index e2d19c5b8..f4fe402a1 100644 --- a/packages/apidom-ls/src/services/validation/validation-service.ts +++ b/packages/apidom-ls/src/services/validation/validation-service.ts @@ -159,15 +159,13 @@ export class DefaultValidationService implements ValidationService { } // get namespace rules with `given` populated as array try { - if (!this.settings?.metadata?.rules) { - this.lintingRulesSemanticCache.set(cacheKey, meta); - return meta; - } const rules = this.settings?.metadata?.rules; - if (!rules[docNs]?.lint) { + + if (!rules || !rules[docNs]?.lint) { this.lintingRulesSemanticCache.set(cacheKey, meta); return meta; } + meta = meta.concat( rules[docNs]!.lint!.filter((r) => { const matchesArray = From 588f48a9ac95ec05ac626258f86fb6164f1abe81 Mon Sep 17 00:00:00 2001 From: Oliwia Rogala Date: Mon, 24 Nov 2025 13:26:02 +0100 Subject: [PATCH 3/3] refactor: set cache after function call --- .../apidom-ls/src/services/validation/validation-service.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/apidom-ls/src/services/validation/validation-service.ts b/packages/apidom-ls/src/services/validation/validation-service.ts index f4fe402a1..e0a2ef3df 100644 --- a/packages/apidom-ls/src/services/validation/validation-service.ts +++ b/packages/apidom-ls/src/services/validation/validation-service.ts @@ -162,7 +162,6 @@ export class DefaultValidationService implements ValidationService { const rules = this.settings?.metadata?.rules; if (!rules || !rules[docNs]?.lint) { - this.lintingRulesSemanticCache.set(cacheKey, meta); return meta; } @@ -187,7 +186,6 @@ export class DefaultValidationService implements ValidationService { } catch (e) { console.log('error in retrieving semantic rules', e); } - this.lintingRulesSemanticCache.set(cacheKey, meta); return meta; } @@ -691,6 +689,7 @@ export class DefaultValidationService implements ValidationService { set.forEach((s) => { // get linter meta from meta const semanticLintingRules = this.getLintingRulesSemantic(api, s, docNs); + this.lintingRulesSemanticCache.set(`${docNs}-${s}`, semanticLintingRules); if (semanticLintingRules && semanticLintingRules.length > 0) { for (const meta of semanticLintingRules) { this.processRule(