簡體   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