/
githubmirror
/
angular
Обзор
Документация
Войти
/
githubmirror
/
angular
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
packages/language-service/src/compiler_factory.ts
88 строк
3 KB
Andrew Scott
refactor: remove all deep imports in language service
13 апр 2026, 11:16
13 апр 2026, 11:16
1ca9d28
Код
Авторство
О чём код?
/** * @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.dev/license */ import { AbsoluteFsPath, CompilationTicket, NgCompiler, NgCompilerOptions, ProgramDriver, TrackedIncrementalBuildStrategy, freshCompilationTicket, incrementalFromCompilerTicket, resolve, resourceChangeTicket, } from '@angular/compiler-cli'; import {LanguageServiceAdapter} from './adapters'; /** * Manages the `NgCompiler` instance which backs the language service, updating or replacing it as * needed to produce an up-to-date understanding of the current program. * * TODO(alxhub): currently the options used for the compiler are specified at `CompilerFactory` * construction, and are not changeable. In a real project, users can update `tsconfig.json`. We * need to properly handle a change in the compiler options, either by having an API to update the * `CompilerFactory` to use new options, or by replacing it entirely. */ export class CompilerFactory { private readonly incrementalStrategy = new TrackedIncrementalBuildStrategy(); private compiler: NgCompiler | null = null; constructor( private readonly adapter: LanguageServiceAdapter, private readonly programStrategy: ProgramDriver, private readonly options: NgCompilerOptions, ) {} getOrCreate(): NgCompiler { const program = this.programStrategy.getProgram(); const modifiedResourceFiles = new Set<AbsoluteFsPath>(); for (const fileName of this.adapter.getModifiedResourceFiles() ?? []) { modifiedResourceFiles.add(resolve(fileName)); } if (this.compiler !== null && program === this.compiler.getCurrentProgram()) { if (modifiedResourceFiles.size > 0) { // Only resource files have changed since the last NgCompiler was created. const ticket = resourceChangeTicket(this.compiler, modifiedResourceFiles); this.compiler = NgCompiler.fromTicket(ticket, this.adapter); } else { // The previous NgCompiler is being reused, but we still want to reset its performance // tracker to capture only the operations that are needed to service the current request. this.compiler.perfRecorder.reset(); } return this.compiler; } let ticket: CompilationTicket; if (this.compiler === null) { ticket = freshCompilationTicket( program, this.options, this.incrementalStrategy, this.programStrategy, /* perfRecorder */ null, true, true, ); } else { ticket = incrementalFromCompilerTicket( this.compiler, program, this.incrementalStrategy, this.programStrategy, modifiedResourceFiles, /* perfRecorder */ null, ); } this.compiler = NgCompiler.fromTicket(ticket, this.adapter); return this.compiler; } }