我正在尝试修改给定物理位置的树的特定部分。我的方法是使用
treeAt
提取子树,用 visit
语句修改它,然后更新原始树。但是,我不确定修改子树后如何正确更新初始树。
这是我到目前为止所做的尝试:
Tree update(Tree tree, loc location) {
TreeSearchResult[FunctionDeclaration] searchResult = treeAt(#FunctionDeclaration, location, tree);
Tree subtree;
if (treeFound(FunctionDeclaration foundTree) := searchResult) {
subtree = foundTree;
} else {
throw "The given position (loc) is not found in the tree";
}
subtree = visit(tree) { ... }; // applying transformation
// How to update the initial tree with the modified subtree ?
return tree;
}
有没有办法直接在特定位置执行
visit
操作,比如visit(tree, loc)
?
A visit 也会遍历树。所以你可以写:
return visit(tree) {
case FunctionDeclaration func => buildNewFunc(func)
when func@\loc == location
};
when
条款就像替换者的守卫。
我们也可以这样写:
return visit(tree) {
case FunctionDeclaration func: {
if (func@\loc == location) {
// calculate new tree
// and then replace the original `func` with this tree
insert newTree;
}
};