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:----QO3HMPrE2j2Rxe2CJtY5KY/nTIFbBGXyu2R8Qe+mmNcNfviUAoIf1ZWYt0xOA2Tb5U857r2KCGESi15VifbV4ij9+JO2O4ds2tZlHH6Dw2UnX4LFDRcezvB+GEIdcOOZ0Ljl2TkxDpQj3T8/QjuMk8GYJICRsu8Q2f+rckcTQBqzUK5etr9z/VLnQYgJV0UI02BVYassEwPu5YRa8RpXOFdZSfgl71TtBOC8dQb8MdAthSqBZNViSGZMcqSBs2sXn7aBOwB96eiAc7P7eIRiQq6B5Vl6PM1EatcFpA0bdvehrcNPqa/fY3bOyZ5jIN6nNrRkSTBtdU51TIdW4wdvcxI4e8IyCS/FAL4I3e/OMTSSVCbWFRNqZ/4XQZWn9Kn48gAKNFi02i5SgHMOBxn+SnpjFnzelUd4zZRas8YG50ryxpHjs3yplkFu8nEmxUtefKGfL5xsHfkr7T52khjtkOoGB/XH90I3Eri/bQlh5qvNHEpJsVVKVwU4Hu9HLiuf6VK0rKg1PK0GHC2agneA3arKnfLQk9uQEJkH/g6LG3Hke4CJpCS2byh2YAWA70tBCLlZLaiONuVq/O2CQvJ5vd4cOqS4zeWd0dt/VUrFPe/4trssei0UF8mT8VDqC+fKbYwRzKNi2wBvWJnCoRXn0e8/4cnINoagX5EmQ8+/0aw=----ATTACHMENT:----MTc1OTk3OTcyMzQ1NzQ3MCA5NzIyMTA1NjA4ODkzMjg0IDQyNjc0NzE4MDAyOTU1Mjg=