Skip to content

Commit 2539023

Browse files
clydinalan-agius4
authored andcommitted
refactor(@ngtools/webpack): remove unneeded transform operation types
The transform operation types are currently only used and returned by the import elider but are immediately mapped back to the underlying TypeScript node at import elider callsites. This change also switches the import elider to return a Set to reduce the overhead of repeated array `includes` calls.
1 parent 1dd5c28 commit 2539023

File tree

5 files changed

+23
-72
lines changed

5 files changed

+23
-72
lines changed

packages/ngtools/webpack/src/ivy/transformation.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,11 @@ export function replaceBootstrap(
132132
replacedNodes,
133133
getTypeChecker,
134134
context.getCompilerOptions(),
135-
).map((op) => op.target);
136-
if (removals.length > 0) {
135+
);
136+
if (removals.size > 0) {
137137
updatedSourceFile = ts.visitEachChild(
138138
updatedSourceFile,
139-
(node) => (removals.includes(node) ? undefined : node),
139+
(node) => (removals.has(node) ? undefined : node),
140140
context,
141141
);
142142
}

packages/ngtools/webpack/src/transformers/elide_imports.ts

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
*/
88

99
import * as ts from 'typescript';
10-
import { RemoveNodeOperation, TransformOperation } from './interfaces';
1110

1211
// Remove imports for which all identifiers have been removed.
1312
// Needs type checker, and works even if it's not the first transformer.
@@ -20,11 +19,11 @@ export function elideImports(
2019
removedNodes: ts.Node[],
2120
getTypeChecker: () => ts.TypeChecker,
2221
compilerOptions: ts.CompilerOptions,
23-
): TransformOperation[] {
24-
const ops: TransformOperation[] = [];
22+
): Set<ts.Node> {
23+
const importNodeRemovals = new Set<ts.Node>();
2524

2625
if (removedNodes.length === 0) {
27-
return [];
26+
return importNodeRemovals;
2827
}
2928

3029
const typeChecker = getTypeChecker();
@@ -117,7 +116,7 @@ export function elideImports(
117116
});
118117

119118
if (imports.length === 0) {
120-
return [];
119+
return importNodeRemovals;
121120
}
122121

123122
const isUnused = (node: ts.Identifier) => {
@@ -142,10 +141,10 @@ export function elideImports(
142141
if (namedBindings && ts.isNamespaceImport(namedBindings)) {
143142
// "import * as XYZ from 'abc';"
144143
if (isUnused(namedBindings.name)) {
145-
ops.push(new RemoveNodeOperation(sourceFile, node));
144+
importNodeRemovals.add(node);
146145
}
147146
} else {
148-
const specifierOps = [];
147+
const specifierNodeRemovals = [];
149148
let clausesCount = 0;
150149

151150
// "import { XYZ, ... } from 'abc';"
@@ -160,7 +159,7 @@ export function elideImports(
160159
const nodeToRemove =
161160
clausesCount === removedClausesCount ? specifier.parent : specifier;
162161

163-
specifierOps.push(new RemoveNodeOperation(sourceFile, nodeToRemove));
162+
specifierNodeRemovals.push(nodeToRemove);
164163
}
165164
}
166165
}
@@ -170,17 +169,19 @@ export function elideImports(
170169
clausesCount++;
171170

172171
if (isUnused(node.importClause.name)) {
173-
specifierOps.push(new RemoveNodeOperation(sourceFile, node.importClause.name));
172+
specifierNodeRemovals.push(node.importClause.name);
174173
}
175174
}
176175

177-
if (specifierOps.length === clausesCount) {
178-
ops.push(new RemoveNodeOperation(sourceFile, node));
176+
if (specifierNodeRemovals.length === clausesCount) {
177+
importNodeRemovals.add(node);
179178
} else {
180-
ops.push(...specifierOps);
179+
for (const specifierNodeRemoval of specifierNodeRemovals) {
180+
importNodeRemovals.add(specifierNodeRemoval);
181+
}
181182
}
182183
}
183184
}
184185

185-
return ops;
186+
return importNodeRemovals;
186187
}

packages/ngtools/webpack/src/transformers/elide_imports_spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ describe('@ngtools/webpack transformers', () => {
3434
[lastNode],
3535
() => program.getTypeChecker(),
3636
context.getCompilerOptions(),
37-
).map((op) => op.target);
38-
if (importRemovals.length > 0) {
37+
);
38+
if (importRemovals.size > 0) {
3939
return ts.visitEachChild(
4040
updatedSourceFile,
4141
function visitForRemoval(node): ts.Node | undefined {
42-
return importRemovals.includes(node)
42+
return importRemovals.has(node)
4343
? undefined
4444
: ts.visitEachChild(node, visitForRemoval, context);
4545
},

packages/ngtools/webpack/src/transformers/interfaces.ts

Lines changed: 0 additions & 50 deletions
This file was deleted.

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ export function removeIvyJitSupportCalls(
5555
removedNodes,
5656
getTypeChecker,
5757
context.getCompilerOptions(),
58-
).map((op) => op.target);
59-
if (importRemovals.length > 0) {
58+
);
59+
if (importRemovals.size > 0) {
6060
updatedSourceFile = ts.visitEachChild(
6161
updatedSourceFile,
6262
function visitForRemoval(node): ts.Node | undefined {
63-
return importRemovals.includes(node)
63+
return importRemovals.has(node)
6464
? undefined
6565
: ts.visitEachChild(node, visitForRemoval, context);
6666
},

0 commit comments

Comments
 (0)