繁体   English   中英

PHP-Parser:漂亮的打印多行 arrays

[英]PHP-Parser: Pretty printing multi-line arrays

使用nikic/php-parser ,我正在尝试读取现有配置文件,在其中找到一个数组节点, append 一个新项目到该节点,然后将所有内容写回文件。
理想情况下,这不应修改文件的 rest,包括注释和空格。

我正在使用文档中概述的格式化保留漂亮打印的方法。

节点访问者大致如下所示(为清楚起见已截断):

$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>>' => []],
];

所以看起来保留格式的漂亮打印实际上确实删除了文件中所有项目之间的空行,即使我没有触摸它们,并且还将我现有的 arrays 从多行转换为单行。
我知道格式保留选项仍然是实验性的并且不完整,但是从我在文档中读到的内容,问题代码多行 arrays 实际上应该已经在工作,因此我希望其他项目保持不变至少。

有没有办法强制多行 output 用于数组结构? 我错过了什么? 我对 AST 操作还不是很深入。

您可以通过节点属性中的注释 class 添加空格。 (您可以只在注释文本中指定空格而不是注释字符。)例如,这里插入一个新的备用节点

return new Node\Stmt\Property(
        8,
        [new Node\Stmt\PropertyProperty(
            new Node\VarLikeIdentifier($ident),
            static::valueNode($value)
        )],
        ['comments'=>[new Comment("\n")]]
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM