使用 PHP-Parser 生成代码

先说结果,没有成功,已经提了issue:https://github.com/nikic/PHP-Parser/issues/731
代码如下:

        $code = <<<'CODE'
<?php
namespace Name\Space;

        class SomeClass
        {
            protected function check($orderData)
            {
                if ($result) {

                }
            }
        }
CODE;
        // 1.将php源代码转成ast
        $parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
        try {
            $ast = $parser->parse($code);
        } catch (Error $error) {
            echo "Parse error: {$error->getMessage()}\n";
            return;
        }

        $traverser = new NodeTraverser;
        // 2. 修改if子句
        $traverser->addVisitor(new class extends NodeVisitorAbstract {
            public function leaveNode(Node $node) {
                if ($node instanceof If_) {
                    $node->stmts = [
                        (new BuilderFactory)->var('foo')
                    ];
                }
            }
        });
        $traverser->traverse($ast);
        // 3. 输出php代码
        $prettyPrinter = new PrettyPrinter\Standard();
        echo $prettyPrinter->prettyPrintFile($ast);
    }

最后生成的代码如下

<?php

namespace Name\Space;

class SomeClass
{
    protected function check($orderData)
    {
        if ($result) {
            $foo
        }
    }
}

可以看到$foo变量后面的分号丢掉了...

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。