@@ -247,6 +247,7 @@ public function specifyTypesInCondition(
247247 if (
248248 $ expr ->left instanceof FuncCall
249249 && $ expr ->left ->name instanceof Name
250+ && !$ expr ->left ->isFirstClassCallable ()
250251 && in_array (strtolower ((string ) $ expr ->left ->name ), ['count ' , 'sizeof ' , 'strlen ' , 'mb_strlen ' , 'preg_match ' ], true )
251252 && count ($ expr ->left ->getArgs ()) >= 1
252253 && (
@@ -275,6 +276,7 @@ public function specifyTypesInCondition(
275276 !$ context ->null ()
276277 && $ expr ->right instanceof FuncCall
277278 && $ expr ->right ->name instanceof Name
279+ && !$ expr ->right ->isFirstClassCallable ()
278280 && in_array (strtolower ((string ) $ expr ->right ->name ), ['count ' , 'sizeof ' ], true )
279281 && count ($ expr ->right ->getArgs ()) >= 1
280282 && $ leftType ->isInteger ()->yes ()
@@ -378,6 +380,7 @@ public function specifyTypesInCondition(
378380 && $ expr ->right instanceof Expr \BinaryOp \Minus
379381 && $ expr ->right ->left instanceof FuncCall
380382 && $ expr ->right ->left ->name instanceof Name
383+ && !$ expr ->right ->left ->isFirstClassCallable ()
381384 && in_array (strtolower ((string ) $ expr ->right ->left ->name ), ['count ' , 'sizeof ' ], true )
382385 && count ($ expr ->right ->left ->getArgs ()) >= 1
383386 // constant offsets are handled via HasOffsetType/HasOffsetValueType
@@ -404,6 +407,7 @@ public function specifyTypesInCondition(
404407 !$ context ->null ()
405408 && $ expr ->right instanceof FuncCall
406409 && $ expr ->right ->name instanceof Name
410+ && !$ expr ->right ->isFirstClassCallable ()
407411 && in_array (strtolower ((string ) $ expr ->right ->name ), ['preg_match ' ], true )
408412 && count ($ expr ->right ->getArgs ()) >= 3
409413 && (
@@ -421,6 +425,7 @@ public function specifyTypesInCondition(
421425 !$ context ->null ()
422426 && $ expr ->right instanceof FuncCall
423427 && $ expr ->right ->name instanceof Name
428+ && !$ expr ->right ->isFirstClassCallable ()
424429 && in_array (strtolower ((string ) $ expr ->right ->name ), ['strlen ' , 'mb_strlen ' ], true )
425430 && count ($ expr ->right ->getArgs ()) === 1
426431 && $ leftType ->isInteger ()->yes ()
@@ -825,6 +830,7 @@ public function specifyTypesInCondition(
825830 if (
826831 $ expr ->expr instanceof FuncCall
827832 && $ expr ->expr ->name instanceof Name
833+ && !$ expr ->expr ->isFirstClassCallable ()
828834 && in_array ($ expr ->expr ->name ->toLowerString (), ['array_key_first ' , 'array_key_last ' ], true )
829835 && count ($ expr ->expr ->getArgs ()) >= 1
830836 ) {
@@ -881,6 +887,7 @@ public function specifyTypesInCondition(
881887 if (
882888 $ expr ->expr instanceof FuncCall
883889 && $ expr ->expr ->name instanceof Name
890+ && !$ expr ->expr ->isFirstClassCallable ()
884891 && in_array ($ expr ->expr ->name ->toLowerString (), ['array_rand ' ], true )
885892 && count ($ expr ->expr ->getArgs ()) >= 1
886893 ) {
@@ -911,6 +918,7 @@ public function specifyTypesInCondition(
911918 $ expr ->expr instanceof Expr \BinaryOp \Minus
912919 && $ expr ->expr ->left instanceof FuncCall
913920 && $ expr ->expr ->left ->name instanceof Name
921+ && !$ expr ->expr ->left ->isFirstClassCallable ()
914922 && $ expr ->expr ->right instanceof Node \Scalar \Int_
915923 && $ expr ->expr ->right ->value === 1
916924 && in_array ($ expr ->expr ->left ->name ->toLowerString (), ['count ' , 'sizeof ' ], true )
@@ -938,6 +946,7 @@ public function specifyTypesInCondition(
938946 if (
939947 $ expr ->expr instanceof FuncCall
940948 && $ expr ->expr ->name instanceof Name
949+ && !$ expr ->expr ->isFirstClassCallable ()
941950 && $ expr ->expr ->name ->toLowerString () === 'array_search '
942951 && count ($ expr ->expr ->getArgs ()) >= 2
943952 ) {
@@ -1596,6 +1605,7 @@ private function specifyTypesForConstantStringBinaryExpression(
15961605 if (
15971606 $ exprNode instanceof FuncCall
15981607 && $ exprNode ->name instanceof Name
1608+ && !$ exprNode ->isFirstClassCallable ()
15991609 && strtolower ($ exprNode ->name ->toString ()) === 'gettype '
16001610 && isset ($ exprNode ->getArgs ()[0 ])
16011611 ) {
@@ -1636,6 +1646,7 @@ private function specifyTypesForConstantStringBinaryExpression(
16361646 $ context ->true ()
16371647 && $ exprNode instanceof FuncCall
16381648 && $ exprNode ->name instanceof Name
1649+ && !$ exprNode ->isFirstClassCallable ()
16391650 && strtolower ((string ) $ exprNode ->name ) === 'get_parent_class '
16401651 && isset ($ exprNode ->getArgs ()[0 ])
16411652 ) {
@@ -1673,6 +1684,7 @@ private function specifyTypesForConstantStringBinaryExpression(
16731684 $ context ->false ()
16741685 && $ exprNode instanceof FuncCall
16751686 && $ exprNode ->name instanceof Name
1687+ && !$ exprNode ->isFirstClassCallable ()
16761688 && in_array (strtolower ((string ) $ exprNode ->name ), [
16771689 'trim ' , 'ltrim ' , 'rtrim ' , 'chop ' ,
16781690 'mb_trim ' , 'mb_ltrim ' , 'mb_rtrim ' ,
@@ -2750,6 +2762,7 @@ public function resolveEqual(Expr\BinaryOp\Equal $expr, Scope $scope, TypeSpecif
27502762 if (
27512763 $ exprNode instanceof FuncCall
27522764 && $ exprNode ->name instanceof Name
2765+ && !$ exprNode ->isFirstClassCallable ()
27532766 && in_array (strtolower ($ exprNode ->name ->toString ()), ['gettype ' , 'get_class ' , 'get_debug_type ' ], true )
27542767 && isset ($ exprNode ->getArgs ()[0 ])
27552768 && $ constantType ->isString ()->yes ()
@@ -2897,6 +2910,7 @@ private function resolveNormalizedIdentical(Expr\BinaryOp\Identical $expr, Scope
28972910 if (
28982911 !$ context ->null ()
28992912 && $ unwrappedLeftExpr instanceof FuncCall
2913+ && !$ unwrappedLeftExpr ->isFirstClassCallable ()
29002914 && count ($ unwrappedLeftExpr ->getArgs ()) >= 1
29012915 && $ unwrappedLeftExpr ->name instanceof Name
29022916 && in_array (strtolower ((string ) $ unwrappedLeftExpr ->name ), ['count ' , 'sizeof ' ], true )
@@ -2907,6 +2921,7 @@ private function resolveNormalizedIdentical(Expr\BinaryOp\Identical $expr, Scope
29072921 $ context ->true ()
29082922 && $ unwrappedRightExpr instanceof FuncCall
29092923 && $ unwrappedRightExpr ->name instanceof Name
2924+ && !$ unwrappedRightExpr ->isFirstClassCallable ()
29102925 && in_array ($ unwrappedRightExpr ->name ->toLowerString (), ['count ' , 'sizeof ' ], true )
29112926 && count ($ unwrappedRightExpr ->getArgs ()) >= 1
29122927 ) {
@@ -2981,9 +2996,10 @@ private function resolveNormalizedIdentical(Expr\BinaryOp\Identical $expr, Scope
29812996 if (
29822997 !$ context ->null ()
29832998 && $ unwrappedLeftExpr instanceof FuncCall
2984- && count ($ unwrappedLeftExpr ->getArgs ()) === 1
29852999 && $ unwrappedLeftExpr ->name instanceof Name
3000+ && !$ unwrappedLeftExpr ->isFirstClassCallable ()
29863001 && in_array (strtolower ((string ) $ unwrappedLeftExpr ->name ), ['strlen ' , 'mb_strlen ' ], true )
3002+ && count ($ unwrappedLeftExpr ->getArgs ()) === 1
29873003 && $ rightType ->isInteger ()->yes ()
29883004 ) {
29893005 if (IntegerRangeType::fromInterval (null , -1 )->isSuperTypeOf ($ rightType )->yes ()) {
@@ -3019,6 +3035,7 @@ private function resolveNormalizedIdentical(Expr\BinaryOp\Identical $expr, Scope
30193035 if (
30203036 $ unwrappedLeftExpr instanceof FuncCall
30213037 && $ unwrappedLeftExpr ->name instanceof Name
3038+ && !$ unwrappedLeftExpr ->isFirstClassCallable ()
30223039 && in_array ($ unwrappedLeftExpr ->name ->toLowerString (), ['array_key_first ' , 'array_key_last ' ], true )
30233040 && isset ($ unwrappedLeftExpr ->getArgs ()[0 ])
30243041 && $ rightType ->isNull ()->yes ()
@@ -3050,6 +3067,7 @@ private function resolveNormalizedIdentical(Expr\BinaryOp\Identical $expr, Scope
30503067 $ context ->true ()
30513068 && $ unwrappedLeftExpr instanceof FuncCall
30523069 && $ unwrappedLeftExpr ->name instanceof Name
3070+ && !$ unwrappedLeftExpr ->isFirstClassCallable ()
30533071 && in_array (strtolower ($ unwrappedLeftExpr ->name ->toString ()), ['get_class ' , 'get_debug_type ' ], true )
30543072 && isset ($ unwrappedLeftExpr ->getArgs ()[0 ])
30553073 ) {
@@ -3075,6 +3093,7 @@ private function resolveNormalizedIdentical(Expr\BinaryOp\Identical $expr, Scope
30753093 $ context ->truthy ()
30763094 && $ unwrappedLeftExpr instanceof FuncCall
30773095 && $ unwrappedLeftExpr ->name instanceof Name
3096+ && !$ unwrappedLeftExpr ->isFirstClassCallable ()
30783097 && in_array (strtolower ($ unwrappedLeftExpr ->name ->toString ()), [
30793098 'substr ' , 'strstr ' , 'stristr ' , 'strchr ' , 'strrchr ' , 'strtolower ' , 'strtoupper ' , 'ucfirst ' , 'lcfirst ' ,
30803099 'mb_substr ' , 'mb_strstr ' , 'mb_stristr ' , 'mb_strchr ' , 'mb_strrchr ' , 'mb_strtolower ' , 'mb_strtoupper ' , 'mb_ucfirst ' , 'mb_lcfirst ' ,
0 commit comments