Skip to content

Commit bee23af

Browse files
committed
Support ArrowFunctionExpression
1 parent 7eb6ddd commit bee23af

4 files changed

Lines changed: 45 additions & 1 deletion

File tree

src/ast-transform/transforms/index.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
export * from './transform-array-expression.ts';
2+
export * from './transform-arrow-function-expression.ts';
23
export * from './transform-ast-with-source.ts';
34
export * from './transform-binary-expression.ts';
45
export * from './transform-call-expression.ts';
56
export * from './transform-chained-expression.ts';
67
export * from './transform-conditional-expression.ts';
7-
export * from './transform-empty-expression.ts'
8+
export * from './transform-empty-expression.ts';
89
export * from './transform-interpolation.ts';
910
export * from './transform-literal.ts';
1011
export * from './transform-member-expression.ts';
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { type ArrowFunction, type AstVisitor } from '@angular/compiler';
2+
import type * as babel from '@babel/types';
3+
4+
import { type NodeTransformer } from '../node-transformer.ts';
5+
6+
const commonProperties = {
7+
id: null,
8+
generator: false,
9+
async: false,
10+
expression: true,
11+
} as const;
12+
13+
export const visitArrowFunction: AstVisitor['visitArrowFunction'] = (
14+
node: ArrowFunction,
15+
transformer: NodeTransformer,
16+
): babel.ArrowFunctionExpression & { id: null } => ({
17+
type: 'ArrowFunctionExpression',
18+
params: node.parameters.map((parameter) =>
19+
transformer.createNode<babel.Identifier>(
20+
{ type: 'Identifier', name: parameter.name },
21+
parameter.sourceSpan,
22+
),
23+
),
24+
body: transformer.transformChild(node.body) as babel.Expression,
25+
...commonProperties,
26+
});

tests/helpers.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,13 @@ export function massageAst(ast: any, parser: 'babel' | 'angular'): any {
4646
delete ast.extra.trailingComma;
4747
}
4848

49+
if (
50+
ast.type === 'ArrowFunctionExpression' &&
51+
!Object.hasOwn(ast, 'expression')
52+
) {
53+
ast.expression = ast.body.type !== 'BlockStatement';
54+
}
55+
4956
delete ast.loc;
5057
}
5158

tests/transform.test.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,16 @@ const testCases: TestCase[] = [
500500
expectedEstreeType: 'ObjectExpression',
501501
text: ' ( ( {foo: tag ` a ${ b } ` } ) ) ',
502502
},
503+
{
504+
expectedAngularType: 'ArrowFunction',
505+
expectedEstreeType: 'ArrowFunctionExpression',
506+
text: ' ( ( () => ( ( 1 ) ) ) ) ',
507+
},
508+
{
509+
expectedAngularType: 'ArrowFunction',
510+
expectedEstreeType: 'ArrowFunctionExpression',
511+
text: ' ( ( (a) => ( ( 1 ) ) ) ) ',
512+
},
503513
];
504514

505515
const IS_CI = Boolean(process.env.CI);

0 commit comments

Comments
 (0)