| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import { NodeTransform } from '../transform'
- import { findDir } from '../utils'
- import {
- convertToBlock,
- 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) {
- convertToBlock(codegenNode, context)
- }
- node.codegenNode = createCallExpression(context.helper(WITH_MEMO), [
- dir.exp!,
- createFunctionExpression(undefined, codegenNode),
- `_cache`,
- String(context.cached++)
- ]) as MemoExpression
- }
- }
- }
- }
|