app = $app; $this->traverser = new \PHPParser_NodeTraverser(); $this->traverser->addVisitor($this); } public function enterNode(\PHPParser_Node $node) { if ($node instanceof \PHPParser_Node_Stmt_Namespace) { $this->namespace = implode('\\', $node->name->parts); return; } if (!$node instanceof \PHPParser_Node_Stmt_Class) { return; } $name = '' === $this->namespace ? $node->name : $this->namespace.'\\'.$node->name; if (!class_exists($name)) { return; } if (!is_a($name, 'Symfony\Component\Validator\Constraint', true)) { return; } $constraint = $name::create($this->app); $ref = new \ReflectionClass($name); foreach ($this->messageProperties as $prop) { if ($ref->hasProperty($prop)) { $message = new Message($constraint->$prop, 'validators'); $this->catalogue->add($message); } } } public function visitPhpFile(\SplFileInfo $file, MessageCatalogue $catalogue, array $ast) { $this->file = $file; $this->namespace = ''; $this->catalogue = $catalogue; $this->traverser->traverse($ast); } public function beforeTraverse(array $nodes) { } public function leaveNode(\PHPParser_Node $node) { } public function afterTraverse(array $nodes) { } public function visitFile(\SplFileInfo $file, MessageCatalogue $catalogue) { } public function visitTwigFile(\SplFileInfo $file, MessageCatalogue $catalogue, \Twig_Node $ast) { } }