Output ast tree built by nikic/php-parser and represented in mermaid using jbzoo/mermaid-php.
Extended \Kompaneytsev\MermaidNodeDumper\StyledNode
supports mermaid styles, check out advanced example.
<?php
require 'vendor/autoload.php';
use Kompaneytsev\MermaidNodeDumper\NodeDumper;
use PhpParser\ParserFactory;
$code = <<<'CODE'
<?php
function test($foo)
{
var_dump($foo);
}
CODE;
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
$ast = $parser->parse($code);
$dumper = new NodeDumper;
echo $dumper->dump($ast)->getLiveEditorUrl();
composer require --dev kompaneytsev/mermaid-node-dumper
vendor/bin/phpunit
vendor/bin/phpstan analyse
<?php
declare(strict_types=1);
require 'vendor/autoload.php';
use JBZoo\MermaidPHP\Node;
use Kompaneytsev\MermaidNodeDumper\NodeDumper;
use Kompaneytsev\MermaidNodeDumper\StyledNode as MermaidNode;
use PhpParser\Error;
use PhpParser\Node\Identifier;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Return_;
use PhpParser\ParserFactory;
use PhpParser\PrettyPrinter\Standard;
$code = <<<'CODE'
<?php
namespace App\Controller;
use Symfony\Component\HttpFoundation\Response;
class LuckyController
{
public function number(): Response
{
$number = random_int(0, 100);
return new Response(
'<html><body>Lucky number: '.$number.'</body></html>'
);
}
}
CODE;
$parser = (new ParserFactory)->create(ParserFactory::PREFER_PHP7);
try {
$ast = $parser->parse($code);
} catch (Error $error) {
echo "Parse error: {$error->getMessage()}\n";
return;
}
$dumper = new NodeDumper([
ClassMethod::class => static function (string $id, ClassMethod $node): MermaidNode {
$style = sprintf('style %s fill:#f9f,color:#000', $id);
$name = sprintf('%s (%s)', $node->getType(), $node->name);
return new MermaidNode($id, $name, Node::ROUND, $style);
},
Return_::class => static function (string $id, Return_ $node): MermaidNode {
$prettyPrinter = new Standard();
$style = sprintf('style %s fill:#ff0,color:#000', $id);
$name = sprintf('%s (%s)', $node->getType(), $prettyPrinter->prettyPrint([$node]));
return new MermaidNode($id, $name, Node::ROUND, $style);
},
],[
Return_::class => static function (Return_ $node): bool
{
return true;
}
], [
Identifier::class => static function (Identifier $node): bool
{
return true;
}
]);
echo (string) $dumper->dump($ast);