Skip to content

Commit 379fd2a

Browse files
committed
Simplify
1 parent b5f456f commit 379fd2a

11 files changed

Lines changed: 149 additions & 133 deletions

src/transform-ast.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,18 @@ class Transformer extends Source {
6868
) as T;
6969
}
7070

71-
return node.visit(transformVisitor, this) as T;
71+
const properties = node.visit(transformVisitor, this);
72+
73+
if (properties.range) {
74+
properties.start ??= properties.range[0];
75+
properties.end ??= properties.range[1];
76+
return properties as T;
77+
}
78+
79+
const { location = node.sourceSpan, ...restProperties } = properties;
80+
const estreeNode = this.createNode(restProperties, location);
81+
82+
return estreeNode as T;
7283
}
7384

7485
static transform(node: angular.AST, text: string) {

src/transforms/transform-binary-expression.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,35 +13,36 @@ const isLogicalOperator = (
1313
): operator is babel.LogicalExpression['operator'] =>
1414
operator === '&&' || operator === '||' || operator === '??';
1515

16-
export const visitBinary = (node: Binary, transformer: Transformer) => {
16+
export const visitBinary = (
17+
node: Binary,
18+
transformer: Transformer,
19+
):
20+
| babel.LogicalExpression
21+
| babel.AssignmentExpression
22+
| babel.BinaryExpression => {
1723
const { operation: operator } = node;
1824
const [left, right] = transformer.transformChildren<babel.Expression>([
1925
node.left,
2026
node.right,
2127
]);
2228

2329
if (isLogicalOperator(operator)) {
24-
return transformer.createNode<babel.LogicalExpression>({
25-
type: 'LogicalExpression',
26-
operator,
27-
left,
28-
right,
29-
});
30+
return { type: 'LogicalExpression', operator, left, right };
3031
}
3132

3233
if (isAssignmentOperator(operator)) {
33-
return transformer.createNode<babel.AssignmentExpression>({
34+
return {
3435
type: 'AssignmentExpression',
3536
left: left as babel.MemberExpression,
3637
right,
3738
operator: operator,
38-
});
39+
};
3940
}
4041

41-
return transformer.createNode<babel.BinaryExpression>({
42+
return {
4243
left,
4344
right,
4445
type: 'BinaryExpression',
4546
operator: operator as babel.BinaryExpression['operator'],
46-
});
47+
};
4748
};

src/transforms/transform-call-expression.ts

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,24 +20,25 @@ const transformCall =
2020
<Visitor extends VisitorCall | VisitorSafeCall>({
2121
optional,
2222
}: Visitor['options']) =>
23-
(node: Visitor['node'], transformer: Transformer) => {
23+
(
24+
node: Visitor['node'],
25+
transformer: Transformer,
26+
): babel.CallExpression | babel.OptionalCallExpression => {
2427
const arguments_ = transformer.transformChildren<babel.Expression>(
2528
node.args,
2629
);
2730
const callee = transformer.transformChild<babel.Expression>(node.receiver);
28-
const isOptionalReceiver = isOptionalObjectOrCallee(callee);
29-
const nodeType =
30-
optional || isOptionalReceiver
31-
? 'OptionalCallExpression'
32-
: 'CallExpression';
33-
return transformer.createNode<
34-
babel.CallExpression | babel.OptionalCallExpression
35-
>({
36-
type: nodeType,
37-
callee,
38-
arguments: arguments_,
39-
...(nodeType === 'OptionalCallExpression' ? { optional } : undefined),
40-
});
31+
32+
if (optional || isOptionalObjectOrCallee(callee)) {
33+
return {
34+
type: 'OptionalCallExpression',
35+
callee,
36+
arguments: arguments_,
37+
optional,
38+
};
39+
}
40+
41+
return { type: 'CallExpression', callee, arguments: arguments_ };
4142
};
4243

4344
export const visitCall = transformCall<VisitorCall>(callOptions);

src/transforms/transform-conditional-expression.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@ import { type Transformer } from '../transform-ast.ts';
66
export const visitConditional = (
77
node: Conditional,
88
transformer: Transformer,
9-
) => {
9+
): babel.ConditionalExpression => {
1010
const [test, consequent, alternate] =
1111
transformer.transformChildren<babel.Expression>([
1212
node.condition,
1313
node.trueExp,
1414
node.falseExp,
1515
]);
1616

17-
return transformer.createNode<babel.ConditionalExpression>({
17+
return {
1818
type: 'ConditionalExpression',
1919
test,
2020
consequent,
2121
alternate,
22-
});
22+
};
2323
};

src/transforms/transform-literal.ts

Lines changed: 16 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,39 +4,26 @@ import {
44
} from '@angular/compiler';
55
import type * as babel from '@babel/types';
66

7-
import { type Transformer } from '../transform-ast.ts';
8-
97
export const visitLiteralPrimitive = (
108
node: LiteralPrimitive,
11-
transformer: Transformer,
12-
) => {
9+
):
10+
| babel.BooleanLiteral
11+
| babel.NumericLiteral
12+
| babel.NullLiteral
13+
| babel.StringLiteral
14+
| babel.Identifier => {
1315
const { value } = node;
14-
console.log(node);
1516
switch (typeof value) {
1617
case 'boolean':
17-
return transformer.createNode<babel.BooleanLiteral>({
18-
type: 'BooleanLiteral',
19-
value,
20-
});
18+
return { type: 'BooleanLiteral', value };
2119
case 'number':
22-
return transformer.createNode<babel.NumericLiteral>({
23-
type: 'NumericLiteral',
24-
value,
25-
});
20+
return { type: 'NumericLiteral', value };
2621
case 'object':
27-
return transformer.createNode<babel.NullLiteral>({
28-
type: 'NullLiteral',
29-
});
22+
return { type: 'NullLiteral' };
3023
case 'string':
31-
return transformer.createNode<babel.StringLiteral>({
32-
type: 'StringLiteral',
33-
value,
34-
});
24+
return { type: 'StringLiteral', value };
3525
case 'undefined':
36-
return transformer.createNode<babel.Identifier>({
37-
type: 'Identifier',
38-
name: 'undefined',
39-
});
26+
return { type: 'Identifier', name: 'undefined' };
4027
/* c8 ignore next 4 */
4128
default:
4229
throw new Error(
@@ -47,10 +34,8 @@ export const visitLiteralPrimitive = (
4734

4835
export const visitRegularExpressionLiteral = (
4936
node: RegularExpressionLiteral,
50-
transformer: Transformer,
51-
) =>
52-
transformer.createNode<babel.RegExpLiteral>({
53-
type: 'RegExpLiteral',
54-
pattern: node.body,
55-
flags: node.flags ?? '',
56-
});
37+
): babel.RegExpLiteral => ({
38+
type: 'RegExpLiteral',
39+
pattern: node.body,
40+
flags: node.flags ?? '',
41+
});

src/transforms/transform-member-expression.ts

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {
2+
ImplicitReceiver,
23
type KeyedRead,
34
type PropertyRead,
45
type SafeKeyedRead,
@@ -42,53 +43,57 @@ const transformMemberExpression =
4243
computed,
4344
optional,
4445
}: Visitor['options']) =>
45-
(node: Visitor['node'], transformer: Transformer) => {
46-
const object = transformer.transformChild<babel.Expression>(node.receiver);
46+
(
47+
node: Visitor['node'],
48+
transformer: Transformer,
49+
):
50+
| babel.OptionalMemberExpression
51+
| babel.MemberExpression
52+
| babel.Identifier => {
53+
const { receiver } = node;
4754

4855
let property;
4956
if (computed) {
5057
const { key } = node as KeyedRead | SafeKeyedRead;
5158
property = transformer.transformChild<babel.Expression>(key);
5259
} else {
60+
const isImplicitReceiver = receiver instanceof ImplicitReceiver;
5361
const { name, nameSpan } = node as PropertyRead | SafePropertyRead;
5462
property = transformer.createNode<babel.Identifier>(
5563
{ type: 'Identifier', name: name },
5664
nameSpan,
57-
object ? [] : transformer.ancestors,
65+
isImplicitReceiver ? transformer.ancestors : [],
5866
);
59-
}
6067

61-
if (!object) {
62-
return property;
68+
if (isImplicitReceiver) {
69+
return property;
70+
}
6371
}
6472

73+
const object = transformer.transformChild<babel.Expression>(receiver);
74+
6575
const isOptionalObject = isOptionalObjectOrCallee(object);
6676

6777
if (optional || isOptionalObject) {
68-
return transformer.createNode<babel.OptionalMemberExpression>({
78+
return {
6979
type: 'OptionalMemberExpression',
7080
optional: optional || !isOptionalObject,
7181
computed,
7282
property,
7383
object,
74-
});
84+
};
7585
}
7686

7787
if (computed) {
78-
return transformer.createNode<babel.MemberExpressionComputed>({
79-
type: 'MemberExpression',
80-
property,
81-
object,
82-
computed: true,
83-
});
88+
return { type: 'MemberExpression', property, object, computed: true };
8489
}
8590

86-
return transformer.createNode<babel.MemberExpressionNonComputed>({
91+
return {
8792
type: 'MemberExpression',
8893
object,
8994
property: property as babel.MemberExpressionNonComputed['property'],
9095
computed: false,
91-
});
96+
};
9297
};
9398

9499
export const visitKeyedRead =

src/transforms/transform-object-expression.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ import type { NGNode, RawNGSpan } from '../types.ts';
77
export const visitLiteralMap = (
88
node: angular.LiteralMap,
99
transformer: Transformer,
10-
) => {
10+
): babel.ObjectExpression => {
1111
const { keys, values } = node;
1212
const createChild = <T extends NGNode>(
1313
properties: Partial<T> & { type: T['type'] },
1414
location: angular.AST | RawNGSpan | [number, number] = node,
1515
) =>
1616
transformer.create(properties, location, [node, ...transformer.ancestors]);
1717

18-
return transformer.createNode<babel.ObjectExpression>({
18+
return {
1919
type: 'ObjectExpression',
2020
properties: keys.map((keyNode, index) => {
2121
const valueNode = values[index];
@@ -40,5 +40,5 @@ export const visitLiteralMap = (
4040
[keyNode.sourceSpan.start, valueNode.sourceSpan.end],
4141
);
4242
}),
43-
});
43+
};
4444
};

src/transforms/transform-template-literal.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,10 @@ export const visitTemplateLiteralElement = (
4141
const start = node.sourceSpan.start + (isFirst ? 1 : 0);
4242
const raw = transformer.text.slice(start, end);
4343

44-
return transformer.createNode<babel.TemplateElement>(
45-
{
46-
type: 'TemplateElement',
47-
value: { cooked: node.text, raw },
48-
tail: isLast,
49-
},
50-
[start, end],
51-
);
44+
return {
45+
type: 'TemplateElement',
46+
value: { cooked: node.text, raw },
47+
tail: isLast,
48+
range: [start, end],
49+
};
5250
};

src/transforms/transform-unary-expression.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,26 +30,24 @@ const transformUnaryExpression =
3030
>(
3131
operator: Visitor['operator'],
3232
) =>
33-
(node: Visitor['node'], transformer: Transformer) =>
34-
transformer.createNode<babel.UnaryExpression>(
35-
{
36-
type: 'UnaryExpression',
37-
prefix: true,
38-
operator,
39-
argument: transformer.transformChild<babel.Expression>(node.expression),
40-
},
41-
node.sourceSpan,
42-
);
33+
(node: Visitor['node'], transformer: Transformer): babel.UnaryExpression => ({
34+
type: 'UnaryExpression',
35+
prefix: true,
36+
operator,
37+
argument: transformer.transformChild<babel.Expression>(node.expression),
38+
});
4339

4440
export const visitPrefixNot = transformUnaryExpression<VisitorPrefixNot>('!');
4541
export const visitTypeofExpression =
4642
transformUnaryExpression<VisitorTypeofExpression>('typeof');
4743
export const visitVoidExpression =
4844
transformUnaryExpression<VisitorVoidExpression>('void');
49-
export const visitUnary = (node: Unary, transformer: Transformer) =>
50-
transformer.createNode<babel.UnaryExpression>({
51-
type: 'UnaryExpression',
52-
prefix: true,
53-
argument: transformer.transformChild<babel.Expression>(node.expr),
54-
operator: node.operator as '-' | '+',
55-
});
45+
export const visitUnary = (
46+
node: Unary,
47+
transformer: Transformer,
48+
): babel.UnaryExpression => ({
49+
type: 'UnaryExpression',
50+
prefix: true,
51+
argument: transformer.transformChild<babel.Expression>(node.expr),
52+
operator: node.operator as '-' | '+',
53+
});
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { type ASTWithSource, type ImplicitReceiver } from '@angular/compiler';
2+
3+
function transformUnexpectedNode<T extends ASTWithSource | ImplicitReceiver>(
4+
node: T,
5+
) {
6+
throw new Error(`Unexpected node type '${node.constructor.name}'`);
7+
}
8+
9+
// Handled in `./transform-member-expression.ts`
10+
export const visitImplicitReceiver = transformUnexpectedNode<ImplicitReceiver>;
11+
// Unreachable
12+
export const visitASTWithSource = transformUnexpectedNode<ASTWithSource>;

0 commit comments

Comments
 (0)