mirror of
https://github.com/angular/angular
synced 2026-05-24 09:28:37 +00:00
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:
parent
4d8d324ea6
commit
ece2deeab6
4 changed files with 24 additions and 27 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in a new issue