Skip to content

Commit 7663deb

Browse files
devversionatscott
authored andcommitted
perf(language-service): quick exit if no code fixes can exist (#57000)
This is a performance optimization that would exit early when code actions are requested, but we know Angular cannot provide fixes based on the error codes. Previously, we would unnecessarily compute and analyze the application for semantic diagnostics. This will be helpful for: angular/vscode-ng-language-service#2050 PR Close #57000
1 parent 9167fc8 commit 7663deb

3 files changed

Lines changed: 19 additions & 0 deletions

File tree

‎packages/language-service/api.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ export interface NgLanguageService extends ts.LanguageService {
9292
refactorName: string,
9393
reportProgress: ApplyRefactoringProgressFn,
9494
): ts.RefactorEditInfo | undefined;
95+
96+
hasCodeFixesForErrorCode(errorCode: number): boolean;
9597
}
9698

9799
export function isNgLanguageService(

‎packages/language-service/src/language_service.ts‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,17 @@ export class LanguageService {
356356
});
357357
}
358358

359+
/**
360+
* Performance helper that can help make quick decisions for
361+
* the VSCode language server to decide whether a code fix exists
362+
* for the given error code.
363+
*
364+
* Related context: https://github.com/angular/vscode-ng-language-service/pull/2050#discussion_r1673079263
365+
*/
366+
hasCodeFixesForErrorCode(errorCode: number): boolean {
367+
return this.codeFixes.codeActionMetas.some((m) => m.errorCodes.includes(errorCode));
368+
}
369+
359370
getCodeFixesAtPosition(
360371
fileName: string,
361372
start: number,
@@ -367,6 +378,11 @@ export class LanguageService {
367378
return this.withCompilerAndPerfTracing<readonly ts.CodeFixAction[]>(
368379
PerfPhase.LsCodeFixes,
369380
(compiler) => {
381+
// Fast exit if we know no code fix can exist for the given range/and error codes.
382+
if (errorCodes.every((code) => !this.hasCodeFixesForErrorCode(code))) {
383+
return [];
384+
}
385+
370386
const templateInfo = getTemplateInfoAtPosition(fileName, start, compiler);
371387
if (templateInfo === undefined) {
372388
return [];

‎packages/language-service/src/ts_plugin.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,6 +350,7 @@ export function create(info: ts.server.PluginCreateInfo): NgLanguageService {
350350
getSignatureHelpItems,
351351
getOutliningSpans,
352352
getTemplateLocationForComponent,
353+
hasCodeFixesForErrorCode: ngLS.hasCodeFixesForErrorCode.bind(ngLS),
353354
getCodeFixesAtPosition,
354355
getCombinedCodeFix,
355356
getTypescriptLanguageService,

0 commit comments

Comments
 (0)