|
@@ -14,38 +14,38 @@ declare(strict_types=1);
|
|
|
|
|
|
namespace PhpCsFixer\Fixer\Operator;
|
|
|
|
|
|
-use PhpCsFixer\AbstractFixer;
|
|
|
+use PhpCsFixer\AbstractProxyFixer;
|
|
|
use PhpCsFixer\Fixer\ConfigurableFixerInterface;
|
|
|
-use PhpCsFixer\FixerConfiguration\FixerConfigurationResolver;
|
|
|
+use PhpCsFixer\Fixer\DeprecatedFixerInterface;
|
|
|
use PhpCsFixer\FixerConfiguration\FixerConfigurationResolverInterface;
|
|
|
-use PhpCsFixer\FixerConfiguration\FixerOptionBuilder;
|
|
|
-use PhpCsFixer\FixerDefinition\CodeSample;
|
|
|
use PhpCsFixer\FixerDefinition\FixerDefinition;
|
|
|
use PhpCsFixer\FixerDefinition\FixerDefinitionInterface;
|
|
|
-use PhpCsFixer\Tokenizer\CT;
|
|
|
-use PhpCsFixer\Tokenizer\Token;
|
|
|
-use PhpCsFixer\Tokenizer\Tokens;
|
|
|
|
|
|
/**
|
|
|
* @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
|
|
|
+ *
|
|
|
+ * @deprecated
|
|
|
*/
|
|
|
-final class NewWithBracesFixer extends AbstractFixer implements ConfigurableFixerInterface
|
|
|
+final class NewWithBracesFixer extends AbstractProxyFixer implements ConfigurableFixerInterface, DeprecatedFixerInterface
|
|
|
{
|
|
|
+ private NewWithParenthesesFixer $newWithParenthesesFixer;
|
|
|
+
|
|
|
+ public function __construct()
|
|
|
+ {
|
|
|
+ $this->newWithParenthesesFixer = new NewWithParenthesesFixer();
|
|
|
+
|
|
|
+ parent::__construct();
|
|
|
+ }
|
|
|
+
|
|
|
public function getDefinition(): FixerDefinitionInterface
|
|
|
{
|
|
|
+ $fixerDefinition = $this->newWithParenthesesFixer->getDefinition();
|
|
|
+
|
|
|
return new FixerDefinition(
|
|
|
'All instances created with `new` keyword must (not) be followed by braces.',
|
|
|
- [
|
|
|
- new CodeSample("<?php\n\n\$x = new X;\n\$y = new class {};\n"),
|
|
|
- new CodeSample(
|
|
|
- "<?php\n\n\$y = new class() {};\n",
|
|
|
- ['anonymous_class' => false]
|
|
|
- ),
|
|
|
- new CodeSample(
|
|
|
- "<?php\n\n\$x = new X();\n",
|
|
|
- ['named_class' => false]
|
|
|
- ),
|
|
|
- ]
|
|
|
+ $fixerDefinition->getCodeSamples(),
|
|
|
+ $fixerDefinition->getDescription(),
|
|
|
+ $fixerDefinition->getRiskyDescription(),
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -56,145 +56,32 @@ final class NewWithBracesFixer extends AbstractFixer implements ConfigurableFixe
|
|
|
*/
|
|
|
public function getPriority(): int
|
|
|
{
|
|
|
- return 37;
|
|
|
+ return $this->newWithParenthesesFixer->getPriority();
|
|
|
}
|
|
|
|
|
|
- public function isCandidate(Tokens $tokens): bool
|
|
|
+ public function configure(array $configuration): void
|
|
|
{
|
|
|
- return $tokens->isTokenKindFound(T_NEW);
|
|
|
- }
|
|
|
-
|
|
|
- protected function applyFix(\SplFileInfo $file, Tokens $tokens): void
|
|
|
- {
|
|
|
- static $nextTokenKinds = null;
|
|
|
-
|
|
|
- if (null === $nextTokenKinds) {
|
|
|
- $nextTokenKinds = [
|
|
|
- '?',
|
|
|
- ';',
|
|
|
- ',',
|
|
|
- '(',
|
|
|
- ')',
|
|
|
- '[',
|
|
|
- ']',
|
|
|
- ':',
|
|
|
- '<',
|
|
|
- '>',
|
|
|
- '+',
|
|
|
- '-',
|
|
|
- '*',
|
|
|
- '/',
|
|
|
- '%',
|
|
|
- '&',
|
|
|
- '^',
|
|
|
- '|',
|
|
|
- [T_CLASS],
|
|
|
- [T_IS_SMALLER_OR_EQUAL],
|
|
|
- [T_IS_GREATER_OR_EQUAL],
|
|
|
- [T_IS_EQUAL],
|
|
|
- [T_IS_NOT_EQUAL],
|
|
|
- [T_IS_IDENTICAL],
|
|
|
- [T_IS_NOT_IDENTICAL],
|
|
|
- [T_CLOSE_TAG],
|
|
|
- [T_LOGICAL_AND],
|
|
|
- [T_LOGICAL_OR],
|
|
|
- [T_LOGICAL_XOR],
|
|
|
- [T_BOOLEAN_AND],
|
|
|
- [T_BOOLEAN_OR],
|
|
|
- [T_SL],
|
|
|
- [T_SR],
|
|
|
- [T_INSTANCEOF],
|
|
|
- [T_AS],
|
|
|
- [T_DOUBLE_ARROW],
|
|
|
- [T_POW],
|
|
|
- [T_SPACESHIP],
|
|
|
- [CT::T_ARRAY_SQUARE_BRACE_OPEN],
|
|
|
- [CT::T_ARRAY_SQUARE_BRACE_CLOSE],
|
|
|
- [CT::T_BRACE_CLASS_INSTANTIATION_OPEN],
|
|
|
- [CT::T_BRACE_CLASS_INSTANTIATION_CLOSE],
|
|
|
- ];
|
|
|
-
|
|
|
- if (\defined('T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG')) { // @TODO: drop condition when PHP 8.1+ is required
|
|
|
- $nextTokenKinds[] = [T_AMPERSAND_FOLLOWED_BY_VAR_OR_VARARG];
|
|
|
- $nextTokenKinds[] = [T_AMPERSAND_NOT_FOLLOWED_BY_VAR_OR_VARARG];
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- for ($index = $tokens->count() - 3; $index > 0; --$index) {
|
|
|
- if (!$tokens[$index]->isGivenKind(T_NEW)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
+ $this->newWithParenthesesFixer->configure($configuration);
|
|
|
|
|
|
- $nextIndex = $tokens->getNextTokenOfKind($index, $nextTokenKinds);
|
|
|
-
|
|
|
- // new anonymous class definition
|
|
|
- if ($tokens[$nextIndex]->isGivenKind(T_CLASS)) {
|
|
|
- $nextIndex = $tokens->getNextMeaningfulToken($nextIndex);
|
|
|
-
|
|
|
- if ($this->configuration['anonymous_class']) {
|
|
|
- $this->ensureBracesAt($tokens, $nextIndex);
|
|
|
- } else {
|
|
|
- $this->ensureNoBracesAt($tokens, $nextIndex);
|
|
|
- }
|
|
|
-
|
|
|
- continue;
|
|
|
- }
|
|
|
-
|
|
|
- // entrance into array index syntax - need to look for exit
|
|
|
-
|
|
|
- while ($tokens[$nextIndex]->equals('[') || $tokens[$nextIndex]->isGivenKind(CT::T_ARRAY_INDEX_CURLY_BRACE_OPEN)) {
|
|
|
- $nextIndex = $tokens->findBlockEnd(Tokens::detectBlockType($tokens[$nextIndex])['type'], $nextIndex);
|
|
|
- $nextIndex = $tokens->getNextMeaningfulToken($nextIndex);
|
|
|
- }
|
|
|
-
|
|
|
- if ($this->configuration['named_class']) {
|
|
|
- $this->ensureBracesAt($tokens, $nextIndex);
|
|
|
- } else {
|
|
|
- $this->ensureNoBracesAt($tokens, $nextIndex);
|
|
|
- }
|
|
|
- }
|
|
|
+ parent::configure($configuration);
|
|
|
}
|
|
|
|
|
|
- protected function createConfigurationDefinition(): FixerConfigurationResolverInterface
|
|
|
+ public function getSuccessorsNames(): array
|
|
|
{
|
|
|
- return new FixerConfigurationResolver([
|
|
|
- (new FixerOptionBuilder('named_class', 'Whether named classes should be followed by parentheses.'))
|
|
|
- ->setAllowedTypes(['bool'])
|
|
|
- ->setDefault(true)
|
|
|
- ->getOption(),
|
|
|
- (new FixerOptionBuilder('anonymous_class', 'Whether anonymous classes should be followed by parentheses.'))
|
|
|
- ->setAllowedTypes(['bool'])
|
|
|
- ->setDefault(true)
|
|
|
- ->getOption(),
|
|
|
- ]);
|
|
|
+ return [
|
|
|
+ $this->newWithParenthesesFixer->getName(),
|
|
|
+ ];
|
|
|
}
|
|
|
|
|
|
- private function ensureBracesAt(Tokens $tokens, int $index): void
|
|
|
+ protected function createProxyFixers(): array
|
|
|
{
|
|
|
- $token = $tokens[$index];
|
|
|
-
|
|
|
- if (!$token->equals('(') && !$token->isObjectOperator()) {
|
|
|
- $tokens->insertAt(
|
|
|
- $tokens->getPrevMeaningfulToken($index) + 1,
|
|
|
- [new Token('('), new Token(')')]
|
|
|
- );
|
|
|
- }
|
|
|
+ return [
|
|
|
+ $this->newWithParenthesesFixer,
|
|
|
+ ];
|
|
|
}
|
|
|
|
|
|
- private function ensureNoBracesAt(Tokens $tokens, int $index): void
|
|
|
+ protected function createConfigurationDefinition(): FixerConfigurationResolverInterface
|
|
|
{
|
|
|
- if (!$tokens[$index]->equals('(')) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- $closingIndex = $tokens->getNextMeaningfulToken($index);
|
|
|
-
|
|
|
- // constructor has arguments - braces can not be removed
|
|
|
- if (!$tokens[$closingIndex]->equals(')')) {
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- $tokens->clearTokenAndMergeSurroundingWhitespace($closingIndex);
|
|
|
- $tokens->clearTokenAndMergeSurroundingWhitespace($index);
|
|
|
+ return $this->newWithParenthesesFixer->createConfigurationDefinition();
|
|
|
}
|
|
|
}
|