vendor/symfony/translation/Extractor/Visitor/AbstractVisitor.php line 84

  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Symfony\Component\Translation\Extractor\Visitor;
  11. use PhpParser\Node;
  12. use Symfony\Component\Translation\MessageCatalogue;
  13. /**
  14.  * @author Mathieu Santostefano <msantostefano@protonmail.com>
  15.  */
  16. abstract class AbstractVisitor
  17. {
  18.     private MessageCatalogue $catalogue;
  19.     private \SplFileInfo $file;
  20.     private string $messagePrefix;
  21.     public function initialize(MessageCatalogue $catalogue\SplFileInfo $filestring $messagePrefix): void
  22.     {
  23.         $this->catalogue $catalogue;
  24.         $this->file $file;
  25.         $this->messagePrefix $messagePrefix;
  26.     }
  27.     protected function addMessageToCatalogue(string $message, ?string $domainint $line): void
  28.     {
  29.         $domain ??= 'messages';
  30.         $this->catalogue->set($message$this->messagePrefix.$message$domain);
  31.         $metadata $this->catalogue->getMetadata($message$domain) ?? [];
  32.         $normalizedFilename preg_replace('{[\\\\/]+}''/'$this->file);
  33.         $metadata['sources'][] = $normalizedFilename.':'.$line;
  34.         $this->catalogue->setMetadata($message$metadata$domain);
  35.     }
  36.     protected function getStringArguments(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $nodeint|string $indexbool $indexIsRegex false): array
  37.     {
  38.         if (\is_string($index)) {
  39.             return $this->getStringNamedArguments($node$index$indexIsRegex);
  40.         }
  41.         $args $node instanceof Node\Expr\CallLike $node->getRawArgs() : $node->args;
  42.         if (!($arg $args[$index] ?? null) instanceof Node\Arg) {
  43.             return [];
  44.         }
  45.         return (array) $this->getStringValue($arg->value);
  46.     }
  47.     protected function hasNodeNamedArguments(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node): bool
  48.     {
  49.         $args $node instanceof Node\Expr\CallLike $node->getRawArgs() : $node->args;
  50.         foreach ($args as $arg) {
  51.             if ($arg instanceof Node\Arg && null !== $arg->name) {
  52.                 return true;
  53.             }
  54.         }
  55.         return false;
  56.     }
  57.     protected function nodeFirstNamedArgumentIndex(Node\Expr\CallLike|Node\Attribute|Node\Expr\New_ $node): int
  58.     {
  59.         $args $node instanceof Node\Expr\CallLike $node->getRawArgs() : $node->args;
  60.         foreach ($args as $i => $arg) {
  61.             if ($arg instanceof Node\Arg && null !== $arg->name) {
  62.                 return $i;
  63.             }
  64.         }
  65.         return \PHP_INT_MAX;
  66.     }
  67.     private function getStringNamedArguments(Node\Expr\CallLike|Node\Attribute $nodestring $argumentName nullbool $isArgumentNamePattern false): array
  68.     {
  69.         $args $node instanceof Node\Expr\CallLike $node->getArgs() : $node->args;
  70.         $argumentValues = [];
  71.         foreach ($args as $arg) {
  72.             if (!$isArgumentNamePattern && $arg->name?->toString() === $argumentName) {
  73.                 $argumentValues[] = $this->getStringValue($arg->value);
  74.             } elseif ($isArgumentNamePattern && preg_match($argumentName$arg->name?->toString() ?? '') > 0) {
  75.                 $argumentValues[] = $this->getStringValue($arg->value);
  76.             }
  77.         }
  78.         return array_filter($argumentValues);
  79.     }
  80.     private function getStringValue(Node $node): ?string
  81.     {
  82.         if ($node instanceof Node\Scalar\String_) {
  83.             return $node->value;
  84.         }
  85.         if ($node instanceof Node\Expr\BinaryOp\Concat) {
  86.             if (null === $left $this->getStringValue($node->left)) {
  87.                 return null;
  88.             }
  89.             if (null === $right $this->getStringValue($node->right)) {
  90.                 return null;
  91.             }
  92.             return $left.$right;
  93.         }
  94.         if ($node instanceof Node\Expr\Assign && $node->expr instanceof Node\Scalar\String_) {
  95.             return $node->expr->value;
  96.         }
  97.         return null;
  98.     }
  99. }