使用nikic/php-parser,我正在尝试读取现有配置文件,在其中找到一个数组节点,将一个新项目附加到该节点,然后将所有内容写回文件。
理想情况下,这不应修改文件的其余部分,包括注释和空格。
我正在使用文档中概述的格式化保留漂亮打印的方法。
节点访问者大致如下所示(为清楚起见已截断):
$traverser = new NodeTraverser();
$traverser->addVisitor(new class extends Visitor {
public function leaveNode(Node $node): ?Node
{
if ($this->isParentNodeIAmLookingFor($node)) {
// Check whether the new item exists
if ($this->nodeAlreadyHasChild($node, $node->value->items)) {
throw new RuntimeException('Item exists');
}
// The structure I'd like to add
$newChild = new Expr\Array_();
$newChild->setAttribute( 'kind', Expr\Array_::KIND_SHORT);
// Adding a new item with my desired key into the target array here
$node->value->items[] = new Expr\ArrayItem(
$newChild,
new Scalar\String_('<<NEWLY_INSERTED_ITEM>>')
);
return $node;
}
return null;
}
});
原来的配置文件大概是这样的:
<?php
return [
'important stuff' => [
'with multiple lines',
/* ... */
],
// A comment I'd like to keep
'items' => [
'an existing item' => [ /* with stuff */ ],
# <------ this is where I'd like to add my new item
],
];
但是,PHP-Parser 会打印出什么:
<?php
return [
'important stuff' => ['with multiple lines', /* ... */ ],
// A comment I'd like to keep
'items' => ['an existing item' => [ /* with stuff */ ], '<<NEWLY_INSERTED_ITEM>>' => []],
];
所以看起来保留格式的漂亮打印实际上确实删除了文件中所有项目之间的空行,即使我没有触摸它们,并且还将我现有的数组从多行转换为单行。
我知道保留格式的选项仍然是实验性的和不完整的,但是从我在文档中读到的内容来看,问题和代码多行数组实际上应该已经可以工作了,因此我希望其他项目保持不变至少。
有没有办法强制数组结构的多行输出?我错过了什么?我对 AST 操作还不是很深入。