Skip to content

Commit 1d7646a

Browse files
committed
Rewrite
1 parent 379fd2a commit 1d7646a

9 files changed

Lines changed: 107 additions & 127 deletions
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { type LiteralArray } from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type Transformer } from '../transform-ast.ts';
5+
6+
export const visitLiteralArray = (
7+
node: LiteralArray,
8+
transformer: Transformer,
9+
): babel.ArrayExpression => ({
10+
type: 'ArrayExpression',
11+
elements: transformer.transformChildren<babel.Expression>(node.expressions),
12+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { type Chain } from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type Transformer } from '../transform-ast.ts';
5+
import type { NGChainedExpression } from '../types.ts';
6+
7+
export const visitChain = (
8+
node: Chain,
9+
transformer: Transformer,
10+
): Omit<NGChainedExpression, 'start' | 'end' | 'range'> => ({
11+
type: 'NGChainedExpression',
12+
expressions: transformer.transformChildren<babel.Expression>(
13+
node.expressions,
14+
),
15+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { type Interpolation } from '@angular/compiler';
2+
3+
import { type Transformer } from '../transform-ast.ts';
4+
5+
export const visitInterpolation = (
6+
node: Interpolation,
7+
transformer: Transformer,
8+
) => {
9+
const { expressions } = node;
10+
11+
/* c8 ignore next 3 @preserve */
12+
if (expressions.length !== 1) {
13+
throw new Error("Unexpected 'Interpolation'");
14+
}
15+
16+
return transformer.transformChild(expressions[0]);
17+
};
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { type NonNullAssert } from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type Transformer } from '../transform-ast.ts';
5+
6+
export const visitNonNullAssert = (
7+
node: NonNullAssert,
8+
transformer: Transformer,
9+
): babel.TSNonNullExpression => ({
10+
type: 'TSNonNullExpression',
11+
expression: transformer.transformChild<babel.Expression>(node.expression),
12+
});
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { type ParenthesizedExpression } from '@angular/compiler';
2+
3+
import { type Transformer } from '../transform-ast.ts';
4+
5+
export const visitParenthesizedExpression = (
6+
node: ParenthesizedExpression,
7+
transformer: Transformer,
8+
) => transformer.transformChild(node.expression);
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { type BindingPipe } from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type Transformer } from '../transform-ast.ts';
5+
import type { NGPipeExpression } from '../types.ts';
6+
7+
export const visitPipe = (
8+
node: BindingPipe,
9+
transformer: Transformer,
10+
): Omit<NGPipeExpression, 'start' | 'end' | 'range'> => ({
11+
type: 'NGPipeExpression',
12+
left: transformer.transformChild<babel.Expression>(node.exp),
13+
right: transformer.createNode<babel.Identifier>(
14+
{ type: 'Identifier', name: node.name },
15+
node.nameSpan,
16+
),
17+
arguments: transformer.transformChildren<babel.Expression>(node.args),
18+
});
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import type * as babel from '@babel/types';
2+
3+
export const visitThisReceiver = (): babel.ThisExpression => ({
4+
type: 'ThisExpression',
5+
});

src/transforms/transforms.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export * from './transform-array-expression.ts';
2+
export * from './transform-binary-expression.ts';
3+
export * from './transform-call-expression.ts';
4+
export * from './transform-chained-expression.ts';
5+
export * from './transform-conditional-expression.ts';
6+
export * from './transform-interpolation.ts';
7+
export * from './transform-literal.ts';
8+
export * from './transform-member-expression.ts';
9+
export * from './transform-non-null-expression.ts';
10+
export * from './transform-object-expression.ts';
11+
export * from './transform-parenthesized-expression.ts';
12+
export * from './transform-pipe-expression.ts';
13+
export * from './transform-template-literal.ts';
14+
export * from './transform-this-expression.ts';
15+
export * from './transform-unary-expression.ts';
16+
export * from './transform-unexpected-node.ts';

src/transforms/visitor.ts

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

4-
import { type Transformer } from '../transform-ast.ts';
5-
import type { NGChainedExpression, NGPipeExpression } from '../types.ts';
6-
import { visitBinary } from './transform-binary-expression.ts';
7-
import { visitCall, visitSafeCall } from './transform-call-expression.ts';
8-
import { visitConditional } from './transform-conditional-expression.ts';
9-
import {
10-
visitLiteralPrimitive,
11-
visitRegularExpressionLiteral,
12-
} from './transform-literal.ts';
13-
import {
14-
visitKeyedRead,
15-
visitPropertyRead,
16-
visitSafeKeyedRead,
17-
visitSafePropertyRead,
18-
} from './transform-member-expression.ts';
19-
import { visitLiteralMap } from './transform-object-expression.ts';
20-
import {
21-
visitTaggedTemplateLiteral,
22-
visitTemplateLiteral,
23-
visitTemplateLiteralElement,
24-
} from './transform-template-literal.ts';
25-
import {
26-
visitPrefixNot,
27-
visitTypeofExpression,
28-
visitUnary,
29-
visitVoidExpression,
30-
} from './transform-unary-expression.ts';
31-
import {
32-
visitASTWithSource,
33-
visitImplicitReceiver,
34-
} from './transform-unexpected-node.ts';
3+
import * as transforms from './transforms.ts';
354

36-
type AstVisitor = Required<Omit<angular.AstVisitor, 'visit'>>;
5+
type AstVisitor = Required<Omit<AngularAstVisitor, 'visit'>>;
376

38-
export const transformVisitor: AstVisitor = {
39-
visitCall,
40-
visitSafeCall,
41-
42-
visitKeyedRead,
43-
visitPropertyRead,
44-
visitSafeKeyedRead,
45-
visitSafePropertyRead,
46-
47-
visitPrefixNot,
48-
visitTypeofExpression,
49-
visitVoidExpression,
50-
visitUnary,
51-
52-
visitBinary,
53-
54-
visitLiteralMap,
55-
56-
visitLiteralPrimitive,
57-
visitRegularExpressionLiteral,
58-
59-
visitTaggedTemplateLiteral,
60-
visitTemplateLiteral,
61-
visitTemplateLiteralElement,
62-
63-
visitConditional,
64-
65-
visitPipe(
66-
node: angular.BindingPipe,
67-
transformer: Transformer,
68-
): Omit<NGPipeExpression, 'start' | 'end' | 'range'> {
69-
return {
70-
type: 'NGPipeExpression',
71-
left: transformer.transformChild<babel.Expression>(node.exp),
72-
right: transformer.createNode<babel.Identifier>(
73-
{ type: 'Identifier', name: node.name },
74-
node.nameSpan,
75-
),
76-
arguments: transformer.transformChildren<babel.Expression>(node.args),
77-
};
78-
},
79-
80-
visitChain(
81-
node: angular.Chain,
82-
transformer: Transformer,
83-
): Omit<NGChainedExpression, 'start' | 'end' | 'range'> {
84-
return {
85-
type: 'NGChainedExpression',
86-
expressions: transformer.transformChildren<babel.Expression>(
87-
node.expressions,
88-
),
89-
};
90-
},
91-
92-
visitThisReceiver: (): babel.ThisExpression => ({ type: 'ThisExpression' }),
93-
94-
visitLiteralArray: (
95-
node: angular.LiteralArray,
96-
transformer: Transformer,
97-
): babel.ArrayExpression => ({
98-
type: 'ArrayExpression',
99-
elements: transformer.transformChildren<babel.Expression>(node.expressions),
100-
}),
101-
102-
visitNonNullAssert: (
103-
node: angular.NonNullAssert,
104-
transformer: Transformer,
105-
): babel.TSNonNullExpression => ({
106-
type: 'TSNonNullExpression',
107-
expression: transformer.transformChild<babel.Expression>(node.expression),
108-
}),
109-
110-
visitParenthesizedExpression(
111-
node: angular.ParenthesizedExpression,
112-
transformer: Transformer,
113-
) {
114-
return transformer.transformChild(node.expression);
115-
},
116-
117-
visitInterpolation(node: angular.Interpolation, transformer: Transformer) {
118-
const { expressions } = node;
119-
120-
/* c8 ignore next 3 @preserve */
121-
if (expressions.length !== 1) {
122-
throw new Error("Unexpected 'Interpolation'");
123-
}
124-
125-
return transformer.transformChild(expressions[0]);
126-
},
127-
128-
visitASTWithSource,
129-
visitImplicitReceiver,
130-
};
7+
export const transformVisitor: AstVisitor = transforms;

0 commit comments

Comments
 (0)