diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector/Fixture/return_anonymous_class_variable.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector/Fixture/return_anonymous_class_variable.php.inc new file mode 100644 index 00000000000..df6a0d56610 --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector/Fixture/return_anonymous_class_variable.php.inc @@ -0,0 +1,45 @@ + +----- + diff --git a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php index 07202f9f165..21a099f90b3 100644 --- a/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php +++ b/rules/TypeDeclaration/NodeAnalyzer/ReturnTypeAnalyzer/StrictReturnNewAnalyzer.php @@ -52,7 +52,12 @@ public function matchAlwaysReturnVariableNew(ClassMethod|Function_ $functionLike return null; } - $returnType = $this->nodeTypeResolver->getType($return->expr); + $returnType = $this->nodeTypeResolver->getNativeType($return->expr); + if ($returnType instanceof \PHPStan\Type\ObjectWithoutClassType) { + $alwaysReturnedClassNames[] = 'object'; + continue; + } + if (! $returnType instanceof ObjectType) { return null; } diff --git a/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php b/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php index 0b06c01b11b..37019622852 100644 --- a/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php +++ b/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\New_; +use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\ClassMethod; @@ -119,6 +120,11 @@ public function refactor(Node $node): ?Node $returnedNewClassName = $this->strictReturnNewAnalyzer->matchAlwaysReturnVariableNew($node); + if ($returnedNewClassName === 'object') { + $node->returnType = new Identifier('object'); + return $node; + } + if (is_string($returnedNewClassName)) { $node->returnType = new FullyQualified($returnedNewClassName);