41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import { NodeTransform } from '../transform'
|
|
import { findDir, makeBlock } from '../utils'
|
|
import {
|
|
createCallExpression,
|
|
createFunctionExpression,
|
|
ElementTypes,
|
|
MemoExpression,
|
|
NodeTypes,
|
|
PlainElementNode
|
|
} from '../ast'
|
|
import { WITH_MEMO } from '../runtimeHelpers'
|
|
|
|
const seen = new WeakSet()
|
|
|
|
export const transformMemo: NodeTransform = (node, context) => {
|
|
if (node.type === NodeTypes.ELEMENT) {
|
|
const dir = findDir(node, 'memo')
|
|
if (!dir || seen.has(node)) {
|
|
return
|
|
}
|
|
seen.add(node)
|
|
return () => {
|
|
const codegenNode =
|
|
node.codegenNode ||
|
|
(context.currentNode as PlainElementNode).codegenNode
|
|
if (codegenNode && codegenNode.type === NodeTypes.VNODE_CALL) {
|
|
// non-component sub tree should be turned into a block
|
|
if (node.tagType !== ElementTypes.COMPONENT) {
|
|
makeBlock(codegenNode, context)
|
|
}
|
|
node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [
|
|
dir.exp!,
|
|
createFunctionExpression(undefined, codegenNode),
|
|
`_cache`,
|
|
String(context.cached++)
|
|
]) as MemoExpression
|
|
}
|
|
}
|
|
}
|
|
}
|