| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- <?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\Fixer\CastNotation;
- use PhpCsFixer\AbstractFixer;
- use PhpCsFixer\Fixer\ConfigurableFixerInterface;
- use PhpCsFixer\Fixer\ConfigurableFixerTrait;
- use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver;
- use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface;
- use PhpCsFixer\FixerConfiguration\FixerOptionBuilder;
- use PhpCsFixer\FixerDefinition\CodeSample;
- use PhpCsFixer\FixerDefinition\FixerDefinition;
- use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
- use PhpCsFixer\Tokenizer\Token;
- use PhpCsFixer\Tokenizer\Tokens;
- /**
- * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * @implements ConfigurableFixerInterface<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration>
- *
- * @phpstan-type _AutogeneratedInputConfiguration array{
- * space?: 'none'|'single'
- * }
- * @phpstan-type _AutogeneratedComputedConfiguration array{
- * space: 'none'|'single'
- * }
- */
- final class CastSpacesFixer extends AbstractFixer implements ConfigurableFixerInterface
- {
- /** @use ConfigurableFixerTrait<_AutogeneratedInputConfiguration, _AutogeneratedComputedConfiguration> */
- use ConfigurableFixerTrait;
- private const INSIDE_CAST_SPACE_REPLACE_MAP = [
- ' ' => '',
- "\t" => '',
- "\n" => '',
- "\r" => '',
- "\0" => '',
- "\x0B" => '',
- ];
- public function getDefinition(): FixerDefinitionInterface
- {
- return new FixerDefinition(
- 'A single space or none should be between cast and variable.',
- [
- new CodeSample(
- "<?php\n\$bar = ( string ) \$a;\n\$foo = (int)\$b;\n"
- ),
- new CodeSample(
- "<?php\n\$bar = ( string ) \$a;\n\$foo = (int)\$b;\n",
- ['space' => 'single']
- ),
- new CodeSample(
- "<?php\n\$bar = ( string ) \$a;\n\$foo = (int) \$b;\n",
- ['space' => 'none']
- ),
- ]
- );
- }
- /**
- * {@inheritdoc}
- *
- * Must run after NoShortBoolCastFixer.
- */
- public function getPriority(): int
- {
- return -10;
- }
- public function isCandidate(Tokens $tokens): bool
- {
- return $tokens->isAnyTokenKindsFound(Token::getCastTokenKinds());
- }
- protected function applyFix(\SplFileInfo $file, Tokens $tokens): void
- {
- foreach ($tokens as $index => $token) {
- if (!$token->isCast()) {
- continue;
- }
- $tokens[$index] = new Token([
- $token->getId(),
- strtr($token->getContent(), self::INSIDE_CAST_SPACE_REPLACE_MAP),
- ]);
- if ('single' === $this->configuration['space']) {
- // force single whitespace after cast token:
- if ($tokens[$index + 1]->isWhitespace(" \t")) {
- // - if next token is whitespaces that contains only spaces and tabs - override next token with single space
- $tokens[$index + 1] = new Token([T_WHITESPACE, ' ']);
- } elseif (!$tokens[$index + 1]->isWhitespace()) {
- // - if next token is not whitespaces that contains spaces, tabs and new lines - append single space to current token
- $tokens->insertAt($index + 1, new Token([T_WHITESPACE, ' ']));
- }
- continue;
- }
- // force no whitespace after cast token:
- if ($tokens[$index + 1]->isWhitespace()) {
- $tokens->clearAt($index + 1);
- }
- }
- }
- protected function createConfigurationDefinition(): FixerConfigurationResolverInterface
- {
- return new FixerConfigurationResolver([
- (new FixerOptionBuilder('space', 'Spacing to apply between cast and variable.'))
- ->setAllowedValues(['none', 'single'])
- ->setDefault('single')
- ->getOption(),
- ]);
- }
- }
|