From f8fb9c5aef227aab13374ffba39f123b4cf82a68 Mon Sep 17 00:00:00 2001 From: * <8> Date: Tue, 29 Mar 2022 17:58:41 +0800 Subject: [PATCH] Match-id-14bd1b592a5b4fba4420cfbf2a18d92b33b5c237 --- libs/extension/src/parser/parseVNode.ts | 59 +++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 libs/extension/src/parser/parseVNode.ts diff --git a/libs/extension/src/parser/parseVNode.ts b/libs/extension/src/parser/parseVNode.ts new file mode 100644 index 00000000..bb8ad91d --- /dev/null +++ b/libs/extension/src/parser/parseVNode.ts @@ -0,0 +1,59 @@ +import { travelVNodeTree } from "../../../../libs/horizon/src/renderer/vnode/VNodeUtils"; +import { VNode } from "../../../../libs/horizon/src/renderer/Types"; +import { ClassComponent, FunctionComponent } from "../../../../libs/horizon/src/renderer/vnode/VNodeTags"; + +const VNodeToIdMap = new Map(); +const IdToVNodeMap = new Map(); + +let uid = 0; +function generateUid () { + uid++; + return uid; +} + +function isUserComponent(tag: string) { + // TODO: 添加其他组件 + return tag === ClassComponent || tag === FunctionComponent; +} + +function getParentUserComponent(node: VNode) { + let parent = node.parent; + while(parent) { + if (isUserComponent(parent.tag)) { + break; + } + parent = parent.parent; + } + return parent; +} + +function parseTreeRoot(treeRoot: VNode) { + const result: any[] = []; + travelVNodeTree(treeRoot, (node: VNode) => { + const tag = node.tag; + if (isUserComponent(tag)) { + const id = generateUid(); + result.push(id); + const name = (node.type as Function).name; + result.push(name); + const parent = getParentUserComponent(node); + if (parent) { + const parentId = VNodeToIdMap.get(parent); + result.push(parentId); + } else { + result.push(''); + } + const key = node.key; + if (key !== null) { + result.push(key); + } else { + result.push(''); + } + VNodeToIdMap.set(node, id); + IdToVNodeMap.set(id, node); + } + }, null, treeRoot, null); + return result; +} + +export default parseTreeRoot;