diff --git a/libs/horizon/src/external/JSXElement.ts b/libs/horizon/src/external/JSXElement.ts index b654a841..c2b4855e 100644 --- a/libs/horizon/src/external/JSXElement.ts +++ b/libs/horizon/src/external/JSXElement.ts @@ -1,6 +1,6 @@ -import {TYPE_COMMON_ELEMENT} from './JSXElementType'; -import {getProcessingClassVNode} from '../renderer/GlobalVar'; - +import { TYPE_COMMON_ELEMENT } from './JSXElementType'; +import { getProcessingClassVNode } from '../renderer/GlobalVar'; +import { Source } from '../renderer/Types'; /** * vtype 节点的类型,这里固定是element @@ -9,7 +9,7 @@ import {getProcessingClassVNode} from '../renderer/GlobalVar'; * ref ref属性 * props 其他常规属性 */ -export function JSXElement(type, key, ref, vNode, props, source) { +export function JSXElement(type, key, ref, vNode, props, source: Source | null) { return { // 元素标识符 vtype: TYPE_COMMON_ELEMENT, @@ -27,12 +27,7 @@ export function JSXElement(type, key, ref, vNode, props, source) { } function isValidKey(key) { - const keyArray = [ - 'key', - 'ref', - '__source', - '__self', - ]; + const keyArray = ['key', 'ref', '__source', '__self']; return !keyArray.includes(key); } @@ -46,9 +41,9 @@ function mergeDefault(sourceObj, defaultObj) { function buildElement(isClone, type, setting, children) { // setting中的值优先级最高,clone情况下从 type 中取值,创建情况下直接赋值为 null - const key = (setting && setting.key !== undefined) ? String(setting.key) : (isClone ? type.key : null); - const ref = (setting && setting.ref !== undefined) ? setting.ref : (isClone ? type.ref : null); - const props = isClone ? {...type.props} : {}; + const key = setting && setting.key !== undefined ? String(setting.key) : isClone ? type.key : null; + const ref = setting && setting.ref !== undefined ? setting.ref : isClone ? type.ref : null; + const props = isClone ? { ...type.props } : {}; let vNode = isClone ? type.belongClassVNode : getProcessingClassVNode(); if (setting !== null && setting !== undefined) { @@ -73,8 +68,15 @@ function buildElement(isClone, type, setting, children) { if (element && element.defaultProps) { mergeDefault(props, element.defaultProps); } + let src: Source | null = null; + if (setting?.__source) { + src = { + fileName: setting.__source.fileName, + lineNumber: setting.__source.lineNumber, + }; + } - return JSXElement(element, key, ref, vNode, props, setting?.__source ?? null); + return JSXElement(element, key, ref, vNode, props, src); } // 创建Element结构体,供JSX编译时调用 diff --git a/libs/horizon/src/renderer/Types.ts b/libs/horizon/src/renderer/Types.ts index b36e9cf3..b05f5be4 100644 --- a/libs/horizon/src/renderer/Types.ts +++ b/libs/horizon/src/renderer/Types.ts @@ -59,7 +59,6 @@ export interface SuspenseState { } export type Source = { - columnNumber: number; fileName: string; lineNumber: number; }; diff --git a/libs/horizon/src/renderer/render/MemoComponent.ts b/libs/horizon/src/renderer/render/MemoComponent.ts index d0331f4c..270346e7 100644 --- a/libs/horizon/src/renderer/render/MemoComponent.ts +++ b/libs/horizon/src/renderer/render/MemoComponent.ts @@ -1,21 +1,19 @@ -import type {VNode} from '../Types'; +import type { Source, VNode } from '../Types'; -import {mergeDefaultProps} from './LazyComponent'; -import {updateVNode, onlyUpdateChildVNodes, createFragmentVNode, createUndeterminedVNode} from '../vnode/VNodeCreator'; -import {shallowCompare} from '../utils/compare'; +import { mergeDefaultProps } from './LazyComponent'; import { - TYPE_FRAGMENT, - TYPE_PROFILER, - TYPE_STRICT_MODE, -} from '../../external/JSXElementType'; + updateVNode, + onlyUpdateChildVNodes, + createFragmentVNode, + createUndeterminedVNode, +} from '../vnode/VNodeCreator'; +import { shallowCompare } from '../utils/compare'; +import { TYPE_FRAGMENT, TYPE_PROFILER, TYPE_STRICT_MODE } from '../../external/JSXElementType'; import { markVNodePath } from '../utils/vNodePath'; export function bubbleRender() {} -export function captureMemoComponent( - processing: VNode, - shouldUpdate: boolean, -): VNode | null { +export function captureMemoComponent(processing: VNode, shouldUpdate: boolean): VNode | null { const Component = processing.type; // 合并 函数组件或类组件 的defaultProps const newProps = mergeDefaultProps(Component, processing.props); @@ -26,7 +24,7 @@ export function captureMemoComponent( if (type === TYPE_STRICT_MODE || type === TYPE_FRAGMENT || type === TYPE_PROFILER) { newChild = createFragmentVNode(null, newProps.children); } else { - newChild = createUndeterminedVNode(type, null, newProps,processing.src); + newChild = createUndeterminedVNode(type, null, newProps, processing.src); } newChild.parent = processing; newChild.ref = processing.ref; diff --git a/libs/horizon/src/renderer/vnode/VNodeCreator.ts b/libs/horizon/src/renderer/vnode/VNodeCreator.ts index 3a7f7085..ff906d59 100644 --- a/libs/horizon/src/renderer/vnode/VNodeCreator.ts +++ b/libs/horizon/src/renderer/vnode/VNodeCreator.ts @@ -27,7 +27,7 @@ import { TYPE_SUSPENSE, } from '../../external/JSXElementType'; import { VNode } from './VNode'; -import { JSXElement } from '../Types'; +import { JSXElement, Source } from '../Types'; import { markVNodePath } from '../utils/vNodePath'; const typeLazyMap = { @@ -105,7 +105,7 @@ export function createPortalVNode(portal) { return vNode; } -export function createUndeterminedVNode(type, key, props, source) { +export function createUndeterminedVNode(type, key, props, source: Source | null): VNode { let vNodeTag = FunctionComponent; let isLazy = false; const componentType = typeof type;