1010use PhpParser \Node \Expr \New_ ;
1111use PhpParser \Node \Expr \Ternary ;
1212use PhpParser \Node \Name \FullyQualified ;
13+ use PhpParser \NodeTraverser ;
1314use PHPStan \Type \Type ;
1415use Rector \NodeAnalyzer \ArgsAnalyzer ;
16+ use Rector \PhpParser \Node \BetterNodeFinder ;
1517use Rector \Rector \AbstractRector ;
1618use Symplify \RuleDocGenerator \ValueObject \CodeSample \CodeSample ;
1719use Symplify \RuleDocGenerator \ValueObject \RuleDefinition ;
2628final class DowngradeIteratorCountToArrayRector extends AbstractRector
2729{
2830 public function __construct (
29- private readonly ArgsAnalyzer $ argsAnalyzer
31+ private readonly ArgsAnalyzer $ argsAnalyzer ,
32+ private readonly BetterNodeFinder $ betterNodeFinder
3033 ) {
3134 }
3235
@@ -35,7 +38,7 @@ public function __construct(
3538 */
3639 public function getNodeTypes (): array
3740 {
38- return [FuncCall::class];
41+ return [Ternary::class, FuncCall::class];
3942 }
4043
4144 public function getRuleDefinition (): RuleDefinition
@@ -63,10 +66,23 @@ function test(array|Traversable $data) {
6366 }
6467
6568 /**
66- * @param FuncCall $node
69+ * @param Ternary| FuncCall $node
6770 */
68- public function refactor (Node $ node ): ? Node
71+ public function refactor (Node $ node ): null | FuncCall | int
6972 {
73+ if ($ node instanceof Ternary) {
74+ $ hasIsArrayCheck = (bool ) $ this ->betterNodeFinder ->findFirst (
75+ $ node ,
76+ fn (Node $ subNode ): bool => $ subNode instanceof FuncCall && $ this ->isName ($ subNode , 'is_array ' )
77+ );
78+
79+ if ($ hasIsArrayCheck ) {
80+ return NodeTraverser::DONT_TRAVERSE_CHILDREN ;
81+ }
82+
83+ return null ;
84+ }
85+
7086 if (! $ this ->isNames ($ node , ['iterator_count ' , 'iterator_to_array ' ])) {
7187 return null ;
7288 }
0 commit comments