Updated Rector to commit a73dafd30a

a73dafd30a [PHP 8.0] Add method param to ConstantListClassToEnumRector (#2415)
This commit is contained in:
Tomas Votruba 2022-06-02 09:05:21 +00:00
parent c588cd340d
commit 56db9b2ff8
22 changed files with 327 additions and 93 deletions

View File

@ -0,0 +1,11 @@
<?php
declare (strict_types=1);
namespace Rector\BetterPhpDocParser\Contract\PhpDocParser;
use PhpParser\Node;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
interface PhpDocNodeDecoratorInterface
{
public function decorate(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PhpParser\Node $phpNode) : void;
}

View File

@ -3,6 +3,7 @@
declare (strict_types=1);
namespace Rector\BetterPhpDocParser\PhpDocParser;
use PhpParser\Node;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocChildNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode;
@ -13,10 +14,12 @@ use PHPStan\PhpDocParser\Parser\ConstExprParser;
use PHPStan\PhpDocParser\Parser\PhpDocParser;
use PHPStan\PhpDocParser\Parser\TokenIterator;
use PHPStan\PhpDocParser\Parser\TypeParser;
use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface;
use Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory;
use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\StartAndEnd;
use Rector\Core\Configuration\CurrentNodeProvider;
use Rector\Core\Exception\ShouldNotHappenException;
use RectorPrefix20220602\Symplify\PackageBuilder\Reflection\PrivatesCaller;
/**
@ -26,25 +29,35 @@ final class BetterPhpDocParser extends \PHPStan\PhpDocParser\Parser\PhpDocParser
{
/**
* @readonly
* @var \Symplify\PackageBuilder\Reflection\PrivatesCaller
* @var \Rector\Core\Configuration\CurrentNodeProvider
*/
private $privatesCaller;
private $currentNodeProvider;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory
*/
private $tokenIteratorFactory;
/**
* @var PhpDocNodeDecoratorInterface[]
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocParser\DoctrineAnnotationDecorator
*/
private $doctrineAnnotationDecorator;
public function __construct(\PHPStan\PhpDocParser\Parser\TypeParser $typeParser, \PHPStan\PhpDocParser\Parser\ConstExprParser $constExprParser, \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory $tokenIteratorFactory, \Rector\BetterPhpDocParser\PhpDocParser\DoctrineAnnotationDecorator $doctrineAnnotationDecorator)
private $phpDocNodeDecorators;
/**
* @readonly
* @var \Symplify\PackageBuilder\Reflection\PrivatesCaller
*/
private $privatesCaller;
/**
* @param PhpDocNodeDecoratorInterface[] $phpDocNodeDecorators
*/
public function __construct(\PHPStan\PhpDocParser\Parser\TypeParser $typeParser, \PHPStan\PhpDocParser\Parser\ConstExprParser $constExprParser, \Rector\Core\Configuration\CurrentNodeProvider $currentNodeProvider, \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory $tokenIteratorFactory, array $phpDocNodeDecorators, \RectorPrefix20220602\Symplify\PackageBuilder\Reflection\PrivatesCaller $privatesCaller = null)
{
$privatesCaller = $privatesCaller ?? new \RectorPrefix20220602\Symplify\PackageBuilder\Reflection\PrivatesCaller();
$this->currentNodeProvider = $currentNodeProvider;
$this->tokenIteratorFactory = $tokenIteratorFactory;
$this->doctrineAnnotationDecorator = $doctrineAnnotationDecorator;
$this->phpDocNodeDecorators = $phpDocNodeDecorators;
$this->privatesCaller = $privatesCaller;
parent::__construct($typeParser, $constExprParser);
$this->privatesCaller = new \RectorPrefix20220602\Symplify\PackageBuilder\Reflection\PrivatesCaller();
}
public function parse(\PHPStan\PhpDocParser\Parser\TokenIterator $tokenIterator) : \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode
{
@ -60,12 +73,19 @@ final class BetterPhpDocParser extends \PHPStan\PhpDocParser\Parser\PhpDocParser
// might be in the middle of annotations
$tokenIterator->tryConsumeTokenType(\PHPStan\PhpDocParser\Lexer\Lexer::TOKEN_CLOSE_PHPDOC);
$phpDocNode = new \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode($children);
// replace generic nodes with DoctrineAnnotations
$this->doctrineAnnotationDecorator->decorate($phpDocNode);
// decorate FQN classes etc.
$node = $this->currentNodeProvider->getNode();
if (!$node instanceof \PhpParser\Node) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
foreach ($this->phpDocNodeDecorators as $phpDocNodeDecorator) {
$phpDocNodeDecorator->decorate($phpDocNode, $node);
}
return $phpDocNode;
}
public function parseTag(\PHPStan\PhpDocParser\Parser\TokenIterator $tokenIterator) : \PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode
{
// replace generic nodes with DoctrineAnnotations
if (!$tokenIterator instanceof \Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}

View File

@ -0,0 +1,58 @@
<?php
declare (strict_types=1);
namespace Rector\BetterPhpDocParser\PhpDocParser;
use PhpParser\Node as PhpNode;
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode;
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode;
use PHPStan\PhpDocParser\Ast\Node;
use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode;
use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\StaticTypeMapper\Naming\NameScopeFactory;
use RectorPrefix20220602\Symplify\Astral\PhpDocParser\PhpDocNodeTraverser;
/**
* Decorate node with fully qualified class name for const epxr,
* e.g. Direction::*
*/
final class ConstExprClassNameDecorator implements \Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface
{
/**
* @readonly
* @var \Rector\StaticTypeMapper\Naming\NameScopeFactory
*/
private $nameScopeFactory;
/**
* @readonly
* @var \Symplify\Astral\PhpDocParser\PhpDocNodeTraverser
*/
private $phpDocNodeTraverser;
public function __construct(\Rector\StaticTypeMapper\Naming\NameScopeFactory $nameScopeFactory, \RectorPrefix20220602\Symplify\Astral\PhpDocParser\PhpDocNodeTraverser $phpDocNodeTraverser)
{
$this->nameScopeFactory = $nameScopeFactory;
$this->phpDocNodeTraverser = $phpDocNodeTraverser;
}
public function decorate(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PhpParser\Node $phpNode) : void
{
$this->phpDocNodeTraverser->traverseWithCallable($phpDocNode, '', function (\PHPStan\PhpDocParser\Ast\Node $node) use($phpNode) {
if (!$node instanceof \PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode) {
return null;
}
$className = $this->resolveFullyQualifiedClass($node, $phpNode);
if ($className === null) {
return null;
}
$node->setAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::RESOLVED_CLASS, $className);
return $node;
});
}
private function resolveFullyQualifiedClass(\PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode $constExprNode, \PhpParser\Node $phpNode) : ?string
{
if (!$constExprNode instanceof \PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode) {
return null;
}
$nameScope = $this->nameScopeFactory->createNameScopeFromNodeWithoutTemplateTypes($phpNode);
return $nameScope->resolveStringName($constExprNode->className);
}
}

View File

@ -13,16 +13,15 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTextNode;
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
use PHPStan\PhpDocParser\Lexer\Lexer;
use Rector\BetterPhpDocParser\Attributes\AttributeMirrorer;
use Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface;
use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode;
use Rector\BetterPhpDocParser\PhpDoc\SpacelessPhpDocTagNode;
use Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory;
use Rector\BetterPhpDocParser\ValueObject\DoctrineAnnotation\SilentKeyMap;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
use Rector\BetterPhpDocParser\ValueObject\StartAndEnd;
use Rector\Core\Configuration\CurrentNodeProvider;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\Util\StringUtils;
final class DoctrineAnnotationDecorator
final class DoctrineAnnotationDecorator implements \Rector\BetterPhpDocParser\Contract\PhpDocParser\PhpDocNodeDecoratorInterface
{
/**
* Special short annotations, that are resolved as FQN by Doctrine annotation parser
@ -39,11 +38,6 @@ final class DoctrineAnnotationDecorator
* @var string
*/
private const NESTED_ANNOTATION_END_REGEX = '#(\\s+)?\\}\\)(\\s+)?#';
/**
* @readonly
* @var \Rector\Core\Configuration\CurrentNodeProvider
*/
private $currentNodeProvider;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher
@ -64,23 +58,18 @@ final class DoctrineAnnotationDecorator
* @var \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer
*/
private $attributeMirrorer;
public function __construct(\Rector\Core\Configuration\CurrentNodeProvider $currentNodeProvider, \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher $classAnnotationMatcher, \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser, \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory $tokenIteratorFactory, \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer $attributeMirrorer)
public function __construct(\Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher $classAnnotationMatcher, \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser, \Rector\BetterPhpDocParser\PhpDocInfo\TokenIteratorFactory $tokenIteratorFactory, \Rector\BetterPhpDocParser\Attributes\AttributeMirrorer $attributeMirrorer)
{
$this->currentNodeProvider = $currentNodeProvider;
$this->classAnnotationMatcher = $classAnnotationMatcher;
$this->staticDoctrineAnnotationParser = $staticDoctrineAnnotationParser;
$this->tokenIteratorFactory = $tokenIteratorFactory;
$this->attributeMirrorer = $attributeMirrorer;
}
public function decorate(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode) : void
public function decorate(\PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocNode $phpDocNode, \PhpParser\Node $phpNode) : void
{
$currentPhpNode = $this->currentNodeProvider->getNode();
if (!$currentPhpNode instanceof \PhpParser\Node) {
throw new \Rector\Core\Exception\ShouldNotHappenException();
}
// merge split doctrine nested tags
$this->mergeNestedDoctrineAnnotations($phpDocNode);
$this->transformGenericTagValueNodesToDoctrineAnnotationTagValueNodes($phpDocNode, $currentPhpNode);
$this->transformGenericTagValueNodesToDoctrineAnnotationTagValueNodes($phpDocNode, $phpNode);
}
/**
* Join token iterator with all the following nodes if nested

View File

@ -3,8 +3,10 @@
declare (strict_types=1);
namespace Rector\Php80\NodeAnalyzer;
use PhpParser\Node\Scalar;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PHPStan\Type\Type;
use Rector\NodeTypeResolver\NodeTypeResolver;
final class EnumConstListClassDetector
{
@ -29,10 +31,8 @@ final class EnumConstListClassDetector
return \false;
}
// all constant must be public
foreach ($classConstants as $classConstant) {
if (!$classConstant->isPublic()) {
return \false;
}
if (!$this->hasExclusivelyPublicClassConsts($classConstants)) {
return \false;
}
// all constants must have exactly 1 value
foreach ($classConstants as $classConstant) {
@ -40,23 +40,42 @@ final class EnumConstListClassDetector
return \false;
}
}
$constantUniqueTypeCount = $this->resolveConstantUniqueTypeCount($classConstants);
// only scalar values are allowed
foreach ($classConstants as $classConstant) {
$onlyConstConst = $classConstant->consts[0];
if (!$onlyConstConst->value instanceof \PhpParser\Node\Scalar) {
return \false;
}
}
$uniqueTypeClasses = $this->resolveClassConstTypes($classConstants);
// must be exactly 1 type
return $constantUniqueTypeCount === 1;
return \count($uniqueTypeClasses) === 1;
}
/**
* @param ClassConst[] $classConsts
* @return array<class-string<Type>>
*/
private function resolveConstantUniqueTypeCount(array $classConsts) : int
private function resolveClassConstTypes(array $classConsts) : array
{
$typeClasses = [];
// all constants must have same type
foreach ($classConsts as $classConst) {
$const = $classConst->consts[0];
$constantType = $this->nodeTypeResolver->getType($const->value);
$typeClasses[] = \get_class($constantType);
$type = $this->nodeTypeResolver->getType($const->value);
$typeClasses[] = \get_class($type);
}
$uniqueTypeClasses = \array_unique($typeClasses);
return \count($uniqueTypeClasses);
return \array_unique($typeClasses);
}
/**
* @param ClassConst[] $classConsts
*/
private function hasExclusivelyPublicClassConsts(array $classConsts) : bool
{
foreach ($classConsts as $classConst) {
if (!$classConst->isPublic()) {
return \false;
}
}
return \true;
}
}

View File

@ -0,0 +1,52 @@
<?php
declare (strict_types=1);
namespace Rector\Php80\NodeAnalyzer;
use PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode;
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
use PHPStan\PhpDocParser\Ast\Type\ConstTypeNode;
use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\Php\PhpParameterReflection;
use PHPStan\Reflection\ReflectionProvider;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey;
/**
* Detects enum-like params, e.g.
* Direction::*
*/
final class EnumParamAnalyzer
{
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
public function __construct(\PHPStan\Reflection\ReflectionProvider $reflectionProvider)
{
$this->reflectionProvider = $reflectionProvider;
}
public function matchClassName(\PHPStan\Reflection\ParameterReflection $parameterReflection, \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo $phpDocInfo) : ?string
{
if (!$parameterReflection instanceof \PHPStan\Reflection\Php\PhpParameterReflection) {
return null;
}
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($parameterReflection->getName());
if (!$paramTagValueNode instanceof \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode) {
return null;
}
if (!$paramTagValueNode->type instanceof \PHPStan\PhpDocParser\Ast\Type\ConstTypeNode) {
return null;
}
$constTypeNode = $paramTagValueNode->type;
if (!$constTypeNode->constExpr instanceof \PHPStan\PhpDocParser\Ast\ConstExpr\ConstFetchNode) {
return null;
}
$constExpr = $constTypeNode->constExpr;
$className = $constExpr->getAttribute(\Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey::RESOLVED_CLASS);
if (!$this->reflectionProvider->hasClass($className)) {
return null;
}
return $className;
}
}

View File

@ -4,9 +4,19 @@ declare (strict_types=1);
namespace Rector\Php80\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
use PHPStan\Reflection\MethodReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\Reflection\ReflectionResolver;
use Rector\Php80\NodeAnalyzer\EnumConstListClassDetector;
use Rector\Php80\NodeAnalyzer\EnumParamAnalyzer;
use Rector\Php81\NodeFactory\EnumFactory;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@ -25,10 +35,28 @@ final class ConstantListClassToEnumRector extends \Rector\Core\Rector\AbstractRe
* @var \Rector\Php81\NodeFactory\EnumFactory
*/
private $enumFactory;
public function __construct(\Rector\Php80\NodeAnalyzer\EnumConstListClassDetector $enumConstListClassDetector, \Rector\Php81\NodeFactory\EnumFactory $enumFactory)
/**
* @readonly
* @var \Rector\Php80\NodeAnalyzer\EnumParamAnalyzer
*/
private $enumParamAnalyzer;
/**
* @readonly
* @var \Rector\Core\Reflection\ReflectionResolver
*/
private $reflectionResolver;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover
*/
private $phpDocTagRemover;
public function __construct(\Rector\Php80\NodeAnalyzer\EnumConstListClassDetector $enumConstListClassDetector, \Rector\Php81\NodeFactory\EnumFactory $enumFactory, \Rector\Php80\NodeAnalyzer\EnumParamAnalyzer $enumParamAnalyzer, \Rector\Core\Reflection\ReflectionResolver $reflectionResolver, \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover $phpDocTagRemover)
{
$this->enumConstListClassDetector = $enumConstListClassDetector;
$this->enumFactory = $enumFactory;
$this->enumParamAnalyzer = $enumParamAnalyzer;
$this->reflectionResolver = $reflectionResolver;
$this->phpDocTagRemover = $phpDocTagRemover;
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
@ -55,16 +83,66 @@ CODE_SAMPLE
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\Class_::class];
return [\PhpParser\Node\Stmt\Class_::class, \PhpParser\Node\Stmt\ClassMethod::class];
}
/**
* @param Class_ $node
* @param Class_|ClassMethod $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
if (!$this->enumConstListClassDetector->detect($node)) {
if ($node instanceof \PhpParser\Node\Stmt\Class_) {
if (!$this->enumConstListClassDetector->detect($node)) {
return null;
}
return $this->enumFactory->createFromClass($node);
}
return $this->refactorClassMethod($node);
}
private function refactorClassMethod(\PhpParser\Node\Stmt\ClassMethod $classMethod) : ?\PhpParser\Node\Stmt\ClassMethod
{
if ($classMethod->params === []) {
return null;
}
return $this->enumFactory->createFromClass($node);
// enum param types doc requires a docblock
$phpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod);
if (!$phpDocInfo instanceof \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo) {
return null;
}
$methodReflection = $this->reflectionResolver->resolveMethodReflectionFromClassMethod($classMethod);
if (!$methodReflection instanceof \PHPStan\Reflection\MethodReflection) {
return null;
}
$hasNodeChanged = \false;
$parametersAcceptor = \PHPStan\Reflection\ParametersAcceptorSelector::selectSingle($methodReflection->getVariants());
foreach ($parametersAcceptor->getParameters() as $parameterReflection) {
$enumLikeClass = $this->enumParamAnalyzer->matchClassName($parameterReflection, $phpDocInfo);
if ($enumLikeClass === null) {
continue;
}
$param = $this->getParamByName($classMethod, $parameterReflection->getName());
if (!$param instanceof \PhpParser\Node\Param) {
continue;
}
// change and remove
$param->type = new \PhpParser\Node\Name\FullyQualified($enumLikeClass);
$hasNodeChanged = \true;
/** @var ParamTagValueNode $paramTagValueNode */
$paramTagValueNode = $phpDocInfo->getParamTagValueByName($parameterReflection->getName());
$this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $paramTagValueNode);
}
if ($hasNodeChanged) {
return $classMethod;
}
return null;
}
private function getParamByName(\PhpParser\Node\Stmt\ClassMethod $classMethod, string $desiredParamName) : ?\PhpParser\Node\Param
{
foreach ($classMethod->params as $param) {
if (!$this->nodeNameResolver->isName($param, $desiredParamName)) {
continue;
}
return $param;
}
return null;
}
}

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = 'ba0869a9a5a9a04b018d329c0e4259fb8e126d28';
public const PACKAGE_VERSION = 'a73dafd30a8e2cdc058080c866f7d2d6032f8ba2';
/**
* @var string
*/
public const RELEASE_DATE = '2022-06-02 09:19:57';
public const RELEASE_DATE = '2022-06-02 10:58:19';
/**
* @var int
*/

2
vendor/autoload.php vendored
View File

@ -9,4 +9,4 @@ if (PHP_VERSION_ID < 50600) {
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41::getLoader();
return ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687::getLoader();

View File

@ -1299,6 +1299,7 @@ return array(
'Rector\\BetterPhpDocParser\\Attributes\\AttributeMirrorer' => $baseDir . '/packages/BetterPhpDocParser/Attributes/AttributeMirrorer.php',
'Rector\\BetterPhpDocParser\\Comment\\CommentsMerger' => $baseDir . '/packages/BetterPhpDocParser/Comment/CommentsMerger.php',
'Rector\\BetterPhpDocParser\\Contract\\BasePhpDocNodeVisitorInterface' => $baseDir . '/packages/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.php',
'Rector\\BetterPhpDocParser\\Contract\\PhpDocParser\\PhpDocNodeDecoratorInterface' => $baseDir . '/packages/BetterPhpDocParser/Contract/PhpDocParser/PhpDocNodeDecoratorInterface.php',
'Rector\\BetterPhpDocParser\\DataProvider\\CurrentTokenIteratorProvider' => $baseDir . '/packages/BetterPhpDocParser/DataProvider/CurrentTokenIteratorProvider.php',
'Rector\\BetterPhpDocParser\\PhpDocInfo\\PhpDocInfo' => $baseDir . '/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php',
'Rector\\BetterPhpDocParser\\PhpDocInfo\\PhpDocInfoFactory' => $baseDir . '/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php',
@ -1320,6 +1321,7 @@ return array(
'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterPhpDocParser' => $baseDir . '/packages/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterTypeParser' => $baseDir . '/packages/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\ClassAnnotationMatcher' => $baseDir . '/packages/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\ConstExprClassNameDecorator' => $baseDir . '/packages/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\DoctrineAnnotationDecorator' => $baseDir . '/packages/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\PhpDocFromTypeDeclarationDecorator' => $baseDir . '/packages/BetterPhpDocParser/PhpDocParser/PhpDocFromTypeDeclarationDecorator.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\StaticDoctrineAnnotationParser' => $baseDir . '/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php',
@ -2576,6 +2578,7 @@ return array(
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\SubstrMatchAndRefactor' => $baseDir . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php',
'Rector\\Php80\\NodeAnalyzer\\AnnotationTargetResolver' => $baseDir . '/rules/Php80/NodeAnalyzer/AnnotationTargetResolver.php',
'Rector\\Php80\\NodeAnalyzer\\EnumConstListClassDetector' => $baseDir . '/rules/Php80/NodeAnalyzer/EnumConstListClassDetector.php',
'Rector\\Php80\\NodeAnalyzer\\EnumParamAnalyzer' => $baseDir . '/rules/Php80/NodeAnalyzer/EnumParamAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\MatchSwitchAnalyzer' => $baseDir . '/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\PhpAttributeAnalyzer' => $baseDir . '/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\PromotedPropertyCandidateResolver' => $baseDir . '/rules/Php80/NodeAnalyzer/PromotedPropertyCandidateResolver.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41
class ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitecab57cd86e1acfc1267198cfd0fd687::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInitecab57cd86e1acfc1267198cfd0fd687::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire19e05005cf0d4a302b3e979edd7c8a41($fileIdentifier, $file);
composerRequireecab57cd86e1acfc1267198cfd0fd687($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41
* @param string $file
* @return void
*/
function composerRequire19e05005cf0d4a302b3e979edd7c8a41($fileIdentifier, $file)
function composerRequireecab57cd86e1acfc1267198cfd0fd687($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41
class ComposerStaticInitecab57cd86e1acfc1267198cfd0fd687
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -1626,6 +1626,7 @@ class ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41
'Rector\\BetterPhpDocParser\\Attributes\\AttributeMirrorer' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/Attributes/AttributeMirrorer.php',
'Rector\\BetterPhpDocParser\\Comment\\CommentsMerger' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/Comment/CommentsMerger.php',
'Rector\\BetterPhpDocParser\\Contract\\BasePhpDocNodeVisitorInterface' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/Contract/BasePhpDocNodeVisitorInterface.php',
'Rector\\BetterPhpDocParser\\Contract\\PhpDocParser\\PhpDocNodeDecoratorInterface' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/Contract/PhpDocParser/PhpDocNodeDecoratorInterface.php',
'Rector\\BetterPhpDocParser\\DataProvider\\CurrentTokenIteratorProvider' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/DataProvider/CurrentTokenIteratorProvider.php',
'Rector\\BetterPhpDocParser\\PhpDocInfo\\PhpDocInfo' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php',
'Rector\\BetterPhpDocParser\\PhpDocInfo\\PhpDocInfoFactory' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php',
@ -1647,6 +1648,7 @@ class ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41
'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterPhpDocParser' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocParser/BetterPhpDocParser.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\BetterTypeParser' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocParser/BetterTypeParser.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\ClassAnnotationMatcher' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocParser/ClassAnnotationMatcher.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\ConstExprClassNameDecorator' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocParser/ConstExprClassNameDecorator.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\DoctrineAnnotationDecorator' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\PhpDocFromTypeDeclarationDecorator' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocParser/PhpDocFromTypeDeclarationDecorator.php',
'Rector\\BetterPhpDocParser\\PhpDocParser\\StaticDoctrineAnnotationParser' => __DIR__ . '/../..' . '/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php',
@ -2903,6 +2905,7 @@ class ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41
'Rector\\Php80\\MatchAndRefactor\\StrStartsWithMatchAndRefactor\\SubstrMatchAndRefactor' => __DIR__ . '/../..' . '/rules/Php80/MatchAndRefactor/StrStartsWithMatchAndRefactor/SubstrMatchAndRefactor.php',
'Rector\\Php80\\NodeAnalyzer\\AnnotationTargetResolver' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/AnnotationTargetResolver.php',
'Rector\\Php80\\NodeAnalyzer\\EnumConstListClassDetector' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/EnumConstListClassDetector.php',
'Rector\\Php80\\NodeAnalyzer\\EnumParamAnalyzer' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/EnumParamAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\MatchSwitchAnalyzer' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/MatchSwitchAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\PhpAttributeAnalyzer' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/PhpAttributeAnalyzer.php',
'Rector\\Php80\\NodeAnalyzer\\PromotedPropertyCandidateResolver' => __DIR__ . '/../..' . '/rules/Php80/NodeAnalyzer/PromotedPropertyCandidateResolver.php',
@ -3784,9 +3787,9 @@ class ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit19e05005cf0d4a302b3e979edd7c8a41::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitecab57cd86e1acfc1267198cfd0fd687::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitecab57cd86e1acfc1267198cfd0fd687::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitecab57cd86e1acfc1267198cfd0fd687::$classMap;
}, null, ClassLoader::class);
}

View File

@ -3151,17 +3151,17 @@
},
{
"name": "symfony\/polyfill-intl-normalizer",
"version": "v1.25.0",
"version_normalized": "1.25.0.0",
"version": "v1.26.0",
"version_normalized": "1.26.0.0",
"source": {
"type": "git",
"url": "https:\/\/github.com\/symfony\/polyfill-intl-normalizer.git",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8"
"reference": "219aa369ceff116e673852dce47c3a41794c14bd"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-normalizer\/zipball\/8590a5f561694770bdcd3f9b5c69dde6945028e8",
"reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8",
"url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-intl-normalizer\/zipball\/219aa369ceff116e673852dce47c3a41794c14bd",
"reference": "219aa369ceff116e673852dce47c3a41794c14bd",
"shasum": ""
},
"require": {
@ -3170,11 +3170,11 @@
"suggest": {
"ext-intl": "For best performance"
},
"time": "2021-02-19T12:13:01+00:00",
"time": "2022-05-24T11:49:31+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
"dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony\/polyfill",
@ -3218,7 +3218,7 @@
"shim"
],
"support": {
"source": "https:\/\/github.com\/symfony\/polyfill-intl-normalizer\/tree\/v1.25.0"
"source": "https:\/\/github.com\/symfony\/polyfill-intl-normalizer\/tree\/v1.26.0"
},
"funding": [
{
@ -3238,17 +3238,17 @@
},
{
"name": "symfony\/polyfill-mbstring",
"version": "v1.25.0",
"version_normalized": "1.25.0.0",
"version": "v1.26.0",
"version_normalized": "1.26.0.0",
"source": {
"type": "git",
"url": "https:\/\/github.com\/symfony\/polyfill-mbstring.git",
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825"
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/0abb51d2f102e00a4eefcf46ba7fec406d245825",
"reference": "0abb51d2f102e00a4eefcf46ba7fec406d245825",
"url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-mbstring\/zipball\/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e",
"shasum": ""
},
"require": {
@ -3260,11 +3260,11 @@
"suggest": {
"ext-mbstring": "For best performance"
},
"time": "2021-11-30T18:21:41+00:00",
"time": "2022-05-24T11:49:31+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
"dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony\/polyfill",
@ -3304,7 +3304,7 @@
"shim"
],
"support": {
"source": "https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.25.0"
"source": "https:\/\/github.com\/symfony\/polyfill-mbstring\/tree\/v1.26.0"
},
"funding": [
{
@ -3324,27 +3324,27 @@
},
{
"name": "symfony\/polyfill-php81",
"version": "v1.25.0",
"version_normalized": "1.25.0.0",
"version": "v1.26.0",
"version_normalized": "1.26.0.0",
"source": {
"type": "git",
"url": "https:\/\/github.com\/symfony\/polyfill-php81.git",
"reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f"
"reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1"
},
"dist": {
"type": "zip",
"url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-php81\/zipball\/5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
"reference": "5de4ba2d41b15f9bd0e19b2ab9674135813ec98f",
"url": "https:\/\/api.github.com\/repos\/symfony\/polyfill-php81\/zipball\/13f6d1271c663dc5ae9fb843a8f16521db7687a1",
"reference": "13f6d1271c663dc5ae9fb843a8f16521db7687a1",
"shasum": ""
},
"require": {
"php": ">=7.1"
},
"time": "2021-09-13T13:58:11+00:00",
"time": "2022-05-24T11:49:31+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
"dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony\/polyfill",
@ -3386,7 +3386,7 @@
"shim"
],
"support": {
"source": "https:\/\/github.com\/symfony\/polyfill-php81\/tree\/v1.25.0"
"source": "https:\/\/github.com\/symfony\/polyfill-php81\/tree\/v1.26.0"
},
"funding": [
{

File diff suppressed because one or more lines are too long

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20220602\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41', false) && !interface_exists('ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41', false) && !trait_exists('ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41', false)) {
spl_autoload_call('RectorPrefix20220602\ComposerAutoloaderInit19e05005cf0d4a302b3e979edd7c8a41');
if (!class_exists('ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687', false) && !interface_exists('ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687', false) && !trait_exists('ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687', false)) {
spl_autoload_call('RectorPrefix20220602\ComposerAutoloaderInitecab57cd86e1acfc1267198cfd0fd687');
}
if (!class_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !interface_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !trait_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false)) {
spl_autoload_call('RectorPrefix20220602\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -59,9 +59,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20220602\print_node(...func_get_args());
}
}
if (!function_exists('composerRequire19e05005cf0d4a302b3e979edd7c8a41')) {
function composerRequire19e05005cf0d4a302b3e979edd7c8a41() {
return \RectorPrefix20220602\composerRequire19e05005cf0d4a302b3e979edd7c8a41(...func_get_args());
if (!function_exists('composerRequireecab57cd86e1acfc1267198cfd0fd687')) {
function composerRequireecab57cd86e1acfc1267198cfd0fd687() {
return \RectorPrefix20220602\composerRequireecab57cd86e1acfc1267198cfd0fd687(...func_get_args());
}
}
if (!function_exists('scanPath')) {

View File

@ -6,7 +6,7 @@ This component provides a fallback implementation for the
by the [Intl](https://php.net/intl) extension.
More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
License
=======

View File

@ -42,7 +42,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
"dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony\/polyfill",

View File

@ -464,7 +464,7 @@ final class Mbstring
$split_length -= 65535;
}
$rx .= '.{' . $split_length . '})/us';
return \preg_split($rx, $string, null, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
return \preg_split($rx, $string, -1, \PREG_SPLIT_DELIM_CAPTURE | \PREG_SPLIT_NO_EMPTY);
}
$result = [];
$length = \mb_strlen($string, $encoding);

View File

@ -5,7 +5,7 @@ This component provides a partial, native PHP implementation for the
[Mbstring](https://php.net/mbstring) extension.
More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
License
=======

View File

@ -41,7 +41,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
"dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony\/polyfill",

View File

@ -4,11 +4,12 @@ Symfony Polyfill / Php81
This component provides features added to PHP 8.1 core:
- [`array_is_list`](https://php.net/array_is_list)
- [`MYSQLI_REFRESH_REPLICA`](https://www.php.net/manual/en/mysqli.constants.php#constantmysqli-refresh-replica) constant
- [`enum_exists`](https://php.net/enum-exists)
- [`MYSQLI_REFRESH_REPLICA`](https://php.net/mysqli.constants#constantmysqli-refresh-replica) constant
- [`ReturnTypeWillChange`](https://wiki.php.net/rfc/internal_method_return_types)
More information can be found in the
[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
[main Polyfill README](https://github.com/symfony/polyfill/blob/main/README.md).
License
=======

View File

@ -37,7 +37,7 @@
"minimum-stability": "dev",
"extra": {
"branch-alias": {
"dev-main": "1.23-dev"
"dev-main": "1.26-dev"
},
"thanks": {
"name": "symfony\/polyfill",