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
This commit is contained in:
Paul Gschwendtner 2024-03-11 14:48:32 +00:00 committed by Dylan Hunn
parent 4d8d324ea6
commit ece2deeab6
4 changed files with 24 additions and 27 deletions

View file

@ -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);

View file

@ -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<R> {
}
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<ts.ClassElement>,
reflector: ReflectionHost, refEmitter: ReferenceEmitter,
imports: ImportManager): ts.ClassDeclaration;
imports: ImportManagerV2): ts.ClassDeclaration;
}

View file

@ -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<ts.SourceFile> {
refEmitter: ReferenceEmitter,
importRewriter: ImportRewriter): ts.TransformerFactory<ts.SourceFile> {
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<ts.Node> => {
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<ts.ClassElement> = 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<ts.ClassElement>,
reflector: ReflectionHost, refEmitter: ReferenceEmitter,
imports: ImportManager): ts.ClassDeclaration {
imports: ImportManagerV2): ts.ClassDeclaration {
const original = ts.getOriginalNode(clazz) as ClassDeclaration;
if (!this.declarationFields.has(original)) {

View file

@ -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<ts.Decorator>();
@ -94,7 +93,7 @@ class IvyTransformationVisitor extends Visitor {
constructor(
private compilation: TraitCompiler,
private classCompilationMap: Map<ts.ClassDeclaration, CompileResult[]>,
private reflector: ReflectionHost, private importManager: ImportManager,
private reflector: ReflectionHost, private importManager: ImportManagerV2,
private recordWrappedNodeExpr: RecordWrappedNodeFn<ts.Expression>,
private isClosureCompilerEnabled: boolean, private isCore: boolean,
private deferrableImports: Set<ts.ImportDeclaration>) {
@ -292,7 +291,8 @@ function transformIvySourceFile(
file: ts.SourceFile, isCore: boolean, isClosureCompilerEnabled: boolean,
recordWrappedNode: RecordWrappedNodeFn<ts.Expression>): 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);