Updated Rector to commit 48febdb978201ffdd2d62ccb970ede09c3160134

48febdb978 [TypeDeclaration] Add AddParamTypeBasedOnPHPUnitDataProviderRector + remove too narrow KnownArrayParamTypeInferer (#3104)
This commit is contained in:
Tomas Votruba 2022-11-27 17:56:33 +00:00
parent 566033e175
commit b492db7306
9 changed files with 156 additions and 121 deletions

View File

@ -1,4 +1,4 @@
# 402 Rules Overview
# 403 Rules Overview
<br>
@ -64,7 +64,7 @@
- [Transform](#transform) (34)
- [TypeDeclaration](#typedeclaration) (30)
- [TypeDeclaration](#typedeclaration) (31)
- [Visibility](#visibility) (3)
@ -8805,6 +8805,34 @@ Change private method param type to strict type, based on passed strict types
<br>
### AddParamTypeBasedOnPHPUnitDataProviderRector
Adds param type declaration based on PHPUnit provider return type declaration
- class: [`Rector\TypeDeclaration\Rector\ClassMethod\AddParamTypeBasedOnPHPUnitDataProviderRector`](../rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php)
```diff
use PHPUnit\Framework\TestCase
final class SomeTest extends TestCase
{
/**
* @dataProvider provideData()
*/
- public function test($value)
+ public function test(string $value)
{
}
public function provideData()
{
yield ['name'];
}
}
```
<br>
### AddParamTypeDeclarationRector
Add param types where needed

View File

@ -5,6 +5,9 @@ namespace Rector\TypeDeclaration\Contract\TypeInferer;
use PhpParser\Node\Param;
use PHPStan\Type\Type;
/**
* @deprecated This interface is not used anymore. Use the exact Rector rules instead.
*/
interface ParamTypeInfererInterface
{
public function inferParam(Param $param) : Type;

View File

@ -1,13 +1,13 @@
<?php
declare (strict_types=1);
namespace Rector\TypeDeclaration\TypeInferer\ParamTypeInferer;
namespace Rector\TypeDeclaration\Rector\ClassMethod;
use RectorPrefix202211\Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Expr\Array_;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\Node\Expr\Yield_;
use PhpParser\Node\FunctionLike;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
@ -18,30 +18,28 @@ use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\MixedType;
use PHPStan\Type\Type;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\NodeTypeResolver\NodeTypeResolver;
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
use Rector\TypeDeclaration\Contract\TypeInferer\ParamTypeInfererInterface;
use RectorPrefix202211\Symfony\Contracts\Service\Attribute\Required;
final class PHPUnitDataProviderParamTypeInferer implements ParamTypeInfererInterface
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\AddParamTypeBasedOnPHPUnitDataProviderRector\AddParamTypeBasedOnPHPUnitDataProviderRectorTest
*/
final class AddParamTypeBasedOnPHPUnitDataProviderRector extends AbstractRector
{
/**
* @var string
*/
private const ERROR_MESSAGE = 'Adds param type declaration based on PHPUnit provider return type declaration';
/**
* @see https://regex101.com/r/hW09Vt/1
* @var string
*/
private const METHOD_NAME_REGEX = '#^(?<method_name>\\w+)(\\(\\))?#';
/**
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory
@ -49,26 +47,96 @@ final class PHPUnitDataProviderParamTypeInferer implements ParamTypeInfererInter
private $typeFactory;
/**
* @readonly
* @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory
* @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer
*/
private $phpDocInfoFactory;
public function __construct(BetterNodeFinder $betterNodeFinder, TypeFactory $typeFactory, PhpDocInfoFactory $phpDocInfoFactory)
private $testsNodeAnalyzer;
public function __construct(TypeFactory $typeFactory, TestsNodeAnalyzer $testsNodeAnalyzer)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->typeFactory = $typeFactory;
$this->phpDocInfoFactory = $phpDocInfoFactory;
$this->testsNodeAnalyzer = $testsNodeAnalyzer;
}
// Prevents circular reference
public function getRuleDefinition() : RuleDefinition
{
return new RuleDefinition(self::ERROR_MESSAGE, [new CodeSample(<<<'CODE_SAMPLE'
use PHPUnit\Framework\TestCase
final class SomeTest extends TestCase
{
/**
* @required
* @dataProvider provideData()
*/
public function autowire(NodeTypeResolver $nodeTypeResolver) : void
public function test($value)
{
$this->nodeTypeResolver = $nodeTypeResolver;
}
public function inferParam(Param $param) : Type
public function provideData()
{
$dataProviderClassMethod = $this->resolveDataProviderClassMethod($param);
yield ['name'];
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
use PHPUnit\Framework\TestCase
final class SomeTest extends TestCase
{
/**
* @dataProvider provideData()
*/
public function test(string $value)
{
}
public function provideData()
{
yield ['name'];
}
}
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [ClassMethod::class];
}
/**
* @param ClassMethod $node
*/
public function refactor(Node $node) : ?ClassMethod
{
if (!$node->isPublic()) {
return null;
}
if ($node->getParams() === []) {
return null;
}
if (!$this->testsNodeAnalyzer->isInTestClass($node)) {
return null;
}
$dataProviderPhpDocTagNode = $this->resolveDataProviderPhpDocTagNode($node);
if (!$dataProviderPhpDocTagNode instanceof PhpDocTagNode) {
return null;
}
$hasChanged = \false;
foreach ($node->getParams() as $param) {
$paramTypeDeclaration = $this->inferParam($param, $dataProviderPhpDocTagNode);
if ($paramTypeDeclaration instanceof MixedType) {
continue;
}
$param->type = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($paramTypeDeclaration, TypeKind::PARAM);
$hasChanged = \true;
}
if ($hasChanged) {
return $node;
}
return null;
}
private function inferParam(Param $param, PhpDocTagNode $dataProviderPhpDocTagNode) : Type
{
$dataProviderClassMethod = $this->resolveDataProviderClassMethod($param, $dataProviderPhpDocTagNode);
if (!$dataProviderClassMethod instanceof ClassMethod) {
return new MixedType();
}
@ -85,21 +153,16 @@ final class PHPUnitDataProviderParamTypeInferer implements ParamTypeInfererInter
$yields = $this->betterNodeFinder->findInstanceOf((array) $dataProviderClassMethod->stmts, Yield_::class);
return $this->resolveYieldStaticArrayTypeByParameterPosition($yields, $parameterPosition);
}
private function resolveDataProviderClassMethod(Param $param) : ?ClassMethod
private function resolveDataProviderClassMethod(Param $param, PhpDocTagNode $dataProviderPhpDocTagNode) : ?ClassMethod
{
$phpDocInfo = $this->getFunctionLikePhpDocInfo($param);
$phpDocTagNode = $phpDocInfo->getByName('@dataProvider');
if (!$phpDocTagNode instanceof PhpDocTagNode) {
return null;
}
$class = $this->betterNodeFinder->findParentType($param, Class_::class);
if (!$class instanceof Class_) {
return null;
}
if (!$phpDocTagNode->value instanceof GenericTagValueNode) {
if (!$dataProviderPhpDocTagNode->value instanceof GenericTagValueNode) {
return null;
}
$content = $phpDocTagNode->value->value;
$content = $dataProviderPhpDocTagNode->value->value;
$match = Strings::match($content, self::METHOD_NAME_REGEX);
if ($match === null) {
return null;
@ -160,14 +223,6 @@ final class PHPUnitDataProviderParamTypeInferer implements ParamTypeInfererInter
}
return $arrayTypes;
}
private function getFunctionLikePhpDocInfo(Param $param) : PhpDocInfo
{
$parentNode = $param->getAttribute(AttributeKey::PARENT_NODE);
if (!$parentNode instanceof FunctionLike) {
throw new ShouldNotHappenException();
}
return $this->phpDocInfoFactory->createFromNodeOrEmpty($parentNode);
}
/**
* @return Type[]
*/
@ -190,4 +245,12 @@ final class PHPUnitDataProviderParamTypeInferer implements ParamTypeInfererInter
}
return $paramOnPositionTypes;
}
private function resolveDataProviderPhpDocTagNode(ClassMethod $classMethod) : ?PhpDocTagNode
{
$classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod);
if (!$classMethodPhpDocInfo instanceof PhpDocInfo) {
return null;
}
return $classMethodPhpDocInfo->getByName('@dataProvider');
}
}

View File

@ -1,57 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\TypeDeclaration\TypeInferer\ParamTypeInferer;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Class_;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\ArrayType;
use PHPStan\Type\MixedType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\TypeDeclaration\Contract\TypeInferer\ParamTypeInfererInterface;
final class KnownArrayParamTypeInferer implements ParamTypeInfererInterface
{
/**
* @readonly
* @var \Rector\NodeNameResolver\NodeNameResolver
*/
private $nodeNameResolver;
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, BetterNodeFinder $betterNodeFinder)
{
$this->nodeNameResolver = $nodeNameResolver;
$this->reflectionProvider = $reflectionProvider;
$this->betterNodeFinder = $betterNodeFinder;
}
public function inferParam(Param $param) : Type
{
$class = $this->betterNodeFinder->findParentType($param, Class_::class);
if (!$class instanceof Class_) {
return new MixedType();
}
$className = (string) $this->nodeNameResolver->getName($class);
if (!$this->reflectionProvider->hasClass($className)) {
return new MixedType();
}
$classReflection = $this->reflectionProvider->getClass($className);
$paramName = $this->nodeNameResolver->getName($param);
// @todo create map later
if ($paramName === 'configs' && $classReflection->isSubclassOf('Symfony\\Component\\DependencyInjection\\Extension\\Extension')) {
return new ArrayType(new MixedType(), new StringType());
}
return new MixedType();
}
}

View File

@ -17,12 +17,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '2af3c7fb68f59fbc5f8ffee9a4fa80d430331159';
public const PACKAGE_VERSION = '48febdb978201ffdd2d62ccb970ede09c3160134';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2022-11-27 16:37:31';
public const RELEASE_DATE = '2022-11-27 18:51:10';
/**
* @var int
*/

2
vendor/autoload.php vendored
View File

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

View File

@ -2698,6 +2698,7 @@ return array(
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddArrayParamDocTypeRector' => $baseDir . '/rules/TypeDeclaration/Rector/ClassMethod/AddArrayParamDocTypeRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddArrayReturnDocTypeRector' => $baseDir . '/rules/TypeDeclaration/Rector/ClassMethod/AddArrayReturnDocTypeRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddMethodCallBasedStrictParamTypeRector' => $baseDir . '/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddParamTypeBasedOnPHPUnitDataProviderRector' => $baseDir . '/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddParamTypeDeclarationRector' => $baseDir . '/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddReturnTypeDeclarationBasedOnParentClassMethodRector' => $baseDir . '/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddReturnTypeDeclarationRector' => $baseDir . '/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php',
@ -2736,8 +2737,6 @@ return array(
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\FunctionLikeDocParamTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/FunctionLikeDocParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\GetterNodeParamTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/GetterNodeParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\KnownArrayParamTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/KnownArrayParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\PHPUnitDataProviderParamTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PHPUnitDataProviderParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\PropertyNodeParamTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PropertyNodeParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\SplFixedArrayParamTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/SplFixedArrayParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\PropertyTypeInferer\\AllAssignNodePropertyTypeInferer' => $baseDir . '/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInitc3009166ca3594b36327097967176e69
class ComposerAutoloaderInitd188a1b0ebfa55c965020711b53facfb
{
private static $loader;
@ -22,19 +22,19 @@ class ComposerAutoloaderInitc3009166ca3594b36327097967176e69
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInitc3009166ca3594b36327097967176e69', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInitd188a1b0ebfa55c965020711b53facfb', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
spl_autoload_unregister(array('ComposerAutoloaderInitc3009166ca3594b36327097967176e69', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInitd188a1b0ebfa55c965020711b53facfb', 'loadClassLoader'));
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInitc3009166ca3594b36327097967176e69::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInitd188a1b0ebfa55c965020711b53facfb::getInitializer($loader));
$loader->setClassMapAuthoritative(true);
$loader->register(true);
$includeFiles = \Composer\Autoload\ComposerStaticInitc3009166ca3594b36327097967176e69::$files;
$includeFiles = \Composer\Autoload\ComposerStaticInitd188a1b0ebfa55c965020711b53facfb::$files;
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequirec3009166ca3594b36327097967176e69($fileIdentifier, $file);
composerRequired188a1b0ebfa55c965020711b53facfb($fileIdentifier, $file);
}
return $loader;
@ -46,7 +46,7 @@ class ComposerAutoloaderInitc3009166ca3594b36327097967176e69
* @param string $file
* @return void
*/
function composerRequirec3009166ca3594b36327097967176e69($fileIdentifier, $file)
function composerRequired188a1b0ebfa55c965020711b53facfb($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 ComposerStaticInitc3009166ca3594b36327097967176e69
class ComposerStaticInitd188a1b0ebfa55c965020711b53facfb
{
public static $files = array (
'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php',
@ -2943,6 +2943,7 @@ class ComposerStaticInitc3009166ca3594b36327097967176e69
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddArrayParamDocTypeRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/ClassMethod/AddArrayParamDocTypeRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddArrayReturnDocTypeRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/ClassMethod/AddArrayReturnDocTypeRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddMethodCallBasedStrictParamTypeRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/ClassMethod/AddMethodCallBasedStrictParamTypeRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddParamTypeBasedOnPHPUnitDataProviderRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddParamTypeDeclarationRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeDeclarationRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddReturnTypeDeclarationBasedOnParentClassMethodRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationBasedOnParentClassMethodRector.php',
'Rector\\TypeDeclaration\\Rector\\ClassMethod\\AddReturnTypeDeclarationRector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Rector/ClassMethod/AddReturnTypeDeclarationRector.php',
@ -2981,8 +2982,6 @@ class ComposerStaticInitc3009166ca3594b36327097967176e69
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\FunctionLikeDocParamTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/FunctionLikeDocParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\GetterNodeParamTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/GetterNodeParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\KnownArrayParamTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/KnownArrayParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\PHPUnitDataProviderParamTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PHPUnitDataProviderParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\PropertyNodeParamTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/PropertyNodeParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\ParamTypeInferer\\SplFixedArrayParamTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/ParamTypeInferer/SplFixedArrayParamTypeInferer.php',
'Rector\\TypeDeclaration\\TypeInferer\\PropertyTypeInferer\\AllAssignNodePropertyTypeInferer' => __DIR__ . '/../..' . '/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/AllAssignNodePropertyTypeInferer.php',
@ -3038,9 +3037,9 @@ class ComposerStaticInitc3009166ca3594b36327097967176e69
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInitc3009166ca3594b36327097967176e69::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitc3009166ca3594b36327097967176e69::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitc3009166ca3594b36327097967176e69::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInitd188a1b0ebfa55c965020711b53facfb::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInitd188a1b0ebfa55c965020711b53facfb::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInitd188a1b0ebfa55c965020711b53facfb::$classMap;
}, null, ClassLoader::class);
}