← Back
Editing: PregReplaceCallbackClosureTypeExtension.php
<?php declare(strict_types=1); namespace Composer\Pcre\PHPStan; use Composer\Pcre\Preg; use Composer\Pcre\Regex; use PhpParser\Node\Expr\StaticCall; use PHPStan\Analyser\Scope; use PHPStan\Reflection\MethodReflection; use PHPStan\Reflection\Native\NativeParameterReflection; use PHPStan\Reflection\ParameterReflection; use PHPStan\TrinaryLogic; use PHPStan\Type\ClosureType; use PHPStan\Type\Php\RegexArrayShapeMatcher; use PHPStan\Type\StaticMethodParameterClosureTypeExtension; use PHPStan\Type\StringType; use PHPStan\Type\Type; final class PregReplaceCallbackClosureTypeExtension implements StaticMethodParameterClosureTypeExtension { /** * @var RegexArrayShapeMatcher */ private $regexShapeMatcher; public function __construct(RegexArrayShapeMatcher $regexShapeMatcher) { $this->regexShapeMatcher = $regexShapeMatcher; } public function isStaticMethodSupported(MethodReflection $methodReflection, ParameterReflection $parameter): bool { return in_array($methodReflection->getDeclaringClass()->getName(), [Preg::class, Regex::class], true) && in_array($methodReflection->getName(), ['replaceCallback'], true) && $parameter->getName() === 'replacement'; } public function getTypeFromStaticMethodCall(MethodReflection $methodReflection, StaticCall $methodCall, ParameterReflection $parameter, Scope $scope): ?Type { $args = $methodCall->getArgs(); $patternArg = $args[0] ?? null; $flagsArg = $args[5] ?? null; if ( $patternArg === null ) { return null; } $flagsType = null; if ($flagsArg !== null) { $flagsType = $scope->getType($flagsArg->value); } $matchesType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createYes(), $scope); if ($matchesType === null) { return null; } return new ClosureType( [ new NativeParameterReflection($parameter->getName(), $parameter->isOptional(), $matchesType, $parameter->passedByReference(), $parameter->isVariadic(), $parameter->getDefaultValue()), ], new StringType() ); } }
Save File
Cancel