使用 nikic/PHP-Parser 将节点插入 PHP AST
INSERT node into PHP AST with nikic/PHP-Parser
我正在使用 https://github.com/nikic/PHP-Parser。当想在 AST 中插入一个节点时,什么是好的策略?使用遍历器,我可以使用 NodeTraverser
class 轻松更新和删除节点。但是我怎样才能"INSERT before"或"INSERT after"一个节点呢?
示例:遍历 AST 名称空间时,我想在第一个非使用语句之前插入一个 Use
语句。
我开始使用 beforeTraverse
和 afterTraverse
来查找数组的索引,但它似乎过于复杂。有什么想法吗?
可以用多个节点替换一个节点。这仅在 leaveNode 内部有效,并且仅当父结构是数组时才有效。
public function leaveNode(Node $node) {
if ($node instanceof Node\Stmt\Return_ && $node->expr !== null) {
// Convert "return foo();" into "$retval = foo(); return $retval;"
$var = new Node\Expr\Variable('retval');
return [
new Node\Stmt\Expression(new Node\Expr\Assign($var, $node->expr)),
new Node\Stmt\Return_($var),
];
}
}
请参阅 Modyfing the AST
中的最后一节
我正在使用 https://github.com/nikic/PHP-Parser。当想在 AST 中插入一个节点时,什么是好的策略?使用遍历器,我可以使用 NodeTraverser
class 轻松更新和删除节点。但是我怎样才能"INSERT before"或"INSERT after"一个节点呢?
示例:遍历 AST 名称空间时,我想在第一个非使用语句之前插入一个 Use
语句。
我开始使用 beforeTraverse
和 afterTraverse
来查找数组的索引,但它似乎过于复杂。有什么想法吗?
可以用多个节点替换一个节点。这仅在 leaveNode 内部有效,并且仅当父结构是数组时才有效。
public function leaveNode(Node $node) {
if ($node instanceof Node\Stmt\Return_ && $node->expr !== null) {
// Convert "return foo();" into "$retval = foo(); return $retval;"
$var = new Node\Expr\Variable('retval');
return [
new Node\Stmt\Expression(new Node\Expr\Assign($var, $node->expr)),
new Node\Stmt\Return_($var),
];
}
}
请参阅 Modyfing the AST
中的最后一节