-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathgenerate.ts
67 lines (63 loc) · 1.43 KB
/
generate.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import {
genCall,
genExpression,
NEWLINE,
type CodeFragment,
type CodegenContext,
} from '@vue/compiler-vapor'
import {
IRNodeTypes,
type CreateNodesIRNode,
type OperationNode,
type SetNodesIRNode,
} from './ir'
import type { SimpleExpressionNode } from '@vue/compiler-dom'
export const customGenOperation = (
oper: OperationNode,
context: CodegenContext,
) => {
if (oper.type === IRNodeTypes.CREATE_NODES) {
return genCreateNodes(oper, context)
} else if (oper.type === IRNodeTypes.SET_NODES) {
return genSetNodes(oper, context)
}
}
export function genSetNodes(
oper: SetNodesIRNode,
context: CodegenContext,
): CodeFragment[] {
const { helper } = context
const { element, values, generated } = oper
return [
NEWLINE,
...genCall(
helper('setNodes'),
`${generated ? 'x' : 'n'}${element}`,
combineValues(values, context),
),
]
}
export function genCreateNodes(
oper: CreateNodesIRNode,
context: CodegenContext,
): CodeFragment[] {
const { helper } = context
const { id, values } = oper
return [
NEWLINE,
`const n${id} = `,
...genCall(helper('createNodes'), values && combineValues(values, context)),
]
}
function combineValues(
values: SimpleExpressionNode[],
context: CodegenContext,
): CodeFragment[] {
return values.flatMap((value, i) => {
const exp = genExpression(value, context)
if (i > 0) {
exp.unshift(', ')
}
return exp
})
}