mirror of
https://github.com/rectorphp/rector.git
synced 2025-04-19 06:52:51 +02:00
[Downgrade PHP 7.4] Numeric Literal Separator Rector (#4361)
This commit is contained in:
parent
bac865b437
commit
84c03bcbdc
@ -5,6 +5,7 @@ declare(strict_types=1);
|
||||
use Rector\DowngradePhp74\Rector\ArrowFunction\ArrowFunctionToAnonymousFunctionRector;
|
||||
use Rector\DowngradePhp74\Rector\Coalesce\DowngradeNullCoalescingOperatorRector;
|
||||
use Rector\DowngradePhp74\Rector\FuncCall\DowngradeStripTagsCallWithArrayRector;
|
||||
use Rector\DowngradePhp74\Rector\LNumber\DowngradeNumericLiteralSeparatorRector;
|
||||
use Rector\DowngradePhp74\Rector\Property\DowngradeTypedPropertyRector;
|
||||
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
|
||||
|
||||
@ -13,5 +14,6 @@ return static function (ContainerConfigurator $containerConfigurator): void {
|
||||
$services->set(DowngradeTypedPropertyRector::class);
|
||||
$services->set(ArrowFunctionToAnonymousFunctionRector::class);
|
||||
$services->set(DowngradeNullCoalescingOperatorRector::class);
|
||||
$services->set(DowngradeNumericLiteralSeparatorRector::class);
|
||||
$services->set(DowngradeStripTagsCallWithArrayRector::class);
|
||||
};
|
||||
|
@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\DowngradePhp74\Rector\LNumber;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Scalar\DNumber;
|
||||
use PhpParser\Node\Scalar\LNumber;
|
||||
use Rector\Core\Rector\AbstractRector;
|
||||
use Rector\Core\RectorDefinition\CodeSample;
|
||||
use Rector\Core\RectorDefinition\RectorDefinition;
|
||||
use Rector\NodeTypeResolver\Node\AttributeKey;
|
||||
|
||||
/**
|
||||
* @see https://wiki.php.net/rfc/numeric_literal_separator
|
||||
* @see \Rector\DowngradePhp74\Tests\Rector\LNumber\DowngradeNumericLiteralSeparatorRector\DowngradeNumericLiteralSeparatorRectorTest
|
||||
*/
|
||||
final class DowngradeNumericLiteralSeparatorRector extends AbstractRector
|
||||
{
|
||||
public function getDefinition(): RectorDefinition
|
||||
{
|
||||
return new RectorDefinition('Remove "_" as thousands separator in numbers', [
|
||||
new CodeSample(
|
||||
<<<'CODE_SAMPLE'
|
||||
class SomeClass
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$int = 1_000;
|
||||
$float = 1_000_500.001;
|
||||
}
|
||||
}
|
||||
CODE_SAMPLE
|
||||
,
|
||||
<<<'CODE_SAMPLE'
|
||||
class SomeClass
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$int = 1000;
|
||||
$float = 1000500.001;
|
||||
}
|
||||
}
|
||||
CODE_SAMPLE
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getNodeTypes(): array
|
||||
{
|
||||
return [LNumber::class, DNumber::class];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param LNumber|DNumber $node
|
||||
*/
|
||||
public function refactor(Node $node): ?Node
|
||||
{
|
||||
if (! $this->shouldRefactor($node)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$node->value = (string) $node->value;
|
||||
return $node;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param LNumber|DNumber $node
|
||||
*/
|
||||
public function shouldRefactor(Node $node): bool
|
||||
{
|
||||
// "_" notation can be applied to decimal numbers only
|
||||
if ($node instanceof LNumber) {
|
||||
return $node->getAttribute(AttributeKey::KIND) === LNumber::KIND_DEC;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
@ -0,0 +1,38 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\DowngradePhp74\Tests\Rector\LNumber\DowngradeNumericLiteralSeparatorRector;
|
||||
|
||||
use Iterator;
|
||||
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
|
||||
use Rector\Core\ValueObject\PhpVersionFeature;
|
||||
use Rector\DowngradePhp74\Rector\LNumber\DowngradeNumericLiteralSeparatorRector;
|
||||
use Symplify\SmartFileSystem\SmartFileInfo;
|
||||
|
||||
final class DowngradeNumericLiteralSeparatorRectorTest extends AbstractRectorTestCase
|
||||
{
|
||||
/**
|
||||
* @requires PHP 7.4
|
||||
* @dataProvider provideData()
|
||||
*/
|
||||
public function test(SmartFileInfo $fileInfo): void
|
||||
{
|
||||
$this->doTestFileInfo($fileInfo);
|
||||
}
|
||||
|
||||
public function provideData(): Iterator
|
||||
{
|
||||
return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture');
|
||||
}
|
||||
|
||||
protected function getRectorClass(): string
|
||||
{
|
||||
return DowngradeNumericLiteralSeparatorRector::class;
|
||||
}
|
||||
|
||||
protected function getPhpVersion(): string
|
||||
{
|
||||
return PhpVersionFeature::BEFORE_LITERAL_SEPARATOR;
|
||||
}
|
||||
}
|
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Rector\DowngradePhp74\Tests\Rector\LNumber\DowngradeNumericLiteralSeparatorRector\Fixture;
|
||||
|
||||
class FixtureClass
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$int = 1_000;
|
||||
$float = 1_000_500.001;
|
||||
$negative_int = -1_000;
|
||||
$negative_float = -1_000_500.001;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
-----
|
||||
<?php
|
||||
|
||||
namespace Rector\DowngradePhp74\Tests\Rector\LNumber\DowngradeNumericLiteralSeparatorRector\Fixture;
|
||||
|
||||
class FixtureClass
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$int = 1000;
|
||||
$float = 1000500.001;
|
||||
$negative_int = -1000;
|
||||
$negative_float = -1000500.001;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace Rector\DowngradePhp74\Tests\Rector\LNumber\DowngradeNumericLiteralSeparatorRector\Fixture;
|
||||
|
||||
class NoChangeClass
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$int = 1000;
|
||||
$float = 1000500.001;
|
||||
$negative_int = -1000;
|
||||
$negative_float = -1000500.001;
|
||||
$binary = 0b11111111;
|
||||
$octal = 0123;
|
||||
$hex = 0x1A;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -161,6 +161,11 @@ final class PhpVersionFeature
|
||||
*/
|
||||
public const BEFORE_NULL_COALESCE_ASSIGN = '7.3';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const BEFORE_LITERAL_SEPARATOR = '7.3';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user