Skip to content

Commit 1f4d75b

Browse files
committed
Refactor
1 parent c5d4695 commit 1f4d75b

File tree

4 files changed

+115
-99
lines changed

4 files changed

+115
-99
lines changed

src/transform-ast.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as angular from '@angular/compiler';
22

33
import { Source } from './source.ts';
4-
import { transformVisitor } from './transform-visitor.ts';
4+
import { transformVisitor } from './transforms/visitor.ts';
55
import type { NGEmptyExpression, NGNode, RawNGSpan } from './types.ts';
66

77
class Transformer extends Source {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import {
2+
type LiteralPrimitive,
3+
type RegularExpressionLiteral,
4+
} from '@angular/compiler';
5+
import type * as babel from '@babel/types';
6+
7+
import { type Transformer } from '../transform-ast.ts';
8+
9+
export const visitLiteralPrimitive = (
10+
node: LiteralPrimitive,
11+
transformer: Transformer,
12+
) => {
13+
const { value } = node;
14+
switch (typeof value) {
15+
case 'boolean':
16+
return transformer.createNode<babel.BooleanLiteral>({
17+
type: 'BooleanLiteral',
18+
value,
19+
});
20+
case 'number':
21+
return transformer.createNode<babel.NumericLiteral>({
22+
type: 'NumericLiteral',
23+
value,
24+
});
25+
case 'object':
26+
return transformer.createNode<babel.NullLiteral>({
27+
type: 'NullLiteral',
28+
});
29+
case 'string':
30+
return transformer.createNode<babel.StringLiteral>({
31+
type: 'StringLiteral',
32+
value,
33+
});
34+
case 'undefined':
35+
return transformer.createNode<babel.Identifier>({
36+
type: 'Identifier',
37+
name: 'undefined',
38+
});
39+
/* c8 ignore next 4 */
40+
default:
41+
throw new Error(
42+
`Unexpected 'LiteralPrimitive' value type ${typeof value}`,
43+
);
44+
}
45+
};
46+
47+
export const visitRegularExpressionLiteral = (
48+
node: RegularExpressionLiteral,
49+
transformer: Transformer,
50+
) =>
51+
transformer.createNode<babel.RegExpLiteral>({
52+
type: 'RegExpLiteral',
53+
pattern: node.body,
54+
flags: node.flags ?? '',
55+
});
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import type * as angular from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type Transformer } from '../transform-ast.ts';
5+
import type { NGNode, RawNGSpan } from '../types.ts';
6+
7+
export const visitLiteralMap = (
8+
node: angular.LiteralMap,
9+
transformer: Transformer,
10+
) => {
11+
const { keys, values } = node;
12+
const createChild = <T extends NGNode>(
13+
properties: Partial<T> & { type: T['type'] },
14+
location: angular.AST | RawNGSpan | [number, number] = node,
15+
) =>
16+
transformer.create(properties, location, [node, ...transformer.ancestors]);
17+
18+
return transformer.createNode<babel.ObjectExpression>({
19+
type: 'ObjectExpression',
20+
properties: keys.map((keyNode, index) => {
21+
const valueNode = values[index];
22+
const shorthand = Boolean(keyNode.isShorthandInitialized);
23+
const key = createChild<babel.Identifier | babel.StringLiteral>(
24+
keyNode.quoted
25+
? { type: 'StringLiteral', value: keyNode.key }
26+
: { type: 'Identifier', name: keyNode.key },
27+
keyNode.sourceSpan,
28+
);
29+
30+
return createChild<babel.ObjectPropertyNonComputed>(
31+
{
32+
type: 'ObjectProperty',
33+
key,
34+
value: transformer.transformChild<babel.Expression>(valueNode),
35+
shorthand,
36+
computed: false,
37+
// @ts-expect-error -- Missed in types
38+
method: false,
39+
},
40+
[keyNode.sourceSpan.start, valueNode.sourceSpan.end],
41+
);
42+
}),
43+
});
44+
};
Lines changed: 15 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
import * as angular from '@angular/compiler';
22
import type * as babel from '@babel/types';
33

4-
import { type Transformer } from './transform-ast.ts';
5-
import { visitCall, visitSafeCall } from './transforms/transform-call.ts';
4+
import { type Transformer } from '../transform-ast.ts';
5+
import type { NGChainedExpression, NGPipeExpression } from '../types.ts';
6+
import { visitCall, visitSafeCall } from './transform-call.ts';
7+
import {
8+
visitLiteralPrimitive,
9+
visitRegularExpressionLiteral,
10+
} from './transform-literal.ts';
611
import {
712
visitKeyedRead,
813
visitPropertyRead,
914
visitSafeKeyedRead,
1015
visitSafePropertyRead,
11-
} from './transforms/transform-member-expression.ts';
16+
} from './transform-member-expression.ts';
17+
import { visitLiteralMap } from './transform-object-expression.ts';
1218
import {
1319
visitPrefixNot,
1420
visitTypeofExpression,
1521
visitUnary,
1622
visitVoidExpression,
17-
} from './transforms/transform-unary-expression.ts';
18-
import type {
19-
NGChainedExpression,
20-
NGNode,
21-
NGPipeExpression,
22-
RawNGSpan,
23-
} from './types.ts';
23+
} from './transform-unary-expression.ts';
2424

2525
type AstVisitor = Required<
2626
Omit<angular.AstVisitor, 'visit' | 'visitASTWithSource'>
@@ -40,6 +40,11 @@ export const transformVisitor: AstVisitor = {
4040
visitVoidExpression,
4141
visitUnary,
4242

43+
visitLiteralMap,
44+
45+
visitLiteralPrimitive,
46+
visitRegularExpressionLiteral,
47+
4348
visitBinary(node: angular.Binary, transformer: Transformer) {
4449
const { operation: operator } = node;
4550
const [left, right] = transformer.transformChildren<babel.Expression>([
@@ -125,94 +130,6 @@ export const transformVisitor: AstVisitor = {
125130
});
126131
},
127132

128-
visitLiteralMap(node: angular.LiteralMap, transformer: Transformer) {
129-
const { keys, values } = node;
130-
const createChild = <T extends NGNode>(
131-
properties: Partial<T> & { type: T['type'] },
132-
location: angular.AST | RawNGSpan | [number, number] = node,
133-
) =>
134-
transformer.create(properties, location, [
135-
node,
136-
...transformer.ancestors,
137-
]);
138-
139-
return transformer.createNode<babel.ObjectExpression>({
140-
type: 'ObjectExpression',
141-
properties: keys.map((keyNode, index) => {
142-
const valueNode = values[index];
143-
const shorthand = Boolean(keyNode.isShorthandInitialized);
144-
const key = createChild<babel.Identifier | babel.StringLiteral>(
145-
keyNode.quoted
146-
? { type: 'StringLiteral', value: keyNode.key }
147-
: { type: 'Identifier', name: keyNode.key },
148-
keyNode.sourceSpan,
149-
);
150-
151-
return createChild<babel.ObjectPropertyNonComputed>(
152-
{
153-
type: 'ObjectProperty',
154-
key,
155-
value: transformer.transformChild<babel.Expression>(valueNode),
156-
shorthand,
157-
computed: false,
158-
// @ts-expect-error -- Missed in types
159-
method: false,
160-
},
161-
[keyNode.sourceSpan.start, valueNode.sourceSpan.end],
162-
);
163-
}),
164-
});
165-
},
166-
167-
visitLiteralPrimitive(
168-
node: angular.LiteralPrimitive,
169-
transformer: Transformer,
170-
) {
171-
const { value } = node;
172-
switch (typeof value) {
173-
case 'boolean':
174-
return transformer.createNode<babel.BooleanLiteral>({
175-
type: 'BooleanLiteral',
176-
value,
177-
});
178-
case 'number':
179-
return transformer.createNode<babel.NumericLiteral>({
180-
type: 'NumericLiteral',
181-
value,
182-
});
183-
case 'object':
184-
return transformer.createNode<babel.NullLiteral>({
185-
type: 'NullLiteral',
186-
});
187-
case 'string':
188-
return transformer.createNode<babel.StringLiteral>({
189-
type: 'StringLiteral',
190-
value,
191-
});
192-
case 'undefined':
193-
return transformer.createNode<babel.Identifier>({
194-
type: 'Identifier',
195-
name: 'undefined',
196-
});
197-
/* c8 ignore next 4 */
198-
default:
199-
throw new Error(
200-
`Unexpected LiteralPrimitive value type ${typeof value}`,
201-
);
202-
}
203-
},
204-
205-
visitRegularExpressionLiteral(
206-
node: angular.RegularExpressionLiteral,
207-
transformer: Transformer,
208-
) {
209-
return transformer.createNode<babel.RegExpLiteral>({
210-
type: 'RegExpLiteral',
211-
pattern: node.body,
212-
flags: node.flags ?? '',
213-
});
214-
},
215-
216133
visitNonNullAssert(node: angular.NonNullAssert, transformer: Transformer) {
217134
return transformer.createNode<babel.TSNonNullExpression>({
218135
type: 'TSNonNullExpression',

0 commit comments

Comments
 (0)