refactor(compiler-cli): make the output AST translator generic (#38775)
This commit refactors the `ExpressionTranslatorVisitor` so that it is not tied directly to the TypeScript AST. Instead it uses generic `TExpression` and `TStatement` types that are then converted to concrete types by the `TypeScriptAstFactory`. This paves the way for a `BabelAstFactory` that can be used to generate Babel AST nodes instead of TypeScript, which will be part of the new linker tool. PR Close #38775
This commit is contained in:

committed by
Misko Hevery

parent
a93605f2a4
commit
297b123151
@ -55,7 +55,7 @@ export class CommonJsRenderingFormatter extends Esm5RenderingFormatter {
|
||||
const namedImport = entryPointBasePath !== basePath ?
|
||||
importManager.generateNamedImport(relativePath, e.identifier) :
|
||||
{symbol: e.identifier, moduleImport: null};
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport}.` : '';
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport.text}.` : '';
|
||||
const exportStr = `\nexports.${e.identifier} = ${importNamespace}${namedImport.symbol};`;
|
||||
output.append(exportStr);
|
||||
});
|
||||
@ -66,7 +66,7 @@ export class CommonJsRenderingFormatter extends Esm5RenderingFormatter {
|
||||
file: ts.SourceFile): void {
|
||||
for (const e of exports) {
|
||||
const namedImport = importManager.generateNamedImport(e.fromModule, e.symbolName);
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport}.` : '';
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport.text}.` : '';
|
||||
const exportStr = `\nexports.${e.asAlias} = ${importNamespace}${namedImport.symbol};`;
|
||||
output.append(exportStr);
|
||||
}
|
||||
|
@ -9,7 +9,6 @@ import {Statement} from '@angular/compiler';
|
||||
import MagicString from 'magic-string';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {NOOP_DEFAULT_IMPORT_RECORDER} from '../../../src/ngtsc/imports';
|
||||
import {ImportManager, translateStatement} from '../../../src/ngtsc/translator';
|
||||
import {CompiledClass} from '../analysis/types';
|
||||
import {getContainingStatement} from '../host/esm2015_host';
|
||||
@ -65,8 +64,9 @@ export class Esm5RenderingFormatter extends EsmRenderingFormatter {
|
||||
* @return The JavaScript code corresponding to `stmt` (in the appropriate format).
|
||||
*/
|
||||
printStatement(stmt: Statement, sourceFile: ts.SourceFile, importManager: ImportManager): string {
|
||||
const node =
|
||||
translateStatement(stmt, importManager, NOOP_DEFAULT_IMPORT_RECORDER, ts.ScriptTarget.ES5);
|
||||
const node = translateStatement(
|
||||
stmt, importManager,
|
||||
{downlevelLocalizedStrings: true, downlevelVariableDeclarations: true});
|
||||
const code = this.printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
|
||||
|
||||
return code;
|
||||
|
@ -10,7 +10,7 @@ import MagicString from 'magic-string';
|
||||
import * as ts from 'typescript';
|
||||
|
||||
import {absoluteFromSourceFile, AbsoluteFsPath, dirname, relative, toRelativeImport} from '../../../src/ngtsc/file_system';
|
||||
import {NOOP_DEFAULT_IMPORT_RECORDER, Reexport} from '../../../src/ngtsc/imports';
|
||||
import {Reexport} from '../../../src/ngtsc/imports';
|
||||
import {Import, ImportManager, translateStatement} from '../../../src/ngtsc/translator';
|
||||
import {isDtsPath} from '../../../src/ngtsc/util/src/typescript';
|
||||
import {ModuleWithProvidersInfo} from '../analysis/module_with_providers_analyzer';
|
||||
@ -247,8 +247,7 @@ export class EsmRenderingFormatter implements RenderingFormatter {
|
||||
* @return The JavaScript code corresponding to `stmt` (in the appropriate format).
|
||||
*/
|
||||
printStatement(stmt: Statement, sourceFile: ts.SourceFile, importManager: ImportManager): string {
|
||||
const node = translateStatement(
|
||||
stmt, importManager, NOOP_DEFAULT_IMPORT_RECORDER, ts.ScriptTarget.ES2015);
|
||||
const node = translateStatement(stmt, importManager);
|
||||
const code = this.printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
|
||||
|
||||
return code;
|
||||
@ -264,8 +263,6 @@ export class EsmRenderingFormatter implements RenderingFormatter {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Check whether the given type is the core Angular `ModuleWithProviders` interface.
|
||||
* @param typeName The type to check.
|
||||
@ -292,7 +289,8 @@ function findStatement(node: ts.Node): ts.Statement|undefined {
|
||||
function generateImportString(
|
||||
importManager: ImportManager, importPath: string|null, importName: string) {
|
||||
const importAs = importPath ? importManager.generateNamedImport(importPath, importName) : null;
|
||||
return importAs ? `${importAs.moduleImport}.${importAs.symbol}` : `${importName}`;
|
||||
return importAs && importAs.moduleImport ? `${importAs.moduleImport.text}.${importAs.symbol}` :
|
||||
`${importName}`;
|
||||
}
|
||||
|
||||
function getNextSiblingInArray<T extends ts.Node>(node: T, array: ts.NodeArray<T>): T|null {
|
||||
|
@ -91,7 +91,7 @@ export class UmdRenderingFormatter extends Esm5RenderingFormatter {
|
||||
const namedImport = entryPointBasePath !== basePath ?
|
||||
importManager.generateNamedImport(relativePath, e.identifier) :
|
||||
{symbol: e.identifier, moduleImport: null};
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport}.` : '';
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport.text}.` : '';
|
||||
const exportStr = `\nexports.${e.identifier} = ${importNamespace}${namedImport.symbol};`;
|
||||
output.appendRight(insertionPoint, exportStr);
|
||||
});
|
||||
@ -111,7 +111,7 @@ export class UmdRenderingFormatter extends Esm5RenderingFormatter {
|
||||
lastStatement ? lastStatement.getEnd() : factoryFunction.body.getEnd() - 1;
|
||||
for (const e of exports) {
|
||||
const namedImport = importManager.generateNamedImport(e.fromModule, e.symbolName);
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport}.` : '';
|
||||
const importNamespace = namedImport.moduleImport ? `${namedImport.moduleImport.text}.` : '';
|
||||
const exportStr = `\nexports.${e.asAlias} = ${importNamespace}${namedImport.symbol};`;
|
||||
output.appendRight(insertionPoint, exportStr);
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ import * as ts from 'typescript';
|
||||
|
||||
import {absoluteFrom, getFileSystem} from '../../../src/ngtsc/file_system';
|
||||
import {runInEachFileSystem, TestFile} from '../../../src/ngtsc/file_system/testing';
|
||||
import {NOOP_DEFAULT_IMPORT_RECORDER, Reexport} from '../../../src/ngtsc/imports';
|
||||
import {Reexport} from '../../../src/ngtsc/imports';
|
||||
import {MockLogger} from '../../../src/ngtsc/logging/testing';
|
||||
import {Import, ImportManager, translateStatement} from '../../../src/ngtsc/translator';
|
||||
import {loadTestFiles} from '../../../test/helpers';
|
||||
@ -65,8 +65,8 @@ class TestRenderingFormatter implements RenderingFormatter {
|
||||
}
|
||||
printStatement(stmt: Statement, sourceFile: ts.SourceFile, importManager: ImportManager): string {
|
||||
const node = translateStatement(
|
||||
stmt, importManager, NOOP_DEFAULT_IMPORT_RECORDER,
|
||||
this.isEs5 ? ts.ScriptTarget.ES5 : ts.ScriptTarget.ES2015);
|
||||
stmt, importManager,
|
||||
{downlevelLocalizedStrings: this.isEs5, downlevelVariableDeclarations: this.isEs5});
|
||||
const code = this.printer.printNode(ts.EmitHint.Unspecified, node, sourceFile);
|
||||
|
||||
return `// TRANSPILED\n${code}`;
|
||||
|
Reference in New Issue
Block a user