From 4525122803063f3cc3d3241d291e0d2fc502910a Mon Sep 17 00:00:00 2001 From: Andrew Scott Date: Wed, 8 Nov 2023 09:33:53 -0800 Subject: [PATCH] refactor(language-service): Add flag to allow disabling block syntax parsing (#52691) This commit adds a flag to the language service config options to disable block parsing in the compiler. PR Close #52691 --- packages/language-service/api.ts | 6 ++++++ packages/language-service/src/language_service.ts | 15 ++++++--------- .../test/legacy/language_service_spec.ts | 11 +++++++++++ 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/packages/language-service/api.ts b/packages/language-service/api.ts index 2039720abf434..0d539c0fdb593 100644 --- a/packages/language-service/api.ts +++ b/packages/language-service/api.ts @@ -25,6 +25,12 @@ export interface PluginConfig { * 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; } export type GetTcbResponse = { diff --git a/packages/language-service/src/language_service.ts b/packages/language-service/src/language_service.ts index da636b31de320..8d0a27ebafec6 100644 --- a/packages/language-service/src/language_service.ts +++ b/packages/language-service/src/language_service.ts @@ -17,7 +17,7 @@ import {isNamedClassDeclaration} from '@angular/compiler-cli/src/ngtsc/reflectio import {OptimizeFor} from '@angular/compiler-cli/src/ngtsc/typecheck/api'; import ts from 'typescript/lib/tsserverlibrary'; -import {GetComponentLocationsForTemplateResponse, GetTcbResponse, GetTemplateLocationForComponentResponse} from '../api'; +import {GetComponentLocationsForTemplateResponse, GetTcbResponse, GetTemplateLocationForComponentResponse, PluginConfig} from '../api'; import {LanguageServiceAdapter, LSParseConfigHost} from './adapters'; import {ALL_CODE_FIXES_METAS, CodeFixes} from './codefixes'; @@ -33,13 +33,7 @@ import {getTargetAtPosition, getTcbNodesOfTemplateAtPosition, TargetNodeKind} fr import {findTightestNode, getClassDeclFromDecoratorProp, getParentClassDeclaration, getPropertyAssignmentFromValue} from './ts_utils'; import {getTemplateInfoAtPosition, isTypeScriptFile} from './utils'; -interface LanguageServiceConfig { - /** - * If true, enable `strictTemplates` in Angular compiler options regardless - * of its value in tsconfig.json. - */ - forceStrictTemplates?: true; -} +type LanguageServiceConfig = Omit; export class LanguageService { private options: CompilerOptions; @@ -52,7 +46,7 @@ export class LanguageService { constructor( private readonly project: ts.server.Project, private readonly tsLS: ts.LanguageService, - private readonly config: LanguageServiceConfig, + private readonly config: Omit, ) { this.parseConfigHost = new LSParseConfigHost(project.projectService.host); this.options = parseNgCompilerOptions(project, this.parseConfigHost, config); @@ -525,6 +519,9 @@ function parseNgCompilerOptions( if (config.forceStrictTemplates === true) { options.strictTemplates = true; } + if (config.enableBlockSyntax === false) { + options['_enableBlockSyntax'] = false; + } return options; } diff --git a/packages/language-service/test/legacy/language_service_spec.ts b/packages/language-service/test/legacy/language_service_spec.ts index 2c1cb7531a8a0..71d04b0b51174 100644 --- a/packages/language-service/test/legacy/language_service_spec.ts +++ b/packages/language-service/test/legacy/language_service_spec.ts @@ -81,6 +81,17 @@ describe('language service adapter', () => { strictTemplates: true, })); }); + + it('should always disable block syntax if enableBlockSyntax is false', () => { + const {project, tsLS, configFileFs} = setup(); + const ngLS = new LanguageService(project, tsLS, { + enableBlockSyntax: false, + }); + + expect(ngLS.getCompilerOptions()).toEqual(jasmine.objectContaining({ + '_enableBlockSyntax': false, + })); + }); }); describe('compiler options diagnostics', () => {