@@ -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,13 @@ 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 instanceof Node \Expr \Variable
271+ && is_string ($ closureBindToVar ->name )
272+ ) {
273+ $ varType = $ scope ->getType ($ closureBindToVar );
274+ if ((new ObjectType (Closure::class))->isSuperTypeOf ($ varType )->yes ()) {
320275 $ inFunction = $ scope ->getFunction ();
321276 if ($ inFunction !== null ) {
322277 $ closureThisParameters = [];
@@ -326,23 +281,23 @@ public static function selectFromArgs(
326281 }
327282 $ closureThisParameters [$ parameter ->getName ()] = $ parameter ->getClosureThisType ();
328283 }
329- if (array_key_exists ($ closureVarName , $ closureThisParameters )) {
330- if ($ scope ->hasExpressionType (new ParameterVariableOriginalValueExpr ($ closureVarName ))->yes ()) {
284+ if (array_key_exists ($ closureBindToVar -> name , $ closureThisParameters )) {
285+ if ($ scope ->hasExpressionType (new ParameterVariableOriginalValueExpr ($ closureBindToVar -> name ))->yes ()) {
331286 $ acceptor = $ parametersAcceptors [0 ];
332287 $ 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 (),
288+ $ parameters [0 ] = new NativeParameterReflection (
289+ $ parameters [0 ]->getName (),
290+ $ parameters [0 ]->isOptional (),
291+ $ closureThisParameters [$ closureBindToVar -> name ],
292+ $ parameters [0 ]->passedByReference (),
293+ $ parameters [0 ]->isVariadic (),
294+ $ parameters [0 ]->getDefaultValue (),
340295 );
341296 $ parametersAcceptors = [
342297 new FunctionVariant (
343298 $ acceptor ->getTemplateTypeMap (),
344299 $ acceptor ->getResolvedTemplateTypeMap (),
345- array_values ( $ parameters) ,
300+ $ parameters ,
346301 $ acceptor ->isVariadic (),
347302 $ acceptor ->getReturnType (),
348303 $ acceptor instanceof ExtendedParametersAcceptor ? $ acceptor ->getCallSiteVarianceMap () : TemplateTypeVarianceMap::createEmpty (),
@@ -353,6 +308,48 @@ public static function selectFromArgs(
353308 }
354309 }
355310 }
311+
312+ if (
313+ $ args [0 ]->getAttribute (ClosureBindArgVisitor::ATTRIBUTE_NAME ) !== null
314+ && $ args [0 ]->value instanceof Node \Expr \Variable
315+ && is_string ($ args [0 ]->value ->name )
316+ ) {
317+ $ closureVarName = $ args [0 ]->value ->name ;
318+ $ inFunction = $ scope ->getFunction ();
319+ if ($ inFunction !== null ) {
320+ $ closureThisParameters = [];
321+ foreach ($ inFunction ->getParameters () as $ parameter ) {
322+ if ($ parameter ->getClosureThisType () === null ) {
323+ continue ;
324+ }
325+ $ closureThisParameters [$ parameter ->getName ()] = $ parameter ->getClosureThisType ();
326+ }
327+ if (array_key_exists ($ closureVarName , $ closureThisParameters )) {
328+ if ($ scope ->hasExpressionType (new ParameterVariableOriginalValueExpr ($ closureVarName ))->yes ()) {
329+ $ acceptor = $ parametersAcceptors [0 ];
330+ $ parameters = $ acceptor ->getParameters ();
331+ $ parameters [1 ] = new NativeParameterReflection (
332+ $ parameters [1 ]->getName (),
333+ $ parameters [1 ]->isOptional (),
334+ $ closureThisParameters [$ closureVarName ],
335+ $ parameters [1 ]->passedByReference (),
336+ $ parameters [1 ]->isVariadic (),
337+ $ parameters [1 ]->getDefaultValue (),
338+ );
339+ $ parametersAcceptors = [
340+ new FunctionVariant (
341+ $ acceptor ->getTemplateTypeMap (),
342+ $ acceptor ->getResolvedTemplateTypeMap (),
343+ array_values ($ parameters ),
344+ $ acceptor ->isVariadic (),
345+ $ acceptor ->getReturnType (),
346+ $ acceptor instanceof ExtendedParametersAcceptor ? $ acceptor ->getCallSiteVarianceMap () : TemplateTypeVarianceMap::createEmpty (),
347+ ),
348+ ];
349+ }
350+ }
351+ }
352+ }
356353 }
357354
358355 if (count ($ parametersAcceptors ) === 1 ) {
0 commit comments