refactor(ivy): extract import rewriting into a separate interface (#27998)
Currently the ImportManager class handles various rewriting actions of imports when compiling @angular/core. This is required as code compiled within @angular/core cannot import from '@angular/core'. To work around this, imports are rewritten to get core symbols from a particular file, r3_symbols.ts. In this refactoring, this rewriting logic is moved out of the ImportManager and put behind an interface, ImportRewriter. There are three implementers of the interface: * NoopImportRewriter, used for compiling all non-core packages. * R3SymbolsImportRewriter, used when ngtsc compiles @angular/core. * NgccFlatImportRewriter, used when ngcc compiles @angular/core (special logic is needed because ngcc has to rewrite imports in flat bundles differently than in non-flat bundles). This is a precursor to using this rewriting logic in other contexts besides the ImportManager. PR Close #27998
This commit is contained in:

committed by
Andrew Kushnir

parent
5a0deb8d69
commit
3cf1b62722
@ -16,7 +16,7 @@ import {ComponentDecoratorHandler, DirectiveDecoratorHandler, InjectableDecorato
|
||||
import {BaseDefDecoratorHandler} from './annotations/src/base_def';
|
||||
import {ErrorCode, ngErrorCode} from './diagnostics';
|
||||
import {FlatIndexGenerator, ReferenceGraph, checkForPrivateExports, findFlatIndexEntryPoint} from './entry_point';
|
||||
import {Reference, TsReferenceResolver} from './imports';
|
||||
import {ImportRewriter, NoopImportRewriter, R3SymbolsImportRewriter, Reference, TsReferenceResolver} from './imports';
|
||||
import {PartialEvaluator} from './partial_evaluator';
|
||||
import {TypeScriptReflectionHost} from './reflection';
|
||||
import {FileResourceLoader, HostResourceLoader} from './resource_loader';
|
||||
@ -34,6 +34,7 @@ export class NgtscProgram implements api.Program {
|
||||
private sourceToFactorySymbols: Map<string, Set<string>>|null = null;
|
||||
private host: ts.CompilerHost;
|
||||
private _coreImportsFrom: ts.SourceFile|null|undefined = undefined;
|
||||
private _importRewriter: ImportRewriter|undefined = undefined;
|
||||
private _reflector: TypeScriptReflectionHost|undefined = undefined;
|
||||
private _isCore: boolean|undefined = undefined;
|
||||
private rootDirs: string[];
|
||||
@ -234,7 +235,7 @@ export class NgtscProgram implements api.Program {
|
||||
|
||||
const customTransforms = opts && opts.customTransformers;
|
||||
const beforeTransforms =
|
||||
[ivyTransformFactory(this.compilation !, this.reflector, this.coreImportsFrom)];
|
||||
[ivyTransformFactory(this.compilation !, this.reflector, this.importRewriter, this.isCore)];
|
||||
|
||||
if (this.factoryToSourceInfo !== null) {
|
||||
beforeTransforms.push(
|
||||
@ -303,7 +304,7 @@ export class NgtscProgram implements api.Program {
|
||||
];
|
||||
|
||||
return new IvyCompilation(
|
||||
handlers, checker, this.reflector, this.coreImportsFrom, this.sourceToFactorySymbols);
|
||||
handlers, checker, this.reflector, this.importRewriter, this.sourceToFactorySymbols);
|
||||
}
|
||||
|
||||
private get reflector(): TypeScriptReflectionHost {
|
||||
@ -326,6 +327,16 @@ export class NgtscProgram implements api.Program {
|
||||
}
|
||||
return this._isCore;
|
||||
}
|
||||
|
||||
private get importRewriter(): ImportRewriter {
|
||||
if (this._importRewriter === undefined) {
|
||||
const coreImportsFrom = this.coreImportsFrom;
|
||||
this._importRewriter = coreImportsFrom !== null ?
|
||||
new R3SymbolsImportRewriter(coreImportsFrom.fileName) :
|
||||
new NoopImportRewriter();
|
||||
}
|
||||
return this._importRewriter;
|
||||
}
|
||||
}
|
||||
|
||||
const defaultEmitCallback: api.TsEmitCallback =
|
||||
|
Reference in New Issue
Block a user