Skip to content

Commit

Permalink
Implement ReturnTypeFromStrictParamRector (#4501)
Browse files Browse the repository at this point in the history
* Implement ReturnTypeFromStrictParamRector

* more tests

* Create skip_closure.php.inc

* Update skip_closure.php.inc

* fix

* more tests

* fix names

* more tests, symplify

* skip union return types

* simplify

* skip magic

* Update skip_closure.php.inc

* cleanup

* fix

* Update type-declaration.php

* Create skip_already_return_typed.inc

* Update skip_already_return_typed.inc

* cover indirect modification by reference

* Update skip_assign_by_ref.php.inc

* simplify

Co-authored-by: Abdul Malik Ikhsan <samsonasik@gmail.com>

* earlier $node->stmts check

* fix

* Revert "fix"

This reverts commit 82107dd.

* Revert "earlier $node->stmts check"

This reverts commit 6d61b59.

* fix phpstan

---------

Co-authored-by: Abdul Malik Ikhsan <samsonasik@gmail.com>
  • Loading branch information
staabm and samsonasik committed Jul 14, 2023
1 parent b3c4aff commit 875b2a3
Show file tree
Hide file tree
Showing 21 changed files with 536 additions and 0 deletions.
2 changes: 2 additions & 0 deletions config/set/type-declaration.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictConstantReturnRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictNativeCallRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictNewArrayRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictParamRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictTypedCallRector;
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictTypedPropertyRector;
use Rector\TypeDeclaration\Rector\ClassMethod\StrictArrayParamDimFetchRector;
Expand Down Expand Up @@ -62,6 +63,7 @@
ReturnTypeFromStrictNativeCallRector::class,
ReturnTypeFromStrictNewArrayRector::class,
ReturnTypeFromStrictScalarReturnExprRector::class,
ReturnTypeFromStrictParamRector::class,
TypedPropertyFromStrictSetUpRector::class,
ParamTypeByParentCallTypeRector::class,
AddParamTypeSplFixedArrayRector::class,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

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

class Example {
public function doFoo(Example $param) {
return $param;
}
}

?>
-----
<?php

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

class Example {
public function doFoo(Example $param): Example {
return $param;
}
}

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

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

class ExampleNullable {
public function doFoo(?ExampleNullable $param) {
return $param;
}
}

?>
-----
<?php

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

class ExampleNullable {
public function doFoo(?ExampleNullable $param): ?ExampleNullable {
return $param;
}
}

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

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

class ExampleInt {
public function doFoo(int $param) {
return $param;
}
}

?>
-----
<?php

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

class ExampleInt {
public function doFoo(int $param): int {
return $param;
}
}

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

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

class ExampleWithCall {
public function doFoo(ExampleWithCall $param) {
$this->doBar($param);

return $param;
}

public function doBar($ref) {}
}

?>
-----
<?php

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

class ExampleWithCall {
public function doFoo(ExampleWithCall $param): ExampleWithCall {
$this->doBar($param);

return $param;
}

public function doBar($ref) {}
}

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

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

class SkipNullReturn {
public function doFoo(SkipNullReturn $param) {
if (rand(0,1)) {
return null;
}
return $param;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?php

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

class SkipAlreadyReturnTyped {
public function doFoo(SkipAlreadyReturnTyped $param): int {
return $param;
}
}

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

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

class SkipAssign {
public function doFoo(SkipAssign $param) {
$param = 4;

return $param;
}
}

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

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

class SkipAssignByRef {
public function doFoo(SkipAssignByRef $param) {
$z = &$param;

$z = 5;

return $param;
}
}

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

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

class SkipCallbByRef {
public function doFoo(SkipCallbByRef $param) {
$this->doBar($param);

return $param;
}

public function doBar(&$ref) {}
}

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

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

class SkipClosure {
public function doFoo() {
// we have other rules which add closure return types
// leave it as is
$c = function (SkipClosure $param) {
return $param;
};
return $c;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
<?php

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

class SkipConditionalReturn {
public function doFoo(SkipAssign $param) {
if (rand(0,1)) {
return 4;
}

return $param;
}
}

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

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

class SkipMagic
{
public function __get(string $name)
{
return $name;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

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

class SkipMultipleReturns {
public function doFoo(SkipMultipleReturns $param, B $param2) {
if (rand(0,1)) {
return $param2;
}

return $param;
}
}

class B {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

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

class SkipParentOverridden extends SkipParentOverriddenBase {
public function doFoo(SkipParentOverridden $param) {
return $param;
}
}


class SkipParentOverriddenBase {
public function doFoo(SkipParentOverridden $param) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

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

class SkipPhpdoc {
/**
* @param SkipPhpdoc $param
*/
public function doFoo($param) {
return $param;
}
}

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

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

class SkipUnion
{
public function run(A|B $p)
{
return $p;
}
}

class A {}
class B {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

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

class SkipPossibleVoid
{
public function run(int $p)
{
if (rand(0, 1)) {
return $p;
}
}
}
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\ReturnTypeFromStrictParamRector;

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

final class ReturnTypeFromStrictParamRectorTest 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,12 @@
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Core\ValueObject\PhpVersion;
use Rector\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromStrictParamRector;

return static function (RectorConfig $rectorConfig): void {
$rectorConfig->rule(ReturnTypeFromStrictParamRector::class);
$rectorConfig->phpVersion(PhpVersion::PHP_74);
};

0 comments on commit 875b2a3

Please sign in to comment.