Skip to content

Commit

Permalink
[TypeDeclaration] Add AddParamArrayDocblockBasedOnCallableNativeFuncC…
Browse files Browse the repository at this point in the history
…allRector (#6233)

* [TypeDeclaration] Add AddParamArrayDocblockBasedOnCallableNativeFuncCallRector

* example

* collect variables from param array type

* remove comment

* move to private

* getting type param

* [ci-review] Rector Rectify

* [ci-review] Rector Rectify

* check variable first

* ensure same variable and not changed type

* ensure same variable and not changed type

* adding test

* adding param docs

* update fixture

* Fix

* Fix

* skip reassign

* skip mixed

* skip first class callable

* add array_walk()

* add usort

* fix edge case: handle different usage

* fix variable key usage

* register array_filter as well

* handle usort

* handle usort

* isset

---------

Co-authored-by: GitHub Action <actions@github.com>
  • Loading branch information
samsonasik and actions-user committed Aug 14, 2024
1 parent e09d82c commit fdd7f63
Show file tree
Hide file tree
Showing 12 changed files with 601 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

declare(strict_types=1);

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector;

use Iterator;
use PHPUnit\Framework\Attributes\DataProvider;
use Rector\Testing\PHPUnit\AbstractRectorTestCase;

final class AddParamArrayDocblockBasedOnCallableNativeFuncCallRectorTest extends AbstractRectorTestCase
{
#[DataProvider('provideData')]
public function test(string $filePath): void
{
$this->doTestFile($filePath);
}

public static function provideData(): Iterator
{
return self::yieldFilesFromDirectory(__DIR__ . '/Fixture');
}

public function provideConfigFilePath(): string
{
return __DIR__ . '/config/configured_rule.php';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use DateTime;
use stdClass;

final class DifferentUsage {
public function process(array $items): void
{
if (rand(0, 1)) {
array_walk($items, function (stdClass $item) {
echo $item->value;
});

return;
}

array_walk($items, function (DateTime $item) {
echo $item->format('Y-m-d');
});
}
}

?>
-----
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use DateTime;
use stdClass;

final class DifferentUsage {
/**
* @param \stdClass[]|\DateTime[] $items
*/
public function process(array $items): void
{
if (rand(0, 1)) {
array_walk($items, function (stdClass $item) {
echo $item->value;
});

return;
}

array_walk($items, function (DateTime $item) {
echo $item->format('Y-m-d');
});
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class Fixture
{
public function process(array $items): void
{
array_walk($items, function (stdClass $item) {
echo $item->value;
});
}
}

?>
-----
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class Fixture
{
/**
* @param \stdClass[] $items
*/
public function process(array $items): void
{
array_walk($items, function (stdClass $item) {
echo $item->value;
});
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class SkipFirstClassCallable {
function process(array $items): void
{
array_walk(...);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

final class SkipMixed {
function process(array $items, $callable): void
{
array_walk($items, $callable);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class SkipReAssign {
function process(array $items): void
{
$items = new stdClass;
$items->one = new stdClass;
$items->two = new stdClass;

array_walk($items, function (stdClass $item) {
echo $item->value;
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class SkipTypedDoc {
/**
* @param stdClass[] $items
*/
public function process(array $items): void
{
array_walk($items, function (stdClass $item) {
echo $item->value;
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class WithArrayFilterAndArrayWalk
{
public function process(array $items): void
{
if (rand(0, 1)) {
array_filter(
$items,
fn (string $str): bool => $str === 'a'
);
return;
}

array_walk($items, function (stdClass $item) {
echo $item->value;
});
}
}

?>
-----
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class WithArrayFilterAndArrayWalk
{
/**
* @param string[]|\stdClass[] $items
*/
public function process(array $items): void
{
if (rand(0, 1)) {
array_filter(
$items,
fn (string $str): bool => $str === 'a'
);
return;
}

array_walk($items, function (stdClass $item) {
echo $item->value;
});
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class WithArrayMap
{
public function process(array $items)
{
array_map(function (stdClass $item): string {
return $item->value;
}, $items);
}
}

?>
-----
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class WithArrayMap
{
/**
* @param \stdClass[] $items
*/
public function process(array $items)
{
array_map(function (stdClass $item): string {
return $item->value;
}, $items);
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class WithUsort
{
public function process(array $classes)
{
usort($classes, function (stdClass $stdClass, stdClass $stdClass2): int {
return 1;
});
}
}

?>
-----
<?php

namespace Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector\Fixture;

use stdClass;

final class WithUsort
{
/**
* @param \stdClass[] $classes
*/
public function process(array $classes)
{
usort($classes, function (stdClass $stdClass, stdClass $stdClass2): int {
return 1;
});
}
}

?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\TypeDeclaration\Rector\ClassMethod\AddParamArrayDocblockBasedOnCallableNativeFuncCallRector;

return static function (RectorConfig $rectorConfig): void {
$rectorConfig->rule(AddParamArrayDocblockBasedOnCallableNativeFuncCallRector::class);
};
Loading

0 comments on commit fdd7f63

Please sign in to comment.