Skip to content

Commit fd2c70c

Browse files
clydinfilipesilva
authored andcommitted
refactor(@ngtools/webpack): directly use TypeScript transformation helpers
This change replaces the remaining usage of `makeTransform` with the usage of TypeScript AST helpers directly instead. This allows for the reduction in the number of AST walks necessary to transform the application's files. (cherry picked from commit cb78ebc)
1 parent 252fe25 commit fd2c70c

File tree

1 file changed

+52
-37
lines changed

1 file changed

+52
-37
lines changed

packages/ngtools/webpack/src/transformers/remove-ivy-jit-support-calls.ts

Lines changed: 52 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,56 +6,71 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88
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';
1210

1311
export function removeIvyJitSupportCalls(
1412
classMetadata: boolean,
1513
ngModuleScope: boolean,
1614
getTypeChecker: () => ts.TypeChecker,
1715
): 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;
2630
}
2731

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);
2938

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;
4840
}
4941
}
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+
}
5070

51-
return shouldRemove;
52-
})
53-
.forEach(statement => ops.push(new RemoveNodeOperation(sourceFile, statement)));
54-
55-
return ops;
71+
return updatedSourceFile;
72+
};
5673
};
57-
58-
return makeTransform(standardTransform, getTypeChecker);
5974
}
6075

6176
// Each Ivy private call expression is inside an IIFE

0 commit comments

Comments
 (0)