![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/rector/rector/rules/Php71/Rector/TryCatch/ |
<?php declare (strict_types=1); namespace Rector\Php71\Rector\TryCatch; use PhpParser\Node; use PhpParser\Node\Stmt\TryCatch; use Rector\Core\PhpParser\Printer\BetterStandardPrinter; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @changelog https://wiki.php.net/rfc/multiple-catch * * @see \Rector\Tests\Php71\Rector\TryCatch\MultiExceptionCatchRector\MultiExceptionCatchRectorTest */ final class MultiExceptionCatchRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly * @var \Rector\Core\PhpParser\Printer\BetterStandardPrinter */ private $betterStandardPrinter; public function __construct(BetterStandardPrinter $betterStandardPrinter) { $this->betterStandardPrinter = $betterStandardPrinter; } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes multi catch of same exception to single one | separated.', [new CodeSample(<<<'CODE_SAMPLE' try { // Some code... } catch (ExceptionType1 $exception) { $sameCode; } catch (ExceptionType2 $exception) { $sameCode; } CODE_SAMPLE , <<<'CODE_SAMPLE' try { // Some code... } catch (ExceptionType1 | ExceptionType2 $exception) { $sameCode; } CODE_SAMPLE )]); } /** * @return array<class-string<Node>> */ public function getNodeTypes() : array { return [TryCatch::class]; } /** * @param TryCatch $node */ public function refactor(Node $node) : ?Node { if (\count($node->catches) < 2) { return null; } $printedCatches = []; $hasChanged = \false; foreach ($node->catches as $key => $catch) { $currentPrintedCatch = $this->betterStandardPrinter->print($catch->stmts); // already duplicated catch → remove it and join the type if (\in_array($currentPrintedCatch, $printedCatches, \true)) { // merge type to existing type $existingCatchKey = \array_search($currentPrintedCatch, $printedCatches, \true); $node->catches[$existingCatchKey]->types[] = $catch->types[0]; unset($node->catches[$key]); $hasChanged = \true; continue; } $printedCatches[$key] = $currentPrintedCatch; } if ($hasChanged) { return $node; } return null; } public function provideMinPhpVersion() : int { return PhpVersionFeature::MULTI_EXCEPTION_CATCH; } }