refactor(compiler): move symbol extraction to AotCompiler
This commit is contained in:
parent
2235048432
commit
b15039d228
@ -62,11 +62,11 @@ export class CodeGenerator {
|
|||||||
return path.join(this.options.genDir, relativePath);
|
return path.join(this.options.genDir, relativePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
codegen(options: {transitiveModules: boolean}): Promise<any> {
|
codegen(): Promise<any> {
|
||||||
const staticSymbols =
|
return this.compiler
|
||||||
extractProgramSymbols(this.program, this.staticReflector, this.ngHost, this.options);
|
.compileAll(
|
||||||
|
this.program.getSourceFiles().map(sf => this.ngHost.getCanonicalFileName(sf.fileName)))
|
||||||
return this.compiler.compileModules(staticSymbols, options).then(generatedModules => {
|
.then(generatedModules => {
|
||||||
generatedModules.forEach(generatedModule => {
|
generatedModules.forEach(generatedModule => {
|
||||||
const sourceFile = this.program.getSourceFile(generatedModule.fileUrl);
|
const sourceFile = this.program.getSourceFile(generatedModule.fileUrl);
|
||||||
const emitPath = this.calculateEmitPath(generatedModule.moduleUrl);
|
const emitPath = this.calculateEmitPath(generatedModule.moduleUrl);
|
||||||
@ -78,7 +78,14 @@ export class CodeGenerator {
|
|||||||
|
|
||||||
static create(
|
static create(
|
||||||
options: AngularCompilerOptions, cliOptions: NgcCliOptions, program: ts.Program,
|
options: AngularCompilerOptions, cliOptions: NgcCliOptions, program: ts.Program,
|
||||||
compilerHost: ts.CompilerHost, ngHost?: NgHost): CodeGenerator {
|
compilerHost: ts.CompilerHost, ngHostContext?: NgHostContext,
|
||||||
|
ngHost?: NgHost): CodeGenerator {
|
||||||
|
if (!ngHost) {
|
||||||
|
const usePathMapping = !!options.rootDirs && options.rootDirs.length > 0;
|
||||||
|
ngHost = usePathMapping ?
|
||||||
|
new PathMappedNgHost(program, compilerHost, options, ngHostContext) :
|
||||||
|
new NgHost(program, compilerHost, options, ngHostContext);
|
||||||
|
}
|
||||||
const transFile = cliOptions.i18nFile;
|
const transFile = cliOptions.i18nFile;
|
||||||
const locale = cliOptions.locale;
|
const locale = cliOptions.locale;
|
||||||
let transContent: string = '';
|
let transContent: string = '';
|
||||||
@ -93,7 +100,9 @@ export class CodeGenerator {
|
|||||||
debug: options.debug === true,
|
debug: options.debug === true,
|
||||||
translations: transContent,
|
translations: transContent,
|
||||||
i18nFormat: cliOptions.i18nFormat,
|
i18nFormat: cliOptions.i18nFormat,
|
||||||
locale: cliOptions.locale
|
locale: cliOptions.locale,
|
||||||
|
excludeFilePattern: options.generateCodeForLibraries === false ? GENERATED_OR_DTS_FILES :
|
||||||
|
GENERATED_FILES
|
||||||
});
|
});
|
||||||
return new CodeGenerator(options, program, compilerHost, reflector, aotCompiler, ngHost);
|
return new CodeGenerator(options, program, compilerHost, reflector, aotCompiler, ngHost);
|
||||||
}
|
}
|
||||||
@ -102,37 +111,10 @@ export class CodeGenerator {
|
|||||||
export function extractProgramSymbols(
|
export function extractProgramSymbols(
|
||||||
program: ts.Program, staticReflector: compiler.StaticReflector, ngHost: NgHost,
|
program: ts.Program, staticReflector: compiler.StaticReflector, ngHost: NgHost,
|
||||||
options: AngularCompilerOptions): compiler.StaticSymbol[] {
|
options: AngularCompilerOptions): compiler.StaticSymbol[] {
|
||||||
// Compare with false since the default should be true
|
return compiler.extractProgramSymbols(
|
||||||
const skipFileNames =
|
staticReflector, program.getSourceFiles().map(sf => ngHost.getCanonicalFileName(sf.fileName)),
|
||||||
options.generateCodeForLibraries === false ? GENERATED_OR_DTS_FILES : GENERATED_FILES;
|
{
|
||||||
|
excludeFilePattern: options.generateCodeForLibraries === false ? GENERATED_OR_DTS_FILES :
|
||||||
const staticSymbols: compiler.StaticSymbol[] = [];
|
GENERATED_FILES
|
||||||
|
|
||||||
program.getSourceFiles()
|
|
||||||
.filter(sourceFile => !skipFileNames.test(sourceFile.fileName))
|
|
||||||
.forEach(sourceFile => {
|
|
||||||
const absSrcPath = ngHost.getCanonicalFileName(sourceFile.fileName);
|
|
||||||
|
|
||||||
const moduleMetadata = staticReflector.getModuleMetadata(absSrcPath);
|
|
||||||
if (!moduleMetadata) {
|
|
||||||
console.log(`WARNING: no metadata found for ${absSrcPath}`);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const metadata = moduleMetadata['metadata'];
|
|
||||||
|
|
||||||
if (!metadata) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const symbol of Object.keys(metadata)) {
|
|
||||||
if (metadata[symbol] && metadata[symbol].__symbolic == 'error') {
|
|
||||||
// Ignore symbols that are only included to record error information.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
staticSymbols.push(staticReflector.findDeclaration(absSrcPath, symbol, absSrcPath));
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
return staticSymbols;
|
|
||||||
}
|
}
|
||||||
|
@ -19,9 +19,7 @@ import {CodeGenerator} from './codegen';
|
|||||||
function codegen(
|
function codegen(
|
||||||
ngOptions: tsc.AngularCompilerOptions, cliOptions: tsc.NgcCliOptions, program: ts.Program,
|
ngOptions: tsc.AngularCompilerOptions, cliOptions: tsc.NgcCliOptions, program: ts.Program,
|
||||||
host: ts.CompilerHost) {
|
host: ts.CompilerHost) {
|
||||||
return CodeGenerator.create(ngOptions, cliOptions, program, host).codegen({
|
return CodeGenerator.create(ngOptions, cliOptions, program, host).codegen();
|
||||||
transitiveModules: true
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// CLI entry point
|
// CLI entry point
|
||||||
|
@ -23,100 +23,14 @@ import {CompiledStylesheet, StyleCompiler} from '../style_compiler';
|
|||||||
import {TemplateParser} from '../template_parser/template_parser';
|
import {TemplateParser} from '../template_parser/template_parser';
|
||||||
import {ComponentFactoryDependency, DirectiveWrapperDependency, ViewClassDependency, ViewCompileResult, ViewCompiler} from '../view_compiler/view_compiler';
|
import {ComponentFactoryDependency, DirectiveWrapperDependency, ViewClassDependency, ViewCompileResult, ViewCompiler} from '../view_compiler/view_compiler';
|
||||||
|
|
||||||
|
import {AotCompilerOptions} from './compiler_options';
|
||||||
|
import {StaticReflector} from './static_reflector';
|
||||||
import {StaticSymbol} from './static_symbol';
|
import {StaticSymbol} from './static_symbol';
|
||||||
|
|
||||||
export class SourceModule {
|
export class SourceModule {
|
||||||
constructor(public fileUrl: string, public moduleUrl: string, public source: string) {}
|
constructor(public fileUrl: string, public moduleUrl: string, public source: string) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface NgAnalyzedModules {
|
|
||||||
ngModules: CompileNgModuleMetadata[];
|
|
||||||
ngModuleByPipeOrDirective: Map<StaticSymbol, CompileNgModuleMetadata>;
|
|
||||||
files: Array<{srcUrl: string, directives: StaticSymbol[], ngModules: StaticSymbol[]}>;
|
|
||||||
symbolsMissingModule?: StaticSymbol[];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns all the source files and a mapping from modules to directives
|
|
||||||
export function analyzeNgModules(
|
|
||||||
programStaticSymbols: StaticSymbol[], options: {transitiveModules: boolean},
|
|
||||||
metadataResolver: CompileMetadataResolver): NgAnalyzedModules {
|
|
||||||
const {ngModules, symbolsMissingModule} =
|
|
||||||
_createNgModules(programStaticSymbols, options, metadataResolver);
|
|
||||||
return _analyzeNgModules(ngModules, symbolsMissingModule);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
export function analyzeAndValidateNgModules(
|
|
||||||
programStaticSymbols: StaticSymbol[], options: {transitiveModules: boolean},
|
|
||||||
metadataResolver: CompileMetadataResolver): NgAnalyzedModules {
|
|
||||||
const result = analyzeNgModules(programStaticSymbols, options, metadataResolver);
|
|
||||||
if (result.symbolsMissingModule && result.symbolsMissingModule.length) {
|
|
||||||
const messages = result.symbolsMissingModule.map(
|
|
||||||
s => `Cannot determine the module for class ${s.name} in ${s.filePath}!`);
|
|
||||||
throw new Error(messages.join('\n'));
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wait for the directives in the given modules have been loaded
|
|
||||||
export function loadNgModuleDirectives(ngModules: CompileNgModuleMetadata[]) {
|
|
||||||
return Promise
|
|
||||||
.all(ListWrapper.flatten(ngModules.map(
|
|
||||||
(ngModule) => ngModule.transitiveModule.directiveLoaders.map(loader => loader()))))
|
|
||||||
.then(() => {});
|
|
||||||
}
|
|
||||||
|
|
||||||
function _analyzeNgModules(
|
|
||||||
ngModuleMetas: CompileNgModuleMetadata[],
|
|
||||||
symbolsMissingModule: StaticSymbol[]): NgAnalyzedModules {
|
|
||||||
const moduleMetasByRef = new Map<any, CompileNgModuleMetadata>();
|
|
||||||
ngModuleMetas.forEach((ngModule) => moduleMetasByRef.set(ngModule.type.reference, ngModule));
|
|
||||||
const ngModuleByPipeOrDirective = new Map<StaticSymbol, CompileNgModuleMetadata>();
|
|
||||||
const ngModulesByFile = new Map<string, StaticSymbol[]>();
|
|
||||||
const ngDirectivesByFile = new Map<string, StaticSymbol[]>();
|
|
||||||
const filePaths = new Set<string>();
|
|
||||||
|
|
||||||
// Looping over all modules to construct:
|
|
||||||
// - a map from file to modules `ngModulesByFile`,
|
|
||||||
// - a map from file to directives `ngDirectivesByFile`,
|
|
||||||
// - a map from directive/pipe to module `ngModuleByPipeOrDirective`.
|
|
||||||
ngModuleMetas.forEach((ngModuleMeta) => {
|
|
||||||
const srcFileUrl = ngModuleMeta.type.reference.filePath;
|
|
||||||
filePaths.add(srcFileUrl);
|
|
||||||
ngModulesByFile.set(
|
|
||||||
srcFileUrl, (ngModulesByFile.get(srcFileUrl) || []).concat(ngModuleMeta.type.reference));
|
|
||||||
|
|
||||||
ngModuleMeta.declaredDirectives.forEach((dirIdentifier) => {
|
|
||||||
const fileUrl = dirIdentifier.reference.filePath;
|
|
||||||
filePaths.add(fileUrl);
|
|
||||||
ngDirectivesByFile.set(
|
|
||||||
fileUrl, (ngDirectivesByFile.get(fileUrl) || []).concat(dirIdentifier.reference));
|
|
||||||
ngModuleByPipeOrDirective.set(dirIdentifier.reference, ngModuleMeta);
|
|
||||||
});
|
|
||||||
ngModuleMeta.declaredPipes.forEach((pipeIdentifier) => {
|
|
||||||
const fileUrl = pipeIdentifier.reference.filePath;
|
|
||||||
filePaths.add(fileUrl);
|
|
||||||
ngModuleByPipeOrDirective.set(pipeIdentifier.reference, ngModuleMeta);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
const files: {srcUrl: string, directives: StaticSymbol[], ngModules: StaticSymbol[]}[] = [];
|
|
||||||
|
|
||||||
filePaths.forEach((srcUrl) => {
|
|
||||||
const directives = ngDirectivesByFile.get(srcUrl) || [];
|
|
||||||
const ngModules = ngModulesByFile.get(srcUrl) || [];
|
|
||||||
files.push({srcUrl, directives, ngModules});
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
// map directive/pipe to module
|
|
||||||
ngModuleByPipeOrDirective,
|
|
||||||
// list modules and directives for every source file
|
|
||||||
files,
|
|
||||||
ngModules: ngModuleMetas, symbolsMissingModule
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AotCompiler {
|
export class AotCompiler {
|
||||||
private _animationCompiler = new AnimationCompiler();
|
private _animationCompiler = new AnimationCompiler();
|
||||||
|
|
||||||
@ -126,14 +40,20 @@ export class AotCompiler {
|
|||||||
private _dirWrapperCompiler: DirectiveWrapperCompiler,
|
private _dirWrapperCompiler: DirectiveWrapperCompiler,
|
||||||
private _ngModuleCompiler: NgModuleCompiler, private _outputEmitter: OutputEmitter,
|
private _ngModuleCompiler: NgModuleCompiler, private _outputEmitter: OutputEmitter,
|
||||||
private _localeId: string, private _translationFormat: string,
|
private _localeId: string, private _translationFormat: string,
|
||||||
private _animationParser: AnimationParser) {}
|
private _animationParser: AnimationParser, private _staticReflector: StaticReflector,
|
||||||
|
private _options: AotCompilerOptions) {}
|
||||||
|
|
||||||
clearCache() { this._metadataResolver.clearCache(); }
|
clearCache() { this._metadataResolver.clearCache(); }
|
||||||
|
|
||||||
compileModules(staticSymbols: StaticSymbol[], options: {transitiveModules: boolean}):
|
compileAll(rootFiles: string[]): Promise<SourceModule[]> {
|
||||||
Promise<SourceModule[]> {
|
const options = {
|
||||||
|
transitiveModules: true,
|
||||||
|
excludeFilePattern: this._options.excludeFilePattern,
|
||||||
|
includeFilePattern: this._options.includeFilePattern
|
||||||
|
};
|
||||||
|
const programSymbols = extractProgramSymbols(this._staticReflector, rootFiles, options);
|
||||||
const {ngModuleByPipeOrDirective, files, ngModules} =
|
const {ngModuleByPipeOrDirective, files, ngModules} =
|
||||||
analyzeAndValidateNgModules(staticSymbols, options, this._metadataResolver);
|
analyzeAndValidateNgModules(programSymbols, options, this._metadataResolver);
|
||||||
return loadNgModuleDirectives(ngModules).then(() => {
|
return loadNgModuleDirectives(ngModules).then(() => {
|
||||||
const sourceModules = files.map(
|
const sourceModules = files.map(
|
||||||
file => this._compileSrcFile(
|
file => this._compileSrcFile(
|
||||||
@ -358,11 +278,133 @@ function _splitTypescriptSuffix(path: string): string[] {
|
|||||||
return [path, ''];
|
return [path, ''];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface NgAnalyzedModules {
|
||||||
|
ngModules: CompileNgModuleMetadata[];
|
||||||
|
ngModuleByPipeOrDirective: Map<StaticSymbol, CompileNgModuleMetadata>;
|
||||||
|
files: Array<{srcUrl: string, directives: StaticSymbol[], ngModules: StaticSymbol[]}>;
|
||||||
|
symbolsMissingModule?: StaticSymbol[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns all the source files and a mapping from modules to directives
|
||||||
|
export function analyzeNgModules(
|
||||||
|
programStaticSymbols: StaticSymbol[],
|
||||||
|
options: {transitiveModules: boolean, includeFilePattern?: RegExp, excludeFilePattern?: RegExp},
|
||||||
|
metadataResolver: CompileMetadataResolver): NgAnalyzedModules {
|
||||||
|
const {ngModules, symbolsMissingModule} =
|
||||||
|
_createNgModules(programStaticSymbols, options, metadataResolver);
|
||||||
|
return _analyzeNgModules(ngModules, symbolsMissingModule);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function analyzeAndValidateNgModules(
|
||||||
|
programStaticSymbols: StaticSymbol[], options: {transitiveModules: boolean},
|
||||||
|
metadataResolver: CompileMetadataResolver): NgAnalyzedModules {
|
||||||
|
const result = analyzeNgModules(programStaticSymbols, options, metadataResolver);
|
||||||
|
if (result.symbolsMissingModule && result.symbolsMissingModule.length) {
|
||||||
|
const messages = result.symbolsMissingModule.map(
|
||||||
|
s => `Cannot determine the module for class ${s.name} in ${s.filePath}!`);
|
||||||
|
throw new Error(messages.join('\n'));
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wait for the directives in the given modules have been loaded
|
||||||
|
export function loadNgModuleDirectives(ngModules: CompileNgModuleMetadata[]) {
|
||||||
|
return Promise
|
||||||
|
.all(ListWrapper.flatten(ngModules.map(
|
||||||
|
(ngModule) => ngModule.transitiveModule.directiveLoaders.map(loader => loader()))))
|
||||||
|
.then(() => {});
|
||||||
|
}
|
||||||
|
|
||||||
|
function _analyzeNgModules(
|
||||||
|
ngModuleMetas: CompileNgModuleMetadata[],
|
||||||
|
symbolsMissingModule: StaticSymbol[]): NgAnalyzedModules {
|
||||||
|
const moduleMetasByRef = new Map<any, CompileNgModuleMetadata>();
|
||||||
|
ngModuleMetas.forEach((ngModule) => moduleMetasByRef.set(ngModule.type.reference, ngModule));
|
||||||
|
const ngModuleByPipeOrDirective = new Map<StaticSymbol, CompileNgModuleMetadata>();
|
||||||
|
const ngModulesByFile = new Map<string, StaticSymbol[]>();
|
||||||
|
const ngDirectivesByFile = new Map<string, StaticSymbol[]>();
|
||||||
|
const filePaths = new Set<string>();
|
||||||
|
|
||||||
|
// Looping over all modules to construct:
|
||||||
|
// - a map from file to modules `ngModulesByFile`,
|
||||||
|
// - a map from file to directives `ngDirectivesByFile`,
|
||||||
|
// - a map from directive/pipe to module `ngModuleByPipeOrDirective`.
|
||||||
|
ngModuleMetas.forEach((ngModuleMeta) => {
|
||||||
|
const srcFileUrl = ngModuleMeta.type.reference.filePath;
|
||||||
|
filePaths.add(srcFileUrl);
|
||||||
|
ngModulesByFile.set(
|
||||||
|
srcFileUrl, (ngModulesByFile.get(srcFileUrl) || []).concat(ngModuleMeta.type.reference));
|
||||||
|
|
||||||
|
ngModuleMeta.declaredDirectives.forEach((dirIdentifier) => {
|
||||||
|
const fileUrl = dirIdentifier.reference.filePath;
|
||||||
|
filePaths.add(fileUrl);
|
||||||
|
ngDirectivesByFile.set(
|
||||||
|
fileUrl, (ngDirectivesByFile.get(fileUrl) || []).concat(dirIdentifier.reference));
|
||||||
|
ngModuleByPipeOrDirective.set(dirIdentifier.reference, ngModuleMeta);
|
||||||
|
});
|
||||||
|
ngModuleMeta.declaredPipes.forEach((pipeIdentifier) => {
|
||||||
|
const fileUrl = pipeIdentifier.reference.filePath;
|
||||||
|
filePaths.add(fileUrl);
|
||||||
|
ngModuleByPipeOrDirective.set(pipeIdentifier.reference, ngModuleMeta);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const files: {srcUrl: string, directives: StaticSymbol[], ngModules: StaticSymbol[]}[] = [];
|
||||||
|
|
||||||
|
filePaths.forEach((srcUrl) => {
|
||||||
|
const directives = ngDirectivesByFile.get(srcUrl) || [];
|
||||||
|
const ngModules = ngModulesByFile.get(srcUrl) || [];
|
||||||
|
files.push({srcUrl, directives, ngModules});
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
// map directive/pipe to module
|
||||||
|
ngModuleByPipeOrDirective,
|
||||||
|
// list modules and directives for every source file
|
||||||
|
files,
|
||||||
|
ngModules: ngModuleMetas, symbolsMissingModule
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function extractProgramSymbols(
|
||||||
|
staticReflector: StaticReflector, files: string[],
|
||||||
|
options: {includeFilePattern?: RegExp, excludeFilePattern?: RegExp} = {}): StaticSymbol[] {
|
||||||
|
const staticSymbols: StaticSymbol[] = [];
|
||||||
|
files
|
||||||
|
.filter(
|
||||||
|
fileName => _filterFileByPatterns(
|
||||||
|
fileName, options.includeFilePattern, options.includeFilePattern))
|
||||||
|
.forEach(sourceFile => {
|
||||||
|
const moduleMetadata = staticReflector.getModuleMetadata(sourceFile);
|
||||||
|
if (!moduleMetadata) {
|
||||||
|
console.log(`WARNING: no metadata found for ${sourceFile}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const metadata = moduleMetadata['metadata'];
|
||||||
|
|
||||||
|
if (!metadata) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const symbol of Object.keys(metadata)) {
|
||||||
|
if (metadata[symbol] && metadata[symbol].__symbolic == 'error') {
|
||||||
|
// Ignore symbols that are only included to record error information.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
staticSymbols.push(staticReflector.findDeclaration(sourceFile, symbol, sourceFile));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return staticSymbols;
|
||||||
|
}
|
||||||
|
|
||||||
// Load the NgModules and check
|
// Load the NgModules and check
|
||||||
// that all directives / pipes that are present in the program
|
// that all directives / pipes that are present in the program
|
||||||
// are also declared by a module.
|
// are also declared by a module.
|
||||||
function _createNgModules(
|
function _createNgModules(
|
||||||
programStaticSymbols: StaticSymbol[], options: {transitiveModules: boolean},
|
programStaticSymbols: StaticSymbol[],
|
||||||
|
options: {transitiveModules: boolean, includeFilePattern?: RegExp, excludeFilePattern?: RegExp},
|
||||||
metadataResolver: CompileMetadataResolver):
|
metadataResolver: CompileMetadataResolver):
|
||||||
{ngModules: CompileNgModuleMetadata[], symbolsMissingModule: StaticSymbol[]} {
|
{ngModules: CompileNgModuleMetadata[], symbolsMissingModule: StaticSymbol[]} {
|
||||||
const ngModules = new Map<any, CompileNgModuleMetadata>();
|
const ngModules = new Map<any, CompileNgModuleMetadata>();
|
||||||
@ -370,7 +412,9 @@ function _createNgModules(
|
|||||||
const ngModulePipesAndDirective = new Set<StaticSymbol>();
|
const ngModulePipesAndDirective = new Set<StaticSymbol>();
|
||||||
|
|
||||||
const addNgModule = (staticSymbol: any) => {
|
const addNgModule = (staticSymbol: any) => {
|
||||||
if (ngModules.has(staticSymbol)) {
|
if (ngModules.has(staticSymbol) ||
|
||||||
|
!_filterFileByPatterns(
|
||||||
|
staticSymbol.filePath, options.includeFilePattern, options.excludeFilePattern)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const ngModule = metadataResolver.getUnloadedNgModuleMetadata(staticSymbol, false, false);
|
const ngModule = metadataResolver.getUnloadedNgModuleMetadata(staticSymbol, false, false);
|
||||||
@ -398,3 +442,15 @@ function _createNgModules(
|
|||||||
|
|
||||||
return {ngModules: Array.from(ngModules.values()), symbolsMissingModule};
|
return {ngModules: Array.from(ngModules.values()), symbolsMissingModule};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function _filterFileByPatterns(
|
||||||
|
fileName: string, includeFilePattern: RegExp, excludeFilePattern: RegExp) {
|
||||||
|
let match = true;
|
||||||
|
if (includeFilePattern) {
|
||||||
|
match = match && !!includeFilePattern.exec(fileName);
|
||||||
|
}
|
||||||
|
if (excludeFilePattern) {
|
||||||
|
match = match && !excludeFilePattern.exec(fileName);
|
||||||
|
}
|
||||||
|
return match;
|
||||||
|
}
|
@ -31,15 +31,11 @@ import {ViewCompiler} from '../view_compiler/view_compiler';
|
|||||||
|
|
||||||
import {AotCompiler} from './compiler';
|
import {AotCompiler} from './compiler';
|
||||||
import {AotCompilerHost} from './compiler_host';
|
import {AotCompilerHost} from './compiler_host';
|
||||||
|
import {AotCompilerOptions} from './compiler_options';
|
||||||
import {StaticAndDynamicReflectionCapabilities} from './static_reflection_capabilities';
|
import {StaticAndDynamicReflectionCapabilities} from './static_reflection_capabilities';
|
||||||
import {StaticReflector} from './static_reflector';
|
import {StaticReflector} from './static_reflector';
|
||||||
|
|
||||||
export interface AotCompilerOptions {
|
|
||||||
debug?: boolean;
|
|
||||||
locale?: string;
|
|
||||||
i18nFormat?: string;
|
|
||||||
translations?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new AotCompiler based on options and a host.
|
* Creates a new AotCompiler based on options and a host.
|
||||||
@ -74,6 +70,6 @@ export function createAotCompiler(ngHost: AotCompilerHost, options: AotCompilerO
|
|||||||
new ViewCompiler(config, elementSchemaRegistry),
|
new ViewCompiler(config, elementSchemaRegistry),
|
||||||
new DirectiveWrapperCompiler(config, expressionParser, elementSchemaRegistry, console),
|
new DirectiveWrapperCompiler(config, expressionParser, elementSchemaRegistry, console),
|
||||||
new NgModuleCompiler(), new TypeScriptEmitter(ngHost), options.locale, options.i18nFormat,
|
new NgModuleCompiler(), new TypeScriptEmitter(ngHost), options.locale, options.i18nFormat,
|
||||||
new AnimationParser(elementSchemaRegistry));
|
new AnimationParser(elementSchemaRegistry), staticReflector, options);
|
||||||
return {compiler, reflector: staticReflector};
|
return {compiler, reflector: staticReflector};
|
||||||
}
|
}
|
||||||
|
16
modules/@angular/compiler/src/aot/compiler_options.ts
Normal file
16
modules/@angular/compiler/src/aot/compiler_options.ts
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* @license
|
||||||
|
* Copyright Google Inc. 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.io/license
|
||||||
|
*/
|
||||||
|
|
||||||
|
export interface AotCompilerOptions {
|
||||||
|
debug?: boolean;
|
||||||
|
locale?: string;
|
||||||
|
i18nFormat?: string;
|
||||||
|
translations?: string;
|
||||||
|
includeFilePattern?: RegExp;
|
||||||
|
excludeFilePattern?: RegExp;
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user