Skip to content

Commit 31470c2

Browse files
committed
Tighten Node types
1 parent ce3b88b commit 31470c2

8 files changed

+40
-46
lines changed

src/ast-transform/node-types.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,12 @@ export type NGOwnNode =
1919
| NGPipeExpression
2020
| NGChainedExpression;
2121

22-
export type NGNode = babel.Node | NGOwnNode;
22+
export type NGNode =
23+
| babel.Expression
24+
| babel.ObjectProperty
25+
| babel.SpreadElement
26+
| babel.TemplateElement
27+
| NGOwnNode;
2328

2429
export interface NGEmptyExpression extends NGBaseNode {
2530
type: 'NGEmptyExpression';

src/ast-transform/transforms/transform-array-expression.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@ export const visitLiteralArray = (
99
): babel.ArrayExpression => ({
1010
type: 'ArrayExpression',
1111
elements: transformer.transformChildren<
12-
babel.Expression | babel.SpreadElement
12+
Exclude<babel.ArrayExpression['elements'][number], null>
1313
>(node.expressions),
1414
});
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { type ASTWithSource } from '@angular/compiler';
2-
import type * as babel from '@babel/types';
32

3+
import type { NGNode } from '../../types.ts';
44
import { type NodeTransformer } from '../node-transformer.ts';
55

66
export const visitASTWithSource = (
77
node: ASTWithSource,
88
transformer: NodeTransformer,
9-
) => transformer.transformChild<babel.Expression>(node.ast);
9+
) => transformer.transformChild<NGNode>(node.ast);

src/ast-transform/transforms/transform-interpolation.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type Interpolation } from '@angular/compiler';
2-
import type * as babel from '@babel/types';
32

43
import { type NodeTransformer } from '../node-transformer.ts';
4+
import type { NGNode } from '../node-types.ts';
55

66
export const visitInterpolation = (
77
node: Interpolation,
@@ -14,5 +14,5 @@ export const visitInterpolation = (
1414
throw new Error("Unexpected 'Interpolation'");
1515
}
1616

17-
return transformer.transformChild<babel.Expression>(expressions[0]);
17+
return transformer.transformChild<NGNode>(expressions[0]);
1818
};

src/ast-transform/transforms/transform-member-expression.ts

Lines changed: 10 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ const transformMemberExpression =
5555
let property;
5656
if (computed) {
5757
const { key } = node as KeyedRead | SafeKeyedRead;
58-
property = transformer.transformChild<babel.Expression>(key);
58+
property = transformer.transformChild<babel.Identifier>(key);
5959
} else {
6060
const isImplicitReceiver = receiver instanceof ImplicitReceiver;
6161
const { name, nameSpan } = node as PropertyRead | SafePropertyRead;
@@ -72,28 +72,15 @@ const transformMemberExpression =
7272

7373
const object = transformer.transformChild<babel.Expression>(receiver);
7474

75-
const isOptionalObject = isOptionalObjectOrCallee(object);
76-
77-
if (optional || isOptionalObject) {
78-
return {
79-
type: 'OptionalMemberExpression',
80-
optional: optional || !isOptionalObject,
81-
computed,
82-
property,
83-
object,
84-
};
85-
}
86-
87-
if (computed) {
88-
return { type: 'MemberExpression', property, object, computed: true };
89-
}
90-
91-
return {
92-
type: 'MemberExpression',
93-
object,
94-
property: property as babel.MemberExpressionNonComputed['property'],
95-
computed: false,
96-
};
75+
return optional || isOptionalObjectOrCallee(object)
76+
? {
77+
type: 'OptionalMemberExpression',
78+
optional: optional,
79+
property,
80+
object,
81+
computed,
82+
}
83+
: { type: 'MemberExpression', property, object, computed };
9784
};
9885

9986
export const visitKeyedRead =

src/ast-transform/transforms/transform-object-expression.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,11 @@ export const visitLiteralMap = (
4848
type: 'ObjectProperty',
4949
key,
5050
value: transformer.transformChild<babel.Expression>(valueNode),
51+
// TODO: Use this instead, https://github.com/babel/babel/pull/17703
52+
// value:
53+
// transformer.transformChild<babel.ObjectProperty['value']>(
54+
// valueNode,
55+
// ),
5156
shorthand,
5257
computed: false,
5358
// @ts-expect-error -- Missed in types

src/ast-transform/transforms/transform-pipe-expression.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
import { type BindingPipe } from '@angular/compiler';
22
import type * as babel from '@babel/types';
33

4-
import { type IncompleteNode } from '../../source.ts';
54
import type { NGPipeExpression } from '../../types.ts';
65
import { type NodeTransformer } from '../node-transformer.ts';
76

87
export const visitPipe = (
98
node: BindingPipe,
109
transformer: NodeTransformer,
11-
): IncompleteNode<NGPipeExpression> => ({
10+
): Omit<NGPipeExpression, 'start' | 'end' | 'range'> => ({
1211
type: 'NGPipeExpression',
1312
left: transformer.transformChild<babel.Expression>(node.exp),
1413
right: transformer.create<babel.Identifier>(

src/ast-transform/transforms/transform-template-literal.ts

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,27 @@ import { type NodeTransformer } from '../node-transformer.ts';
1010
export const visitTaggedTemplateLiteral = (
1111
node: TaggedTemplateLiteral,
1212
transformer: NodeTransformer,
13-
) =>
14-
transformer.create<babel.TaggedTemplateExpression>({
15-
type: 'TaggedTemplateExpression',
16-
tag: transformer.transformChild<babel.Expression>(node.tag),
17-
quasi: transformer.transformChild<babel.TemplateLiteral>(node.template),
18-
});
13+
): babel.TaggedTemplateExpression => ({
14+
type: 'TaggedTemplateExpression',
15+
tag: transformer.transformChild<babel.Expression>(node.tag),
16+
quasi: transformer.transformChild<babel.TemplateLiteral>(node.template),
17+
});
1918

2019
export const visitTemplateLiteral = (
2120
node: TemplateLiteral,
2221
transformer: NodeTransformer,
23-
) =>
24-
transformer.create<babel.TemplateLiteral>({
25-
type: 'TemplateLiteral',
26-
quasis: transformer.transformChildren<babel.TemplateElement>(node.elements),
27-
expressions: transformer.transformChildren<babel.Expression>(
28-
node.expressions,
29-
),
30-
});
22+
): babel.TemplateLiteral => ({
23+
type: 'TemplateLiteral',
24+
quasis: transformer.transformChildren<babel.TemplateElement>(node.elements),
25+
expressions: transformer.transformChildren<babel.Expression>(
26+
node.expressions,
27+
),
28+
});
3129

3230
export const visitTemplateLiteralElement = (
3331
node: TemplateLiteralElement,
3432
transformer: NodeTransformer,
35-
) => {
33+
): babel.TemplateElement => {
3634
const [parent] = transformer.ancestors;
3735
const { elements } = parent as TemplateLiteral;
3836
const elementIndex = elements.indexOf(node);

0 commit comments

Comments
 (0)