private internalInsertAfter()

in packages/core/src/rendering/render-chunk.tsx [382:426]


  private internalInsertAfter(child: ChildType, after?: ChildType) {
    const childParentData = child.parentData!
    assert(!childParentData.nextSiblingInChunk, 'child 不能已关联 nextSiblingInChunk')
    assert(!childParentData.prevSiblingInChunk, 'child 不能已关联 prevSiblingInChunk')
    assert(!childParentData.chunk, 'child 不能已分配 chunk')
    childParentData.chunk = this
    child.offstage = false
    this._childCount++
    assert(this._childCount > 0)
    if (!after) {
      // 从头部插入 (_firstChild)
      childParentData.nextSiblingInChunk = this._firstChild
      if (this._firstChild) {
        const firstChildParentData = this._firstChild.parentData
        assert(firstChildParentData)
        firstChildParentData.prevSiblingInChunk = child
      }
      this._firstChild = child
      this._lastChild ??= child
    } else {
      assert(this._firstChild)
      assert(this._lastChild)
      assert(this.debugUltimatePrevSiblingOf(after, this._firstChild))
      assert(this.debugUltimateNextSiblingOf(after, this._lastChild))
      const afterParentData = after.parentData!
      if (!afterParentData.nextSiblingInChunk) {
        // 从尾部插入 (_lastChild)
        assert(after === this._lastChild)
        childParentData.prevSiblingInChunk = after
        afterParentData.nextSiblingInChunk = child
        this._lastChild = child
      } else {
        // 从中间插入
        childParentData.nextSiblingInChunk = afterParentData.nextSiblingInChunk
        childParentData.prevSiblingInChunk = after
        const childPrevSiblingParentData = childParentData.prevSiblingInChunk!.parentData!
        const childNextSiblingParentData = childParentData.nextSiblingInChunk!.parentData!
        childPrevSiblingParentData.nextSiblingInChunk = child
        childNextSiblingParentData.prevSiblingInChunk = child
        assert(afterParentData.nextSiblingInChunk === child)
      }
    }
    this._layoutDirty = true
    this._paintDirty = true
  }