angular/packages/language-service/api.ts
Paul Gschwendtner 7663debce1 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: https://github.com/angular/vscode-ng-language-service/pull/2050

PR Close #57000
2024-07-16 08:41:03 -07:00

103 lines
3.1 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
/**
* @module
* @description
* Entry point for all public APIs of the language service package.
*/
import ts from 'typescript';
export interface PluginConfig {
/**
* If true, return only Angular results. Otherwise, return Angular + TypeScript
* results.
*/
angularOnly: boolean;
/**
* If true, enable `strictTemplates` in Angular compiler options regardless
* of its value in tsconfig.json.
*/
forceStrictTemplates?: true;
/**
* If false, disables parsing control flow blocks in the compiler. Should be used only when older
* versions of Angular that do not support blocks (pre-v17) used with the language service.
*/
enableBlockSyntax?: false;
/**
* Version of `@angular/core` that was detected in the user's workspace.
*/
angularCoreVersion?: string;
/**
* If false, disables parsing of `@let` declarations in the compiler.
*/
enableLetSyntax?: false;
}
export type GetTcbResponse = {
/**
* The filename of the SourceFile this typecheck block belongs to.
* The filename is entirely opaque and unstable, useful only for debugging
* purposes.
*/
fileName: string;
/** The content of the SourceFile this typecheck block belongs to. */
content: string;
/**
* Spans over node(s) in the typecheck block corresponding to the
* TS code generated for template node under the current cursor position.
*
* When the cursor position is over a source for which there is no generated
* code, `selections` is empty.
*/
selections: ts.TextSpan[];
};
export type GetComponentLocationsForTemplateResponse = ts.DocumentSpan[];
export type GetTemplateLocationForComponentResponse = ts.DocumentSpan | undefined;
/**
* Function that can be invoked to show progress when computing
* refactoring edits.
*
* Useful for refactorings which take a long time to compute edits for.
*/
export type ApplyRefactoringProgressFn = (percentage: number, updateMessage: string) => void;
/**
* `NgLanguageService` describes an instance of an Angular language service,
* whose API surface is a strict superset of TypeScript's language service.
*/
export interface NgLanguageService extends ts.LanguageService {
getTcb(fileName: string, position: number): GetTcbResponse | undefined;
getComponentLocationsForTemplate(fileName: string): GetComponentLocationsForTemplateResponse;
getTemplateLocationForComponent(
fileName: string,
position: number,
): GetTemplateLocationForComponentResponse;
getTypescriptLanguageService(): ts.LanguageService;
applyRefactoring(
fileName: string,
positionOrRange: number | ts.TextRange,
refactorName: string,
reportProgress: ApplyRefactoringProgressFn,
): ts.RefactorEditInfo | undefined;
hasCodeFixesForErrorCode(errorCode: number): boolean;
}
export function isNgLanguageService(
ls: ts.LanguageService | NgLanguageService,
): ls is NgLanguageService {
return 'getTcb' in ls;
}