|
6 | 6 | * found in the LICENSE file at https://angular.io/license
|
7 | 7 | */
|
8 | 8 | import * as ts from 'typescript';
|
9 |
| -import { collectDeepNodes } from './ast_helpers'; |
10 |
| -import { RemoveNodeOperation, StandardTransform, TransformOperation } from './interfaces'; |
11 |
| -import { makeTransform } from './make_transform'; |
| 9 | +import { elideImports } from './elide_imports'; |
12 | 10 |
|
13 | 11 | export function removeIvyJitSupportCalls(
|
14 | 12 | classMetadata: boolean,
|
15 | 13 | ngModuleScope: boolean,
|
16 | 14 | getTypeChecker: () => ts.TypeChecker,
|
17 | 15 | ): ts.TransformerFactory<ts.SourceFile> {
|
18 |
| - const standardTransform: StandardTransform = function(sourceFile: ts.SourceFile) { |
19 |
| - const ops: TransformOperation[] = []; |
20 |
| - |
21 |
| - collectDeepNodes<ts.ExpressionStatement>(sourceFile, ts.SyntaxKind.ExpressionStatement) |
22 |
| - .filter(statement => { |
23 |
| - const innerStatement = getIifeStatement(statement); |
24 |
| - if (!innerStatement) { |
25 |
| - return false; |
| 16 | + return (context: ts.TransformationContext) => { |
| 17 | + const removedNodes: ts.Node[] = []; |
| 18 | + |
| 19 | + const visitNode: ts.Visitor = (node: ts.Node) => { |
| 20 | + const innerStatement = ts.isExpressionStatement(node) && getIifeStatement(node); |
| 21 | + if (innerStatement) { |
| 22 | + if ( |
| 23 | + ngModuleScope && |
| 24 | + ts.isBinaryExpression(innerStatement.expression) && |
| 25 | + isIvyPrivateCallExpression(innerStatement.expression.right, 'ɵɵsetNgModuleScope') |
| 26 | + ) { |
| 27 | + removedNodes.push(innerStatement); |
| 28 | + |
| 29 | + return undefined; |
26 | 30 | }
|
27 | 31 |
|
28 |
| - let shouldRemove = false; |
| 32 | + if (classMetadata) { |
| 33 | + const expression = ts.isBinaryExpression(innerStatement.expression) |
| 34 | + ? innerStatement.expression.right |
| 35 | + : innerStatement.expression; |
| 36 | + if (isIvyPrivateCallExpression(expression, 'ɵsetClassMetadata')) { |
| 37 | + removedNodes.push(innerStatement); |
29 | 38 |
|
30 |
| - if (ngModuleScope && ts.isBinaryExpression(innerStatement.expression)) { |
31 |
| - shouldRemove = isIvyPrivateCallExpression( |
32 |
| - innerStatement.expression.right, |
33 |
| - 'ɵɵsetNgModuleScope', |
34 |
| - ); |
35 |
| - } |
36 |
| - |
37 |
| - if (classMetadata && !shouldRemove) { |
38 |
| - if (ts.isBinaryExpression(innerStatement.expression)) { |
39 |
| - shouldRemove = isIvyPrivateCallExpression( |
40 |
| - innerStatement.expression.right, |
41 |
| - 'ɵsetClassMetadata', |
42 |
| - ); |
43 |
| - } else { |
44 |
| - shouldRemove = isIvyPrivateCallExpression( |
45 |
| - innerStatement.expression, |
46 |
| - 'ɵsetClassMetadata', |
47 |
| - ); |
| 39 | + return undefined; |
48 | 40 | }
|
49 | 41 | }
|
| 42 | + } |
| 43 | + |
| 44 | + return ts.visitEachChild(node, visitNode, context); |
| 45 | + }; |
| 46 | + |
| 47 | + return (sourceFile: ts.SourceFile) => { |
| 48 | + let updatedSourceFile = ts.visitEachChild(sourceFile, visitNode, context); |
| 49 | + |
| 50 | + if (removedNodes.length > 0) { |
| 51 | + // Remove any unused imports |
| 52 | + const importRemovals = elideImports( |
| 53 | + updatedSourceFile, |
| 54 | + removedNodes, |
| 55 | + getTypeChecker, |
| 56 | + context.getCompilerOptions(), |
| 57 | + ).map((op) => op.target); |
| 58 | + if (importRemovals.length > 0) { |
| 59 | + updatedSourceFile = ts.visitEachChild( |
| 60 | + updatedSourceFile, |
| 61 | + function visitForRemoval(node): ts.Node | undefined { |
| 62 | + return importRemovals.includes(node) |
| 63 | + ? undefined |
| 64 | + : ts.visitEachChild(node, visitForRemoval, context); |
| 65 | + }, |
| 66 | + context, |
| 67 | + ); |
| 68 | + } |
| 69 | + } |
50 | 70 |
|
51 |
| - return shouldRemove; |
52 |
| - }) |
53 |
| - .forEach(statement => ops.push(new RemoveNodeOperation(sourceFile, statement))); |
54 |
| - |
55 |
| - return ops; |
| 71 | + return updatedSourceFile; |
| 72 | + }; |
56 | 73 | };
|
57 |
| - |
58 |
| - return makeTransform(standardTransform, getTypeChecker); |
59 | 74 | }
|
60 | 75 |
|
61 | 76 | // Each Ivy private call expression is inside an IIFE
|
|
0 commit comments