Skip to content

Commit ff6be32

Browse files
crisbetoatscott
authored andcommitted
refactor(compiler): remove usages of deprecated AST creation functions (angular#45134)
Proactively replaces our usages of the deprecated `ts.create*` methods in favor of using `ts.factory.create*` so that we're not surprised when the TS removes them in the future. Also accounts for some cases where the signature had changed. PR Close angular#45134
1 parent c0778b4 commit ff6be32

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+532
-442
lines changed

packages/compiler-cli/ngcc/src/migrations/utils.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@
66
* found in the LICENSE file at https://angular.io/license
77
*/
88
import ts from 'typescript';
9+
910
import {Reference} from '../../../src/ngtsc/imports';
1011
import {ClassDeclaration, Decorator, isNamedClassDeclaration, isNamedFunctionDeclaration, isNamedVariableDeclaration} from '../../../src/ngtsc/reflection';
12+
1113
import {MigrationHost} from './migration';
1214

1315
export function isClassDeclaration(clazz: ts.Node): clazz is ClassDeclaration<ts.Declaration> {
@@ -53,7 +55,7 @@ export function createDirectiveDecorator(
5355
if (metadata.exportAs !== null) {
5456
metaArgs.push(property('exportAs', metadata.exportAs.join(', ')));
5557
}
56-
args.push(reifySourceFile(ts.createObjectLiteral(metaArgs)));
58+
args.push(reifySourceFile(ts.factory.createObjectLiteralExpression(metaArgs)));
5759
}
5860
return {
5961
name: 'Directive',
@@ -87,7 +89,7 @@ export function createComponentDecorator(
8789
node: null,
8890
synthesizedFor: clazz.name,
8991
args: [
90-
reifySourceFile(ts.createObjectLiteral(metaArgs)),
92+
reifySourceFile(ts.factory.createObjectLiteralExpression(metaArgs)),
9193
],
9294
};
9395
}
@@ -107,7 +109,7 @@ export function createInjectableDecorator(clazz: ClassDeclaration): Decorator {
107109
}
108110

109111
function property(name: string, value: string): ts.PropertyAssignment {
110-
return ts.createPropertyAssignment(name, ts.createStringLiteral(value));
112+
return ts.factory.createPropertyAssignment(name, ts.factory.createStringLiteral(value));
111113
}
112114

113115
const EMPTY_SF = ts.createSourceFile('(empty)', '', ts.ScriptTarget.Latest);

packages/compiler-cli/ngcc/test/rendering/commonjs_rendering_formatter_spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,8 +161,8 @@ exports.D = D;
161161
renderer.addImports(
162162
output,
163163
[
164-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
165-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
164+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
165+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
166166
],
167167
sourceFile);
168168
expect(output.toString()).toContain(`/* A copyright notice */
@@ -242,7 +242,8 @@ var A = (function() {`);
242242
const output = new MagicString(PROGRAM.contents);
243243
renderer.addConstants(output, 'var x = 3;', file);
244244
renderer.addImports(
245-
output, [{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')}], file);
245+
output, [{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')}],
246+
file);
246247
expect(output.toString()).toContain(`
247248
var core = require('@angular/core');
248249
var i0 = require('@angular/core');

packages/compiler-cli/ngcc/test/rendering/esm5_rendering_formatter_spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,8 +172,8 @@ export { F };
172172
renderer.addImports(
173173
output,
174174
[
175-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
176-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
175+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
176+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
177177
],
178178
sourceFile);
179179
expect(output.toString()).toContain(`/* A copyright notice */
@@ -248,7 +248,8 @@ var A = (function() {`);
248248
const output = new MagicString(PROGRAM.contents);
249249
renderer.addConstants(output, 'var x = 3;', file);
250250
renderer.addImports(
251-
output, [{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')}], file);
251+
output, [{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')}],
252+
file);
252253
expect(output.toString()).toContain(`
253254
import {Directive} from '@angular/core';
254255
import * as i0 from '@angular/core';

packages/compiler-cli/ngcc/test/rendering/esm_rendering_formatter_spec.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,8 @@ runInEachFileSystem(() => {
129129
renderer.addImports(
130130
output,
131131
[
132-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
133-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
132+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
133+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
134134
],
135135
sourceFile);
136136
expect(output.toString()).toContain(`/* A copyright notice */
@@ -205,7 +205,8 @@ const x = 3;
205205
const output = new MagicString(PROGRAM.contents);
206206
renderer.addConstants(output, 'const x = 3;', file);
207207
renderer.addImports(
208-
output, [{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')}], file);
208+
output, [{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')}],
209+
file);
209210
expect(output.toString()).toContain(`
210211
import {Directive} from '@angular/core';
211212
import * as i0 from '@angular/core';

packages/compiler-cli/ngcc/test/rendering/umd_rendering_formatter_spec.ts

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,8 @@ exports.BadIife = BadIife;
199199
renderer.addImports(
200200
output,
201201
[
202-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
203-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
202+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
203+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
204204
],
205205
file);
206206
expect(output.toString())
@@ -222,8 +222,8 @@ exports.BadIife = BadIife;
222222
renderer.addImports(
223223
output,
224224
[
225-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
226-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
225+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
226+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
227227
],
228228
file);
229229
expect(output.toString())
@@ -241,8 +241,8 @@ exports.BadIife = BadIife;
241241
renderer.addImports(
242242
output,
243243
[
244-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
245-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
244+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
245+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
246246
],
247247
file);
248248
expect(output.toString())
@@ -262,8 +262,8 @@ exports.BadIife = BadIife;
262262
renderer.addImports(
263263
output,
264264
[
265-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
266-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
265+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
266+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
267267
],
268268
file);
269269
expect(output.toString())
@@ -281,12 +281,15 @@ exports.BadIife = BadIife;
281281
renderer.addImports(
282282
output,
283283
[
284-
{specifier: '@ngrx/store', qualifier: ts.createIdentifier('i0')}, {
284+
{specifier: '@ngrx/store', qualifier: ts.factory.createIdentifier('i0')}, {
285285
specifier: '@angular/platform-browser-dynamic',
286-
qualifier: ts.createIdentifier('i1')
286+
qualifier: ts.factory.createIdentifier('i1')
287287
},
288-
{specifier: '@angular/common/testing', qualifier: ts.createIdentifier('i2')},
289-
{specifier: '@angular-foo/package', qualifier: ts.createIdentifier('i3')}
288+
{
289+
specifier: '@angular/common/testing',
290+
qualifier: ts.factory.createIdentifier('i2')
291+
},
292+
{specifier: '@angular-foo/package', qualifier: ts.factory.createIdentifier('i3')}
290293
],
291294
file);
292295
expect(output.toString())
@@ -311,8 +314,8 @@ exports.BadIife = BadIife;
311314
renderer.addImports(
312315
output,
313316
[
314-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
315-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
317+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
318+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
316319
],
317320
file);
318321
expect(output.toString())
@@ -330,8 +333,8 @@ exports.BadIife = BadIife;
330333
renderer.addImports(
331334
output,
332335
[
333-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
334-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
336+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
337+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
335338
],
336339
file);
337340
expect(output.toString())
@@ -361,8 +364,8 @@ exports.BadIife = BadIife;
361364
renderer.addImports(
362365
output,
363366
[
364-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
365-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
367+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
368+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
366369
],
367370
file);
368371
const outputSrc = output.toString();
@@ -425,8 +428,8 @@ exports.BadIife = BadIife;
425428
renderer.addImports(
426429
output,
427430
[
428-
{specifier: '@angular/core', qualifier: ts.createIdentifier('i0')},
429-
{specifier: '@angular/common', qualifier: ts.createIdentifier('i1')}
431+
{specifier: '@angular/core', qualifier: ts.factory.createIdentifier('i0')},
432+
{specifier: '@angular/common', qualifier: ts.factory.createIdentifier('i1')}
430433
],
431434
file);
432435
const outputSrc = output.toString();

packages/compiler-cli/ngcc/test/utils_spec.ts

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

99
import ts from 'typescript';
10+
1011
import {absoluteFrom as _abs} from '../../src/ngtsc/file_system';
1112
import {runInEachFileSystem} from '../../src/ngtsc/file_system/testing';
1213
import {KnownDeclaration} from '../../src/ngtsc/reflection';
@@ -55,10 +56,10 @@ describe('FactoryMap', () => {
5556
});
5657

5758
describe('getTsHelperFnFromDeclaration()', () => {
58-
const createFunctionDeclaration = (fnName?: string) => ts.createFunctionDeclaration(
59+
const createFunctionDeclaration = (fnName?: string) => ts.factory.createFunctionDeclaration(
5960
undefined, undefined, undefined, fnName, undefined, [], undefined, undefined);
6061
const createVariableDeclaration = (varName: string) =>
61-
ts.createVariableDeclaration(varName, undefined, undefined);
62+
ts.factory.createVariableDeclaration(varName, undefined, undefined, undefined);
6263

6364
it('should recognize the `__assign` helper as function declaration', () => {
6465
const decl1 = createFunctionDeclaration('__assign');
@@ -141,8 +142,8 @@ describe('getTsHelperFnFromDeclaration()', () => {
141142
});
142143

143144
it('should return null for non-function/variable declarations', () => {
144-
const classDecl =
145-
ts.createClassDeclaration(undefined, undefined, '__assign', undefined, undefined, []);
145+
const classDecl = ts.factory.createClassDeclaration(
146+
undefined, undefined, '__assign', undefined, undefined, []);
146147

147148
expect(classDecl.name!.text).toBe('__assign');
148149
expect(getTsHelperFnFromDeclaration(classDecl)).toBe(null);
@@ -151,41 +152,41 @@ describe('getTsHelperFnFromDeclaration()', () => {
151152

152153
describe('getTsHelperFnFromIdentifier()', () => {
153154
it('should recognize the `__assign` helper', () => {
154-
const id1 = ts.createIdentifier('__assign');
155-
const id2 = ts.createIdentifier('__assign$42');
155+
const id1 = ts.factory.createIdentifier('__assign');
156+
const id2 = ts.factory.createIdentifier('__assign$42');
156157

157158
expect(getTsHelperFnFromIdentifier(id1)).toBe(KnownDeclaration.TsHelperAssign);
158159
expect(getTsHelperFnFromIdentifier(id2)).toBe(KnownDeclaration.TsHelperAssign);
159160
});
160161

161162
it('should recognize the `__spread` helper', () => {
162-
const id1 = ts.createIdentifier('__spread');
163-
const id2 = ts.createIdentifier('__spread$42');
163+
const id1 = ts.factory.createIdentifier('__spread');
164+
const id2 = ts.factory.createIdentifier('__spread$42');
164165

165166
expect(getTsHelperFnFromIdentifier(id1)).toBe(KnownDeclaration.TsHelperSpread);
166167
expect(getTsHelperFnFromIdentifier(id2)).toBe(KnownDeclaration.TsHelperSpread);
167168
});
168169

169170
it('should recognize the `__spreadArrays` helper', () => {
170-
const id1 = ts.createIdentifier('__spreadArrays');
171-
const id2 = ts.createIdentifier('__spreadArrays$42');
171+
const id1 = ts.factory.createIdentifier('__spreadArrays');
172+
const id2 = ts.factory.createIdentifier('__spreadArrays$42');
172173

173174
expect(getTsHelperFnFromIdentifier(id1)).toBe(KnownDeclaration.TsHelperSpreadArrays);
174175
expect(getTsHelperFnFromIdentifier(id2)).toBe(KnownDeclaration.TsHelperSpreadArrays);
175176
});
176177

177178
it('should recognize the `__spreadArray` helper', () => {
178-
const id1 = ts.createIdentifier('__spreadArray');
179-
const id2 = ts.createIdentifier('__spreadArray$42');
179+
const id1 = ts.factory.createIdentifier('__spreadArray');
180+
const id2 = ts.factory.createIdentifier('__spreadArray$42');
180181

181182
expect(getTsHelperFnFromIdentifier(id1)).toBe(KnownDeclaration.TsHelperSpreadArray);
182183
expect(getTsHelperFnFromIdentifier(id2)).toBe(KnownDeclaration.TsHelperSpreadArray);
183184
});
184185

185186
it('should return null for unrecognized helpers', () => {
186-
const id1 = ts.createIdentifier('__foo');
187-
const id2 = ts.createIdentifier('spread');
188-
const id3 = ts.createIdentifier('spread$42');
187+
const id1 = ts.factory.createIdentifier('__foo');
188+
const id2 = ts.factory.createIdentifier('spread');
189+
const id3 = ts.factory.createIdentifier('spread$42');
189190

190191
expect(getTsHelperFnFromIdentifier(id1)).toBe(null);
191192
expect(getTsHelperFnFromIdentifier(id2)).toBe(null);

packages/compiler-cli/src/ngtsc/annotations/common/src/di.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export function getConstructorDependencies(
7373
attributeNameType = new LiteralExpr(attributeName.text);
7474
} else {
7575
attributeNameType =
76-
new WrappedNodeExpr(ts.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword));
76+
new WrappedNodeExpr(ts.factory.createKeywordTypeNode(ts.SyntaxKind.UnknownKeyword));
7777
}
7878
} else {
7979
throw new FatalDiagnosticError(

packages/compiler-cli/src/ngtsc/annotations/common/src/metadata.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ export function extractClassMetadata(
5050
if (ngClassDecorators.length === 0) {
5151
return null;
5252
}
53-
const metaDecorators = new WrappedNodeExpr(ts.createArrayLiteral(ngClassDecorators));
53+
const metaDecorators =
54+
new WrappedNodeExpr(ts.factory.createArrayLiteralExpression(ngClassDecorators));
5455

5556
// Convert the constructor parameters to metadata, passing null if none are present.
5657
let metaCtorParameters: Expression|null = null;
@@ -79,7 +80,8 @@ export function extractClassMetadata(
7980
const decoratedMembers = classMembers.map(
8081
member => classMemberToMetadata(member.nameNode ?? member.name, member.decorators!, isCore));
8182
if (decoratedMembers.length > 0) {
82-
metaPropDecorators = new WrappedNodeExpr(ts.createObjectLiteral(decoratedMembers));
83+
metaPropDecorators =
84+
new WrappedNodeExpr(ts.factory.createObjectLiteralExpression(decoratedMembers));
8385
}
8486

8587
return {
@@ -108,7 +110,7 @@ function ctorParameterToMetadata(param: CtorParameter, isCore: boolean): Express
108110
if (param.decorators !== null) {
109111
const ngDecorators = param.decorators.filter(dec => isAngularDecorator(dec, isCore))
110112
.map((decorator: Decorator) => decoratorToMetadata(decorator));
111-
const value = new WrappedNodeExpr(ts.createArrayLiteral(ngDecorators));
113+
const value = new WrappedNodeExpr(ts.factory.createArrayLiteralExpression(ngDecorators));
112114
mapEntries.push({key: 'decorators', value, quoted: false});
113115
}
114116
return literalMap(mapEntries);
@@ -121,8 +123,8 @@ function classMemberToMetadata(
121123
name: ts.PropertyName|string, decorators: Decorator[], isCore: boolean): ts.PropertyAssignment {
122124
const ngDecorators = decorators.filter(dec => isAngularDecorator(dec, isCore))
123125
.map((decorator: Decorator) => decoratorToMetadata(decorator));
124-
const decoratorMeta = ts.createArrayLiteral(ngDecorators);
125-
return ts.createPropertyAssignment(name, decoratorMeta);
126+
const decoratorMeta = ts.factory.createArrayLiteralExpression(ngDecorators);
127+
return ts.factory.createPropertyAssignment(name, decoratorMeta);
126128
}
127129

128130
/**
@@ -135,17 +137,18 @@ function decoratorToMetadata(
135137
}
136138
// Decorators have a type.
137139
const properties: ts.ObjectLiteralElementLike[] = [
138-
ts.createPropertyAssignment('type', ts.getMutableClone(decorator.identifier)),
140+
ts.factory.createPropertyAssignment('type', ts.getMutableClone(decorator.identifier)),
139141
];
140142
// Sometimes they have arguments.
141143
if (decorator.args !== null && decorator.args.length > 0) {
142144
const args = decorator.args.map(arg => {
143145
const expr = ts.getMutableClone(arg);
144146
return wrapFunctionsInParens ? wrapFunctionExpressionsInParens(expr) : expr;
145147
});
146-
properties.push(ts.createPropertyAssignment('args', ts.createArrayLiteral(args)));
148+
properties.push(
149+
ts.factory.createPropertyAssignment('args', ts.factory.createArrayLiteralExpression(args)));
147150
}
148-
return ts.createObjectLiteral(properties, true);
151+
return ts.factory.createObjectLiteralExpression(properties, true);
149152
}
150153

151154
/**
@@ -166,7 +169,7 @@ function removeIdentifierReferences<T extends ts.Node>(node: T, name: string): T
166169
const result = ts.transform(
167170
node, [context => root => ts.visitNode(root, function walk(current: ts.Node): ts.Node {
168171
return ts.isIdentifier(current) && current.text === name ?
169-
ts.createIdentifier(current.text) :
172+
ts.factory.createIdentifier(current.text) :
170173
ts.visitEachChild(current, walk, context);
171174
})]);
172175

packages/compiler-cli/src/ngtsc/annotations/common/src/util.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ const parensWrapperTransformerFactory: ts.TransformerFactory<ts.Expression> =
226226
const visitor: ts.Visitor = (node: ts.Node): ts.Node => {
227227
const visited = ts.visitEachChild(node, visitor, context);
228228
if (ts.isArrowFunction(visited) || ts.isFunctionExpression(visited)) {
229-
return ts.createParen(visited);
229+
return ts.factory.createParenthesizedExpression(visited);
230230
}
231231
return visited;
232232
};

0 commit comments

Comments
 (0)