diff --git a/src/NodeVisitor/ClassConstant.php b/src/NodeVisitor/ClassConstant.php index 8ea8f58..8ddcdbf 100644 --- a/src/NodeVisitor/ClassConstant.php +++ b/src/NodeVisitor/ClassConstant.php @@ -31,7 +31,7 @@ public function __construct(IdentifierGenerator $lineGenerator) public static function forClassConstant( string $constantName, - string $constantValue, + $constantValue, int $flags = ClassConstGenerator::FLAG_PUBLIC ): ClassConstant { return new self( @@ -56,8 +56,8 @@ public function afterTraverse(array $nodes): ?array return null; } $stmt->stmts = \array_merge( - $this->lineGenerator->generate(), - $stmt->stmts + $stmt->stmts, + $this->lineGenerator->generate() ); } } @@ -66,8 +66,8 @@ public function afterTraverse(array $nodes): ?array return null; } $node->stmts = \array_merge( - $this->lineGenerator->generate(), - $node->stmts + $node->stmts, + $this->lineGenerator->generate() ); } } diff --git a/tests/NodeVisitor/ClassConstantTest.php b/tests/NodeVisitor/ClassConstantTest.php index 992285e..8dfdc21 100644 --- a/tests/NodeVisitor/ClassConstantTest.php +++ b/tests/NodeVisitor/ClassConstantTest.php @@ -9,6 +9,8 @@ use OpenCodeModeling\CodeAst\NodeVisitor\ClassConstant; use OpenCodeModeling\CodeAst\NodeVisitor\ClassFile; use OpenCodeModeling\CodeAst\NodeVisitor\ClassNamespace; +use OpenCodeModeling\CodeAst\NodeVisitor\ClassUseTrait; +use OpenCodeModeling\CodeAst\NodeVisitor\NamespaceUse; use OpenCodeModeling\CodeAst\NodeVisitor\StrictType; use OpenCodeModeling\JsonSchemaToPhpAst\ValueObject\BooleanFactory; use PhpParser\NodeTraverser; @@ -137,6 +139,40 @@ class TestClass { private const TYPE_STRING = 'string'; } +EOF; + + $this->assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast))); + } + + /** + * @test + */ + public function it_preserves_order_of_registered_visitors() + { + $ast = $this->parser->parse(''); + + $nodeTraverser = new NodeTraverser(); + $nodeTraverser->addVisitor(new StrictType()); + $nodeTraverser->addVisitor(new ClassNamespace('My\\Awesome\\Service')); + $nodeTraverser->addVisitor(new NamespaceUse('My\\Awesome\\ServiceTrait')); + $nodeTraverser->addVisitor(new ClassFile(new ClassGenerator('TestClass'))); + $nodeTraverser->addVisitor(new ClassUseTrait('ServiceTrait')); + $nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_STRING', 'string')); + $nodeTraverser->addVisitor(ClassConstant::forClassConstant('TYPE_INT', 3)); + + $expected = <<<'EOF' +assertSame($expected, $this->printer->prettyPrintFile($nodeTraverser->traverse($ast)));