From ece2deeab67043ca4b1a8a43f6dbfd62807c8e28 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Mon, 11 Mar 2024 14:48:32 +0000 Subject: [PATCH] refactor(compiler-cli): use new import manager for ngtsc transforms (#54983) This commit switches ngtsc's JS and DTS transform to use the new import manager. This is a drop-in replacement as we've updated the translator helpers in the previous commit to align with the new API suggested by the `ImportManagerV2` (to be renamed then). PR Close #54983 --- .../annotations/common/test/metadata_spec.ts | 5 ++-- .../src/ngtsc/transform/src/api.ts | 8 +++--- .../src/ngtsc/transform/src/declaration.ts | 26 +++++++++---------- .../src/ngtsc/transform/src/transform.ts | 12 ++++----- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/packages/compiler-cli/src/ngtsc/annotations/common/test/metadata_spec.ts b/packages/compiler-cli/src/ngtsc/annotations/common/test/metadata_spec.ts index 2623952c3cd..8fa09b359e6 100644 --- a/packages/compiler-cli/src/ngtsc/annotations/common/test/metadata_spec.ts +++ b/packages/compiler-cli/src/ngtsc/annotations/common/test/metadata_spec.ts @@ -10,10 +10,9 @@ import ts from 'typescript'; import {absoluteFrom, getSourceFileOrError} from '../../../file_system'; import {runInEachFileSystem, TestFile} from '../../../file_system/testing'; -import {NoopImportRewriter} from '../../../imports'; import {TypeScriptReflectionHost} from '../../../reflection'; import {getDeclaration, makeProgram} from '../../../testing'; -import {ImportManager, translateStatement} from '../../../translator'; +import {ImportManagerV2, presetImportManagerForceNamespaceImports, translateStatement} from '../../../translator'; import {extractClassMetadata} from '../src/metadata'; runInEachFileSystem(() => { @@ -133,7 +132,7 @@ runInEachFileSystem(() => { return ''; } const sf = getSourceFileOrError(program, _('/index.ts')); - const im = new ImportManager(new NoopImportRewriter(), 'i'); + const im = new ImportManagerV2(presetImportManagerForceNamespaceImports); const stmt = compileClassMetadata(call).toStmt(); const tsStatement = translateStatement(sf, stmt, im); const res = ts.createPrinter().printNode(ts.EmitHint.Unspecified, tsStatement, sf); diff --git a/packages/compiler-cli/src/ngtsc/transform/src/api.ts b/packages/compiler-cli/src/ngtsc/transform/src/api.ts index aeadd6e3810..83fe799962e 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/api.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/api.ts @@ -13,7 +13,7 @@ import {Reexport, ReferenceEmitter} from '../../imports'; import {SemanticSymbol} from '../../incremental/semantic_graph'; import {IndexingContext} from '../../indexer'; import {ClassDeclaration, Decorator, ReflectionHost} from '../../reflection'; -import {ImportManager} from '../../translator'; +import {ImportManagerV2} from '../../translator'; import {TypeCheckContext} from '../../typecheck/api'; import {ExtendedTemplateChecker} from '../../typecheck/extended/api'; import {TemplateSemanticsChecker} from '../../typecheck/template_semantics/api/api'; @@ -264,11 +264,11 @@ export interface ResolveResult { } export interface DtsTransform { - transformClassElement?(element: ts.ClassElement, imports: ImportManager): ts.ClassElement; + transformClassElement?(element: ts.ClassElement, imports: ImportManagerV2): ts.ClassElement; transformFunctionDeclaration? - (element: ts.FunctionDeclaration, imports: ImportManager): ts.FunctionDeclaration; + (element: ts.FunctionDeclaration, imports: ImportManagerV2): ts.FunctionDeclaration; transformClass? (clazz: ts.ClassDeclaration, elements: ReadonlyArray, reflector: ReflectionHost, refEmitter: ReferenceEmitter, - imports: ImportManager): ts.ClassDeclaration; + imports: ImportManagerV2): ts.ClassDeclaration; } diff --git a/packages/compiler-cli/src/ngtsc/transform/src/declaration.ts b/packages/compiler-cli/src/ngtsc/transform/src/declaration.ts index 35a37301e29..3f4f4ac5206 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/declaration.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/declaration.ts @@ -11,10 +11,9 @@ import ts from 'typescript'; import {ImportRewriter, ReferenceEmitter} from '../../imports'; import {ClassDeclaration, ReflectionHost} from '../../reflection'; -import {ImportManager, translateType} from '../../translator'; +import {ImportManagerV2, presetImportManagerForceNamespaceImports, translateType} from '../../translator'; import {DtsTransform} from './api'; -import {addImports} from './utils'; /** * Keeps track of `DtsTransform`s per source file, so that it is known which source files need to @@ -55,11 +54,10 @@ export class DtsTransformRegistry { export function declarationTransformFactory( transformRegistry: DtsTransformRegistry, reflector: ReflectionHost, - refEmitter: ReferenceEmitter, importRewriter: ImportRewriter, - importPrefix?: string): ts.TransformerFactory { + refEmitter: ReferenceEmitter, + importRewriter: ImportRewriter): ts.TransformerFactory { return (context: ts.TransformationContext) => { - const transformer = - new DtsTransformer(context, reflector, refEmitter, importRewriter, importPrefix); + const transformer = new DtsTransformer(context, reflector, refEmitter, importRewriter); return (fileOrBundle) => { if (ts.isBundle(fileOrBundle)) { // Only attempt to transform source files. @@ -80,14 +78,14 @@ export function declarationTransformFactory( class DtsTransformer { constructor( private ctx: ts.TransformationContext, private reflector: ReflectionHost, - private refEmitter: ReferenceEmitter, private importRewriter: ImportRewriter, - private importPrefix?: string) {} + private refEmitter: ReferenceEmitter, private importRewriter: ImportRewriter) {} /** * Transform the declaration file and add any declarations which were recorded. */ transform(sf: ts.SourceFile, transforms: DtsTransform[]): ts.SourceFile { - const imports = new ImportManager(this.importRewriter, this.importPrefix); + const imports = new ImportManagerV2( + {...presetImportManagerForceNamespaceImports, rewriter: this.importRewriter}); const visitor: ts.Visitor = (node: ts.Node): ts.VisitResult => { if (ts.isClassDeclaration(node)) { @@ -103,13 +101,13 @@ class DtsTransformer { // Recursively scan through the AST and process all nodes as desired. sf = ts.visitNode(sf, visitor, ts.isSourceFile) || sf; - // Add new imports for this file. - return addImports(this.ctx.factory, imports, sf); + // Update/insert needed imports. + return imports.transformTsFile(this.ctx, sf); } private transformClassDeclaration( clazz: ts.ClassDeclaration, transforms: DtsTransform[], - imports: ImportManager): ts.ClassDeclaration { + imports: ImportManagerV2): ts.ClassDeclaration { let elements: ts.ClassElement[]|ReadonlyArray = clazz.members; let elementsChanged = false; @@ -158,7 +156,7 @@ class DtsTransformer { private transformFunctionDeclaration( declaration: ts.FunctionDeclaration, transforms: DtsTransform[], - imports: ImportManager): ts.FunctionDeclaration { + imports: ImportManagerV2): ts.FunctionDeclaration { let newDecl = declaration; for (const transform of transforms) { @@ -186,7 +184,7 @@ export class IvyDeclarationDtsTransform implements DtsTransform { transformClass( clazz: ts.ClassDeclaration, members: ReadonlyArray, reflector: ReflectionHost, refEmitter: ReferenceEmitter, - imports: ImportManager): ts.ClassDeclaration { + imports: ImportManagerV2): ts.ClassDeclaration { const original = ts.getOriginalNode(clazz) as ClassDeclaration; if (!this.declarationFields.has(original)) { diff --git a/packages/compiler-cli/src/ngtsc/transform/src/transform.ts b/packages/compiler-cli/src/ngtsc/transform/src/transform.ts index fc934d87a09..c595e5341f1 100644 --- a/packages/compiler-cli/src/ngtsc/transform/src/transform.ts +++ b/packages/compiler-cli/src/ngtsc/transform/src/transform.ts @@ -13,12 +13,11 @@ import {DefaultImportTracker, ImportRewriter, LocalCompilationExtraImportsTracke import {getDefaultImportDeclaration} from '../../imports/src/default'; import {PerfPhase, PerfRecorder} from '../../perf'; import {Decorator, ReflectionHost} from '../../reflection'; -import {ImportManager, RecordWrappedNodeFn, translateExpression, translateStatement, TranslatorOptions} from '../../translator'; +import {ImportManagerV2, presetImportManagerForceNamespaceImports, RecordWrappedNodeFn, translateExpression, translateStatement, TranslatorOptions} from '../../translator'; import {visit, VisitListEntryResult, Visitor} from '../../util/src/visitor'; import {CompileResult} from './api'; import {TraitCompiler} from './compilation'; -import {addImports} from './utils'; const NO_DECORATORS = new Set(); @@ -94,7 +93,7 @@ class IvyTransformationVisitor extends Visitor { constructor( private compilation: TraitCompiler, private classCompilationMap: Map, - private reflector: ReflectionHost, private importManager: ImportManager, + private reflector: ReflectionHost, private importManager: ImportManagerV2, private recordWrappedNodeExpr: RecordWrappedNodeFn, private isClosureCompilerEnabled: boolean, private isCore: boolean, private deferrableImports: Set) { @@ -292,7 +291,8 @@ function transformIvySourceFile( file: ts.SourceFile, isCore: boolean, isClosureCompilerEnabled: boolean, recordWrappedNode: RecordWrappedNodeFn): ts.SourceFile { const constantPool = new ConstantPool(isClosureCompilerEnabled); - const importManager = new ImportManager(importRewriter); + const importManager = + new ImportManagerV2({...presetImportManagerForceNamespaceImports, rewriter: importRewriter}); // The transformation process consists of 2 steps: // @@ -333,12 +333,12 @@ function transformIvySourceFile( // Add extra imports. if (localCompilationExtraImportsTracker !== null) { for (const moduleName of localCompilationExtraImportsTracker.getImportsForFile(sf)) { - importManager.generateSideEffectImport(moduleName); + importManager.addSideEffectImport(sf, moduleName); } } // Add new imports for this file. - sf = addImports(context.factory, importManager, sf, constants); + sf = importManager.transformTsFile(context, sf, constants); if (fileOverviewMeta !== null) { setFileOverviewComment(sf, fileOverviewMeta);