Skip to content

Commit

Permalink
[TypeDeclaration] Skip Type modified between Assign and Return_ on Re…
Browse files Browse the repository at this point in the history
…turnTypeFromReturnNewRector (#2650)
  • Loading branch information
samsonasik committed Jul 10, 2022
1 parent f5896ac commit 7e1c2bb
Show file tree
Hide file tree
Showing 5 changed files with 111 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

declare(strict_types=1);

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

use Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnNewRector\Source\SomeResponse;

final class SkipTypeModifiedBetweenAssignAndReturnByRef
{
public function action()
{
$response = new SomeResponse();

$this->verify($response);

return $response;
}

private function verify(SomeResponse &$someResponse): void
{
if (is_cli()) {
$someResponse = new CLIResponse();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

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

use Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnNewRector\Source\SomeResponse;

final class SkipTypeModifiedBetweenAssignAndReturnWithIf
{
public function action()
{
$response = new SomeResponse();

if (is_cli()) {
$response = new CLIResponse();
}

return $response;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<?php

declare(strict_types=1);

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

use Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnNewRector\Source\SomeResponse;

final class TypeNotChangedAfterAssignedToVariable
{
public function action()
{
$response = new SomeResponse();
$response->setBody('some message');

return $response;
}
}

?>
-----
<?php

declare(strict_types=1);

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

use Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnNewRector\Source\SomeResponse;

final class TypeNotChangedAfterAssignedToVariable
{
public function action(): \Rector\Tests\TypeDeclaration\Rector\ClassMethod\ReturnTypeFromReturnNewRector\Source\SomeResponse
{
$response = new SomeResponse();
$response->setBody('some message');

return $response;
}
}

?>
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,8 @@

final class SomeResponse implements SomeResponseInterface
{

public function setBody(string $body)
{
$this->body = $body;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,18 @@
use PhpParser\Node\Stmt\Expression;
use PhpParser\Node\Stmt\Function_;
use PhpParser\Node\Stmt\Return_;
use PHPStan\Type\ObjectType;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\TypeDeclaration\ValueObject\AssignToVariable;

final class StrictReturnNewAnalyzer
{
public function __construct(
private readonly BetterNodeFinder $betterNodeFinder,
private readonly NodeNameResolver $nodeNameResolver,
private readonly NodeTypeResolver $nodeTypeResolver
) {
}

Expand Down Expand Up @@ -63,11 +66,26 @@ public function matchAlwaysReturnVariableNew(ClassMethod|Closure|Function_ $func
return null;
}

$returnType = $this->nodeTypeResolver->getType($onlyReturn->expr);

if (! $returnType instanceof ObjectType) {
return null;
}

$createdVariablesToTypes = $this->resolveCreatedVariablesToTypes($functionLike);

$returnedVariableName = $this->nodeNameResolver->getName($onlyReturn->expr);

return $createdVariablesToTypes[$returnedVariableName] ?? null;
$className = $createdVariablesToTypes[$returnedVariableName] ?? null;
if (! is_string($className)) {
return $className;
}

if ($returnType->getClassName() === $className) {
return $className;
}

return null;
}

/**
Expand Down

0 comments on commit 7e1c2bb

Please sign in to comment.