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 Larastan\Larastan\ReturnTypes; use Illuminate\..
Decoded Output download
<?php
declare(strict_types=1);
namespace Larastan\Larastan\ReturnTypes;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Database\Eloquent\Model;
use Larastan\Larastan\Types\Factory\ModelFactoryType;
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\TrinaryLogic;
use PHPStan\Type\DynamicMethodReturnTypeExtension;
use PHPStan\Type\ErrorType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use function in_array;
class FactoryDynamicMethodReturnTypeExtension implements DynamicMethodReturnTypeExtension
{
public function getClass(): string
{
return Factory::class;
}
public function isMethodSupported(MethodReflection $methodReflection): bool
{
return true;
}
public function getTypeFromMethodCall(
MethodReflection $methodReflection,
MethodCall $methodCall,
Scope $scope,
): Type|null {
$calledOnType = $scope->getType($methodCall->var);
$originalReturnType = ParametersAcceptorSelector::selectFromArgs($scope, $methodCall->getArgs(), $methodReflection->getVariants())->getReturnType();
if (! $calledOnType instanceof ModelFactoryType) {
return null;
}
if ($methodReflection->getName() === 'count') {
if ($methodCall->getArgs() === []) {
return new ErrorType();
}
$argType = $scope->getType($methodCall->getArgs()[0]->value);
if ((new IntegerType())->isSuperTypeOf($argType)->yes()) {
return new ModelFactoryType($calledOnType->getClassName(), null, null, TrinaryLogic::createNo());
}
if ((new NullType())->isSuperTypeOf($argType)->yes()) {
return new ModelFactoryType($calledOnType->getClassName(), null, null, TrinaryLogic::createYes());
}
return new ModelFactoryType($calledOnType->getClassName(), null, null, TrinaryLogic::createMaybe());
}
if (in_array($methodReflection->getName(), ['create', 'createQuietly', 'make'], true)) {
if ($calledOnType->isSingleModel()->yes()) {
return TypeCombinator::remove($originalReturnType, new ObjectType(Collection::class));
}
if ($calledOnType->isSingleModel()->no()) {
return TypeCombinator::remove($originalReturnType, new ObjectType(Model::class));
}
}
if (! $originalReturnType->isSuperTypeOf($calledOnType)->yes()) {
return null;
}
return $calledOnType;
}
}
?>
Did this file decode correctly?
Original Code
<?php
declare(strict_types=1);
namespace Larastan\Larastan\ReturnTypes;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Database\Eloquent\Model;
use Larastan\Larastan\Types\Factory\ModelFactoryType;
use PhpParser\Node\Expr\MethodCall;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\TrinaryLogic;
use PHPStan\Type\DynamicMethodReturnTypeExtension;
use PHPStan\Type\ErrorType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
use PHPStan\Type\TypeCombinator;
use function in_array;
class FactoryDynamicMethodReturnTypeExtension implements DynamicMethodReturnTypeExtension
{
public function getClass(): string
{
return Factory::class;
}
public function isMethodSupported(MethodReflection $methodReflection): bool
{
return true;
}
public function getTypeFromMethodCall(
MethodReflection $methodReflection,
MethodCall $methodCall,
Scope $scope,
): Type|null {
$calledOnType = $scope->getType($methodCall->var);
$originalReturnType = ParametersAcceptorSelector::selectFromArgs($scope, $methodCall->getArgs(), $methodReflection->getVariants())->getReturnType();
if (! $calledOnType instanceof ModelFactoryType) {
return null;
}
if ($methodReflection->getName() === 'count') {
if ($methodCall->getArgs() === []) {
return new ErrorType();
}
$argType = $scope->getType($methodCall->getArgs()[0]->value);
if ((new IntegerType())->isSuperTypeOf($argType)->yes()) {
return new ModelFactoryType($calledOnType->getClassName(), null, null, TrinaryLogic::createNo());
}
if ((new NullType())->isSuperTypeOf($argType)->yes()) {
return new ModelFactoryType($calledOnType->getClassName(), null, null, TrinaryLogic::createYes());
}
return new ModelFactoryType($calledOnType->getClassName(), null, null, TrinaryLogic::createMaybe());
}
if (in_array($methodReflection->getName(), ['create', 'createQuietly', 'make'], true)) {
if ($calledOnType->isSingleModel()->yes()) {
return TypeCombinator::remove($originalReturnType, new ObjectType(Collection::class));
}
if ($calledOnType->isSingleModel()->no()) {
return TypeCombinator::remove($originalReturnType, new ObjectType(Model::class));
}
}
if (! $originalReturnType->isSuperTypeOf($calledOnType)->yes()) {
return null;
}
return $calledOnType;
}
}
Function Calls
None |
Stats
MD5 | 37faca6d7a22ee8b60cdd57d5f3a8ff3 |
Eval Count | 0 |
Decode Time | 119 ms |