Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php declare (strict_types=1); namespace Rector\Symfony\TypeDeclaration; use PhpParser\..
Decoded Output download
<?php
declare (strict_types=1);
namespace Rector\Symfony\TypeDeclaration;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
use PHPStan\Type\ArrayType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\UnionType;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\BetterPhpDocParser\ValueObject\Type\FullyQualifiedIdentifierTypeNode;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Php\PhpVersionProvider;
use Rector\StaticTypeMapper\StaticTypeMapper;
use Rector\ValueObject\PhpVersionFeature;
final class ReturnTypeDeclarationUpdater
{
/**
* @readonly
* @var \Rector\Php\PhpVersionProvider
*/
private $phpVersionProvider;
/**
* @readonly
* @var \Rector\StaticTypeMapper\StaticTypeMapper
*/
private $staticTypeMapper;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory
*/
private $phpDocInfoFactory;
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
public function __construct(PhpVersionProvider $phpVersionProvider, StaticTypeMapper $staticTypeMapper, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater)
{
$this->phpVersionProvider = $phpVersionProvider;
$this->staticTypeMapper = $staticTypeMapper;
$this->phpDocInfoFactory = $phpDocInfoFactory;
$this->docBlockUpdater = $docBlockUpdater;
}
/**
* @param class-string $className
*/
public function updateClassMethod(ClassMethod $classMethod, string $className) : void
{
$this->updatePhpDoc($classMethod, $className);
$this->updatePhp($classMethod, $className);
}
/**
* @param class-string $className
*/
private function updatePhpDoc(ClassMethod $classMethod, string $className) : void
{
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod);
$returnTagValueNode = $phpDocInfo->getReturnTagValue();
if (!$returnTagValueNode instanceof ReturnTagValueNode) {
return;
}
$returnStaticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($returnTagValueNode->type, $classMethod);
if ($returnStaticType instanceof ArrayType || $returnStaticType instanceof UnionType) {
$returnTagValueNode->type = new FullyQualifiedIdentifierTypeNode($className);
}
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod);
}
/**
* @param class-string $className
*/
private function updatePhp(ClassMethod $classMethod, string $className) : void
{
if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::SCALAR_TYPES)) {
return;
}
$objectType = new ObjectType($className);
// change return type
if ($classMethod->returnType !== null) {
$returnType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($classMethod->returnType);
if ($objectType->isSuperTypeOf($returnType)->yes()) {
return;
}
}
$classMethod->returnType = new FullyQualified($className);
}
}
?>
Did this file decode correctly?
Original Code
<?php
declare (strict_types=1);
namespace Rector\Symfony\TypeDeclaration;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
use PHPStan\Type\ArrayType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\UnionType;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\BetterPhpDocParser\ValueObject\Type\FullyQualifiedIdentifierTypeNode;
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
use Rector\Php\PhpVersionProvider;
use Rector\StaticTypeMapper\StaticTypeMapper;
use Rector\ValueObject\PhpVersionFeature;
final class ReturnTypeDeclarationUpdater
{
/**
* @readonly
* @var \Rector\Php\PhpVersionProvider
*/
private $phpVersionProvider;
/**
* @readonly
* @var \Rector\StaticTypeMapper\StaticTypeMapper
*/
private $staticTypeMapper;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory
*/
private $phpDocInfoFactory;
/**
* @readonly
* @var \Rector\Comments\NodeDocBlock\DocBlockUpdater
*/
private $docBlockUpdater;
public function __construct(PhpVersionProvider $phpVersionProvider, StaticTypeMapper $staticTypeMapper, PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater)
{
$this->phpVersionProvider = $phpVersionProvider;
$this->staticTypeMapper = $staticTypeMapper;
$this->phpDocInfoFactory = $phpDocInfoFactory;
$this->docBlockUpdater = $docBlockUpdater;
}
/**
* @param class-string $className
*/
public function updateClassMethod(ClassMethod $classMethod, string $className) : void
{
$this->updatePhpDoc($classMethod, $className);
$this->updatePhp($classMethod, $className);
}
/**
* @param class-string $className
*/
private function updatePhpDoc(ClassMethod $classMethod, string $className) : void
{
$phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod);
$returnTagValueNode = $phpDocInfo->getReturnTagValue();
if (!$returnTagValueNode instanceof ReturnTagValueNode) {
return;
}
$returnStaticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($returnTagValueNode->type, $classMethod);
if ($returnStaticType instanceof ArrayType || $returnStaticType instanceof UnionType) {
$returnTagValueNode->type = new FullyQualifiedIdentifierTypeNode($className);
}
$this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($classMethod);
}
/**
* @param class-string $className
*/
private function updatePhp(ClassMethod $classMethod, string $className) : void
{
if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::SCALAR_TYPES)) {
return;
}
$objectType = new ObjectType($className);
// change return type
if ($classMethod->returnType !== null) {
$returnType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($classMethod->returnType);
if ($objectType->isSuperTypeOf($returnType)->yes()) {
return;
}
}
$classMethod->returnType = new FullyQualified($className);
}
}
Function Calls
None |
Stats
MD5 | df5a9c580cf2b9b8967eeb2503dcdef8 |
Eval Count | 0 |
Decode Time | 96 ms |