Вход Регистрация
Файл: vendor/symfony/translation/Extractor/Visitor/ConstraintVisitor.php
Строк: 121
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentTranslationExtractorVisitor;

use 
PhpParserNode;
use 
PhpParserNodeVisitor;

/**
 * @author Mathieu Santostefano <msantostefano@protonmail.com>
 *
 * Code mostly comes from https://github.com/php-translation/extractor/blob/master/src/Visitor/Php/Symfony/Constraint.php
 */
final class ConstraintVisitor extends AbstractVisitor implements NodeVisitor
{
    public function 
__construct(
        private 
readonly array $constraintClassNames = []
    ) {
    }

    public function 
beforeTraverse(array $nodes): ?Node
    
{
        return 
null;
    }

    public function 
enterNode(Node $node): ?Node
    
{
        return 
null;
    }

    public function 
leaveNode(Node $node): ?Node
    
{
        if (!
$node instanceof NodeExprNew_ && !$node instanceof NodeAttribute) {
            return 
null;
        }

        
$className $node instanceof NodeAttribute $node->name $node->class;
        if (!
$className instanceof NodeName) {
            return 
null;
        }

        
$parts $className->getParts();
        
$isConstraintClass false;

        foreach (
$parts as $part) {
            if (
in_array($part$this->constraintClassNamestrue)) {
                
$isConstraintClass true;

                break;
            }
        }

        if (!
$isConstraintClass) {
            return 
null;
        }

        
$arg $node->args[0] ?? null;
        if (!
$arg instanceof NodeArg) {
            return 
null;
        }

        if (
$this->hasNodeNamedArguments($node)) {
            
$messages $this->getStringArguments($node'/message/i'true);
        } else {
            if (!
$arg->value instanceof NodeExprArray_) {
                
// There is no way to guess which argument is a message to be translated.
                
return null;
            }

            
$messages = [];
            
$options $arg->value;

            
/** @var NodeExprArrayItem $item */
            
foreach ($options->items as $item) {
                if (!
$item->key instanceof NodeScalarString_) {
                    continue;
                }

                if (
false === stripos($item->key->value ?? '''message')) {
                    continue;
                }

                if (!
$item->value instanceof NodeScalarString_) {
                    continue;
                }

                
$messages[] = $item->value->value;

                break;
            }
        }

        foreach (
$messages as $message) {
            
$this->addMessageToCatalogue($message'validators'$node->getStartLine());
        }

        return 
null;
    }

    public function 
afterTraverse(array $nodes): ?Node
    
{
        return 
null;
    }
}
Онлайн: 4
Реклама