123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- <?php
- declare(strict_types=1);
- /*
- * This file is part of PHP CS Fixer.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- * Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace PhpCsFixer\Tokenizer;
- use Symfony\Component\Finder\Finder;
- use Symfony\Component\Finder\SplFileInfo;
- /**
- * Collection of Transformer classes.
- *
- * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * @internal
- */
- final class Transformers
- {
- /**
- * The registered transformers.
- *
- * @var list<TransformerInterface>
- */
- private array $items = [];
- /**
- * Register built in Transformers.
- */
- private function __construct()
- {
- $this->registerBuiltInTransformers();
- usort($this->items, static fn (TransformerInterface $a, TransformerInterface $b): int => $b->getPriority() <=> $a->getPriority());
- }
- public static function createSingleton(): self
- {
- static $instance = null;
- if (!$instance) {
- $instance = new self();
- }
- return $instance;
- }
- /**
- * Transform given Tokens collection through all Transformer classes.
- *
- * @param Tokens $tokens Tokens collection
- */
- public function transform(Tokens $tokens): void
- {
- foreach ($this->items as $transformer) {
- foreach ($tokens as $index => $token) {
- $transformer->process($tokens, $token, $index);
- }
- }
- }
- /**
- * @param TransformerInterface $transformer Transformer
- */
- private function registerTransformer(TransformerInterface $transformer): void
- {
- if (\PHP_VERSION_ID >= $transformer->getRequiredPhpVersionId()) {
- $this->items[] = $transformer;
- }
- }
- private function registerBuiltInTransformers(): void
- {
- static $registered = false;
- if ($registered) {
- return;
- }
- $registered = true;
- foreach ($this->findBuiltInTransformers() as $transformer) {
- $this->registerTransformer($transformer);
- }
- }
- /**
- * @return \Generator<TransformerInterface>
- */
- private function findBuiltInTransformers(): iterable
- {
- /** @var SplFileInfo $file */
- foreach (Finder::create()->files()->in(__DIR__.'/Transformer') as $file) {
- $relativeNamespace = $file->getRelativePath();
- $class = __NAMESPACE__.'\Transformer\\'.('' !== $relativeNamespace ? $relativeNamespace.'\\' : '').$file->getBasename('.php');
- yield new $class();
- }
- }
- }
|