@@ -155,7 +155,7 @@ public static function selectFromArgs(
155155 }
156156 }
157157
158- if (isset ( $ args [ 0 ]) && (bool ) $ args [0 ]->getAttribute (ArrayFilterArgVisitor::ATTRIBUTE_NAME )) {
158+ if ((bool ) $ args [0 ]->getAttribute (ArrayFilterArgVisitor::ATTRIBUTE_NAME )) {
159159 if (isset ($ args [2 ])) {
160160 $ mode = $ scope ->getType ($ args [2 ]->value );
161161 if ($ mode instanceof ConstantIntegerType) {
@@ -203,7 +203,7 @@ public static function selectFromArgs(
203203 ];
204204 }
205205
206- if (isset ( $ args [ 0 ]) && (bool ) $ args [0 ]->getAttribute (ArrayWalkArgVisitor::ATTRIBUTE_NAME )) {
206+ if ((bool ) $ args [0 ]->getAttribute (ArrayWalkArgVisitor::ATTRIBUTE_NAME )) {
207207 $ arrayWalkParameters = [
208208 new DummyParameter ('item ' , $ scope ->getIterableValueType ($ scope ->getType ($ args [0 ]->value )), false , PassedByReference::createReadsArgument (), false , null ),
209209 new DummyParameter ('key ' , $ scope ->getIterableKeyType ($ scope ->getType ($ args [0 ]->value )), false , PassedByReference::createNo (), false , null ),
@@ -234,7 +234,7 @@ public static function selectFromArgs(
234234 ];
235235 }
236236
237- if (isset ( $ args [ 0 ]) && (bool ) $ args [0 ]->getAttribute (ArrayFindArgVisitor::ATTRIBUTE_NAME )) {
237+ if ((bool ) $ args [0 ]->getAttribute (ArrayFindArgVisitor::ATTRIBUTE_NAME )) {
238238 $ acceptor = $ parametersAcceptors [0 ];
239239 $ parameters = $ acceptor ->getParameters ();
240240 $ argType = $ scope ->getType ($ args [0 ]->value );
@@ -265,58 +265,14 @@ public static function selectFromArgs(
265265 ];
266266 }
267267
268- if (isset ($ args [0 ])) {
269- $ closureBindToVar = $ args [0 ]->getAttribute (ClosureBindToVarVisitor::ATTRIBUTE_NAME );
270- if (
271- $ closureBindToVar !== null
272- && $ closureBindToVar instanceof Node \Expr \Variable
273- && is_string ($ closureBindToVar ->name )
274- ) {
275- $ varType = $ scope ->getType ($ closureBindToVar );
276- if ((new ObjectType (Closure::class))->isSuperTypeOf ($ varType )->yes ()) {
277- $ inFunction = $ scope ->getFunction ();
278- if ($ inFunction !== null ) {
279- $ closureThisParameters = [];
280- foreach ($ inFunction ->getParameters () as $ parameter ) {
281- if ($ parameter ->getClosureThisType () === null ) {
282- continue ;
283- }
284- $ closureThisParameters [$ parameter ->getName ()] = $ parameter ->getClosureThisType ();
285- }
286- if (array_key_exists ($ closureBindToVar ->name , $ closureThisParameters )) {
287- if ($ scope ->hasExpressionType (new ParameterVariableOriginalValueExpr ($ closureBindToVar ->name ))->yes ()) {
288- $ acceptor = $ parametersAcceptors [0 ];
289- $ parameters = $ acceptor ->getParameters ();
290- $ parameters [0 ] = new NativeParameterReflection (
291- $ parameters [0 ]->getName (),
292- $ parameters [0 ]->isOptional (),
293- $ closureThisParameters [$ closureBindToVar ->name ],
294- $ parameters [0 ]->passedByReference (),
295- $ parameters [0 ]->isVariadic (),
296- $ parameters [0 ]->getDefaultValue (),
297- );
298- $ parametersAcceptors = [
299- new FunctionVariant (
300- $ acceptor ->getTemplateTypeMap (),
301- $ acceptor ->getResolvedTemplateTypeMap (),
302- $ parameters ,
303- $ acceptor ->isVariadic (),
304- $ acceptor ->getReturnType (),
305- $ acceptor instanceof ExtendedParametersAcceptor ? $ acceptor ->getCallSiteVarianceMap () : TemplateTypeVarianceMap::createEmpty (),
306- ),
307- ];
308- }
309- }
310- }
311- }
312- }
313-
314- if (
315- $ args [0 ]->getAttribute (ClosureBindArgVisitor::ATTRIBUTE_NAME ) !== null
316- && $ args [0 ]->value instanceof Node \Expr \Variable
317- && is_string ($ args [0 ]->value ->name )
318- ) {
319- $ closureVarName = $ args [0 ]->value ->name ;
268+ $ closureBindToVar = $ args [0 ]->getAttribute (ClosureBindToVarVisitor::ATTRIBUTE_NAME );
269+ if (
270+ $ closureBindToVar !== null
271+ && $ closureBindToVar instanceof Node \Expr \Variable
272+ && is_string ($ closureBindToVar ->name )
273+ ) {
274+ $ varType = $ scope ->getType ($ closureBindToVar );
275+ if ((new ObjectType (Closure::class))->isSuperTypeOf ($ varType )->yes ()) {
320276 $ inFunction = $ scope ->getFunction ();
321277 if ($ inFunction !== null ) {
322278 $ closureThisParameters = [];
@@ -326,23 +282,23 @@ public static function selectFromArgs(
326282 }
327283 $ closureThisParameters [$ parameter ->getName ()] = $ parameter ->getClosureThisType ();
328284 }
329- if (array_key_exists ($ closureVarName , $ closureThisParameters )) {
330- if ($ scope ->hasExpressionType (new ParameterVariableOriginalValueExpr ($ closureVarName ))->yes ()) {
285+ if (array_key_exists ($ closureBindToVar -> name , $ closureThisParameters )) {
286+ if ($ scope ->hasExpressionType (new ParameterVariableOriginalValueExpr ($ closureBindToVar -> name ))->yes ()) {
331287 $ acceptor = $ parametersAcceptors [0 ];
332288 $ parameters = $ acceptor ->getParameters ();
333- $ parameters [1 ] = new NativeParameterReflection (
334- $ parameters [1 ]->getName (),
335- $ parameters [1 ]->isOptional (),
336- $ closureThisParameters [$ closureVarName ],
337- $ parameters [1 ]->passedByReference (),
338- $ parameters [1 ]->isVariadic (),
339- $ parameters [1 ]->getDefaultValue (),
289+ $ parameters [0 ] = new NativeParameterReflection (
290+ $ parameters [0 ]->getName (),
291+ $ parameters [0 ]->isOptional (),
292+ $ closureThisParameters [$ closureBindToVar -> name ],
293+ $ parameters [0 ]->passedByReference (),
294+ $ parameters [0 ]->isVariadic (),
295+ $ parameters [0 ]->getDefaultValue (),
340296 );
341297 $ parametersAcceptors = [
342298 new FunctionVariant (
343299 $ acceptor ->getTemplateTypeMap (),
344300 $ acceptor ->getResolvedTemplateTypeMap (),
345- array_values ( $ parameters) ,
301+ $ parameters ,
346302 $ acceptor ->isVariadic (),
347303 $ acceptor ->getReturnType (),
348304 $ acceptor instanceof ExtendedParametersAcceptor ? $ acceptor ->getCallSiteVarianceMap () : TemplateTypeVarianceMap::createEmpty (),
@@ -353,6 +309,48 @@ public static function selectFromArgs(
353309 }
354310 }
355311 }
312+
313+ if (
314+ $ args [0 ]->getAttribute (ClosureBindArgVisitor::ATTRIBUTE_NAME ) !== null
315+ && $ args [0 ]->value instanceof Node \Expr \Variable
316+ && is_string ($ args [0 ]->value ->name )
317+ ) {
318+ $ closureVarName = $ args [0 ]->value ->name ;
319+ $ inFunction = $ scope ->getFunction ();
320+ if ($ inFunction !== null ) {
321+ $ closureThisParameters = [];
322+ foreach ($ inFunction ->getParameters () as $ parameter ) {
323+ if ($ parameter ->getClosureThisType () === null ) {
324+ continue ;
325+ }
326+ $ closureThisParameters [$ parameter ->getName ()] = $ parameter ->getClosureThisType ();
327+ }
328+ if (array_key_exists ($ closureVarName , $ closureThisParameters )) {
329+ if ($ scope ->hasExpressionType (new ParameterVariableOriginalValueExpr ($ closureVarName ))->yes ()) {
330+ $ acceptor = $ parametersAcceptors [0 ];
331+ $ parameters = $ acceptor ->getParameters ();
332+ $ parameters [1 ] = new NativeParameterReflection (
333+ $ parameters [1 ]->getName (),
334+ $ parameters [1 ]->isOptional (),
335+ $ closureThisParameters [$ closureVarName ],
336+ $ parameters [1 ]->passedByReference (),
337+ $ parameters [1 ]->isVariadic (),
338+ $ parameters [1 ]->getDefaultValue (),
339+ );
340+ $ parametersAcceptors = [
341+ new FunctionVariant (
342+ $ acceptor ->getTemplateTypeMap (),
343+ $ acceptor ->getResolvedTemplateTypeMap (),
344+ array_values ($ parameters ),
345+ $ acceptor ->isVariadic (),
346+ $ acceptor ->getReturnType (),
347+ $ acceptor instanceof ExtendedParametersAcceptor ? $ acceptor ->getCallSiteVarianceMap () : TemplateTypeVarianceMap::createEmpty (),
348+ ),
349+ ];
350+ }
351+ }
352+ }
353+ }
356354 }
357355
358356 if (count ($ parametersAcceptors ) === 1 ) {
0 commit comments