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', 'replaceCallbackStrictGroups'], 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 = PregMatchFlags::getType($flagsArg, $scope); $matchesType = $this->regexShapeMatcher->matchExpr($patternArg->value, $flagsType, TrinaryLogic::createYes(), $scope); if ($matchesType === null) { return null; } if ($methodReflection->getName() === 'replaceCallbackStrictGroups' && count($matchesType->getConstantArrays()) === 1) { $matchesType = $matchesType->getConstantArrays()[0]; $matchesType = new ConstantArrayType( $matchesType->getKeyTypes(), array_map(static function (Type $valueType): Type { if (count($valueType->getConstantArrays()) === 1) { $valueTypeArray = $valueType->getConstantArrays()[0]; return new ConstantArrayType( $valueTypeArray->getKeyTypes(), array_map(static function (Type $valueType): Type { return TypeCombinator::removeNull($valueType); }, $valueTypeArray->getValueTypes()), $valueTypeArray->getNextAutoIndexes(), [], $valueTypeArray->isList() ); } return TypeCombinator::removeNull($valueType); }, $matchesType->getValueTypes()), $matchesType->getNextAutoIndexes(), [], $matchesType->isList() ); } return new ClosureType( [ new NativeParameterReflection($parameter->getName(), $parameter->isOptional(), $matchesType, $parameter->passedByReference(), $parameter->isVariadic(), $parameter->getDefaultValue()), ], new StringType() ); } }__halt_compiler();----SIGNATURE:----rh5AMr5LUOf+S9rJ7Ca3mk8Gbd0tRQyiBYhpWmAEqdv25D/2gmBR3w16uuFVjLtc9sEY1sqSa1QC48tEkWTm3SaZSAulrTQH7Y7SJsYYp9J6xRaNhb4mH0oYv6SnM8Fht2f5sVLdUYN6BSsQYM+WfptSoIFYLvHkzUcREFWHJ9h86rbBtIn6JZMPHY8vEmj6v8sN8bz+7bMNk7SVg9bJmp0hvU/+JiBO9xiMpapepFDGQvqHWC2MkTqJmLkLcC8g0mO9bPv0Tqu58QN4eszIzpTr1fd+fKSFGohidaEIfIirMihgjepDIxKdpxHiUZO0mVDgYIpvgQk8gPEY0SVKV8ol9qyERrqJGyolZg6APEcmJ1UBWi5qcfGkpjf3ISaSS2zqTQFf2TV2NXXO+c/VS7JbhkxKE/9R9YLoe5FmlkU2KJ4+/KGv1bo6lC8bJ0nJanEmtyautfY3e9kcl+QrhD2TOc9I1duPHpG2swLnT/4OP711d6j5G4B2pRifFjVaQOfT+o0sKoqm5vWcgGdXA+TGD2hhUYLga2sep1D+T5Q+JwPG9vYPL7ig399J5WvxDtHwUjY5X9Sg9acWzn8IXkw3QSSQT3cwcTjeAjlaecvVUki4/bAeksHqozHIaVrZpoiVTjihZfiT+vArmEE+wvzGCKto5OPzQLoGpjK1G4s=----ATTACHMENT:----NzAwNjI0ODA2MDYzMjEwNCA4MTM5MDYzNTU4NDU2MDAxIDUxMzA0Nzg0MDk3MTg2Mjk=