diff --git a/kernel/model/push_reload.go b/kernel/model/push_reload.go index 47771c9c6..2db2c5359 100644 --- a/kernel/model/push_reload.go +++ b/kernel/model/push_reload.go @@ -206,9 +206,9 @@ func refreshDynamicRefTexts0(updatedDefNodes map[string]*ast.Node, updatedTrees // 1. 更新引用的动态锚文本 treeRefNodeIDs := map[string]*hashset.Set{} - var changedParentNodes []*ast.Node + var changedNodes []*ast.Node for _, updateNode := range updatedDefNodes { - refs, parentNodes := getRefsCacheByDefNode(updateNode) + refs, parentNodes, childNodes := getRefsCacheByDefNode(updateNode) for _, ref := range refs { if refIDs, ok := treeRefNodeIDs[ref.RootID]; !ok { refIDs = hashset.New() @@ -219,13 +219,14 @@ func refreshDynamicRefTexts0(updatedDefNodes map[string]*ast.Node, updatedTrees } } if 0 < len(parentNodes) { - changedParentNodes = append(changedParentNodes, parentNodes...) + changedNodes = append(changedNodes, parentNodes...) + } + if 0 < len(childNodes) { + changedNodes = append(changedNodes, childNodes...) } } - if 0 < len(changedParentNodes) { - for _, parent := range changedParentNodes { - updatedDefNodes[parent.ID] = parent - } + for _, n := range changedNodes { + updatedDefNodes[n.ID] = n } changedRefTree := map[string]*parse.Tree{} diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 166f96326..a2088f579 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1612,10 +1612,10 @@ func (tx *Transaction) writeTree(tree *parse.Tree) (err error) { return } -func getRefsCacheByDefNode(updateNode *ast.Node) (ret []*sql.Ref, changedParentNodes []*ast.Node) { +func getRefsCacheByDefNode(updateNode *ast.Node) (ret []*sql.Ref, changedParentNodes, changedChildNodes []*ast.Node) { ret = sql.GetRefsCacheByDefID(updateNode.ID) if nil != updateNode.Parent && ast.NodeDocument != updateNode.Parent.Type && - updateNode.Parent.IsContainerBlock() && updateNode == treenode.FirstLeafBlock(updateNode.Parent) { // 容器块下第一个叶子块 + updateNode.Parent.IsContainerBlock() && updateNode == treenode.FirstLeafBlock(updateNode.Parent) { // 如果是容器块下第一个叶子块,则需要向上查找引用 for parent := updateNode.Parent; nil != parent; parent = parent.Parent { if ast.NodeDocument == parent.Type { @@ -1629,6 +1629,21 @@ func getRefsCacheByDefNode(updateNode *ast.Node) (ret []*sql.Ref, changedParentN } } } + if ast.NodeDocument != updateNode.Type && updateNode.IsContainerBlock() { + // 如果是容器块,则需要向下查找引用 + ast.Walk(updateNode, func(n *ast.Node, entering bool) ast.WalkStatus { + if !entering || !n.IsBlock() { + return ast.WalkContinue + } + + childRefs := sql.GetRefsCacheByDefID(n.ID) + if 0 < len(childRefs) { + ret = append(ret, childRefs...) + changedChildNodes = append(changedChildNodes, n) + } + return ast.WalkContinue + }) + } return }