Skip to content

Commit

Permalink
[Downgrade PHP 7.3] Trailing commas in function calls
Browse files Browse the repository at this point in the history
  • Loading branch information
Tommy Quissens committed Dec 3, 2020
1 parent 8d07bbd commit 0c39734
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 0 deletions.
2 changes: 2 additions & 0 deletions config/set/downgrade-php73.php
Expand Up @@ -4,6 +4,7 @@

use Rector\Downgrade\Rector\LNumber\ChangePhpVersionInPlatformCheckRector;
use Rector\DowngradePhp73\Rector\List_\DowngradeListReferenceAssignmentRector;
use Rector\DowngradePhp73\Rector\FuncCall\DowngradeTrailingCommasInFunctionCallsRector;
use Rector\DowngradePhp73\Rector\String_\DowngradeFlexibleHeredocSyntaxRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

Expand All @@ -15,4 +16,5 @@
->call('configure', [[
ChangePhpVersionInPlatformCheckRector::TARGET_PHP_VERSION => 70300,
]]);
$services->set(DowngradeTrailingCommasInFunctionCallsRector::class);
};
5 changes: 5 additions & 0 deletions packages/node-type-resolver/src/Node/AttributeKey.php
Expand Up @@ -227,4 +227,9 @@ final class AttributeKey
* @var string
*/
public const IS_FRESH_NODE = 'is_fresh_node';

/**
* @var string
*/
public const TRAILING_COMMA = 'trailing_comma';
}
@@ -0,0 +1,72 @@
<?php

declare(strict_types=1);

namespace Rector\DowngradePhp73\Rector\FuncCall;

use PhpParser\Node;
use PhpParser\Node\Expr\FuncCall;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\StaticCall;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;

/**
* @see \Rector\DowngradePhp73\Tests\Rector\FuncCall\DowngradeTrailingCommasInFunctionCallsRector\DowngradeTrailingCommasInFunctionCallsRectorTest
*/
final class DowngradeTrailingCommasInFunctionCallsRector extends AbstractRector
{
public function getRuleDefinition(): RuleDefinition
{
return new RuleDefinition(
'Remove trailing commas in function calls', [
new CodeSample(
<<<'CODE_SAMPLE'
class SomeClass
{
public function __construct(string $value)
{
$compacted = compact(
'posts',
'units',
);
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
class SomeClass
{
public function __construct(string $value)
{
$compacted = compact(
'posts',
'units'
);
}
}
CODE_SAMPLE
),
]
);
}

/**
* @return string[]
*/
public function getNodeTypes(): array
{
return [FuncCall::class, MethodCall::class, StaticCall::class];
}

public function refactor(Node $node): ?Node
{
if($node->args){
$node->setAttribute(AttributeKey::ORIGINAL_NODE, null);
$last = $node->args[array_key_last($node->args)];
$last->setAttribute(AttributeKey::TRAILING_COMMA, false);
}
return $node;
}
}
@@ -0,0 +1,32 @@
<?php

declare(strict_types=1);

namespace Rector\DowngradePhp73\Tests\Rector\FuncCall\DowngradeTrailingCommasInFunctionCallsRector;

use Iterator;
use Rector\DowngradePhp73\Rector\FuncCall\DowngradeTrailingCommasInFunctionCallsRector;
use Rector\Testing\PHPUnit\AbstractRectorTestCase;
use Symplify\SmartFileSystem\SmartFileInfo;

final class DowngradeTrailingCommasInFunctionCallsRectorTest extends AbstractRectorTestCase
{
/**
* @requires PHP >= 7.3
* @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 DowngradeTrailingCommasInFunctionCallsRector::class;
}
}
@@ -0,0 +1,37 @@
<?php

namespace Rector\DowngradePhp73\Tests\Rector\FuncCall\DowngradeTrailingCommasInFunctionCallsRector\Fixture;

class FixtureClass
{
public function run()
{
compact('posts','units',);
$this->setData('posts','units',);
self::run('posts','units',);
self::run('posts',
'units',);
$this->setOnClick("[Zip ID: {$modelid}] {$e->getMessage($modelId,)}",);
}
}

?>
-----
<?php

namespace Rector\DowngradePhp73\Tests\Rector\FuncCall\DowngradeTrailingCommasInFunctionCallsRector\Fixture;

class FixtureClass
{
public function run()
{
compact('posts', 'units');
$this->setData('posts', 'units');
self::run('posts', 'units');
self::run('posts',
'units');
$this->setOnClick("[Zip ID: {$modelid}] {$e->getMessage($modelId)}");
}
}

?>
16 changes: 16 additions & 0 deletions src/PhpParser/Printer/BetterStandardPrinter.php
Expand Up @@ -590,4 +590,20 @@ private function wrapValueWith(String_ $string, string $wrap): string
{
return $wrap . $string->value . $wrap;
}

protected function pCommaSeparated(array $nodes): string
{
$result = parent::pCommaSeparated($nodes);

$last = end($nodes);

if ($last instanceof Node) {
$trailingComma = $last->getAttribute(AttributeKey::TRAILING_COMMA);
if ($trailingComma === false) {
$result = rtrim($result, ',');
}
}

return $result;
}
}

0 comments on commit 0c39734

Please sign in to comment.