src/Fixer/FunctionNotation/CombineNestedDirnameFixer.php
private function getDirnameInfo(Tokens $tokens, $index, $firstArgumentEndIndex = null)
    {
        if (!$tokens[$index]->equals([T_STRING, 'dirname'], false)) {
            return false;
        }

        if (!(new FunctionsAnalyzer())->isGlobalFunctionCall($tokens, $index)) {
            return false;
        }

        $info['indexes'] = [];

        $prev = $tokens->getPrevMeaningfulToken($index);

        if ($tokens[$prev]->isGivenKind(T_NS_SEPARATOR)) {
            $info['indexes'][] = $prev;
        }

        $info['indexes'][] = $index;

        // opening parenthesis "("
        $next = $tokens->getNextMeaningfulToken($index);
        $info['indexes'][] = $next;

        if (null !== $firstArgumentEndIndex) {
            $next = $tokens->getNextMeaningfulToken($firstArgumentEndIndex);
        } else {
            $next = $tokens->getNextMeaningfulToken($next);

            if ($tokens[$next]->equals(')')) {
                return false;
            }

            while (!$tokens[$next]->equalsAny([',', ')'])) {
                $blockType = Tokens::detectBlockType($tokens[$next]);

                if ($blockType) {
                    $next = $tokens->findBlockEnd($blockType['type'], $next);
                }

                $next = $tokens->getNextMeaningfulToken($next);
            }
        }

        $info['indexes'][] = $next;

        if ($tokens[$next]->equals(',')) {
            $next = $tokens->getNextMeaningfulToken($next);
            $info['indexes'][] = $next;
        }

        if ($tokens[$next]->equals(')')) {
            $info['levels'] = 1;
            $info['end'] = $next;

            return $info;
        }

        if (!$tokens[$next]->isGivenKind(T_LNUMBER)) {
            return false;
        }

        $info['secondArgument'] = $next;
        $info['levels'] = (int) $tokens[$next]->getContent();

        $next = $tokens->getNextMeaningfulToken($next);

        if ($tokens[$next]->equals(',')) {
            $info['indexes'][] = $next;
            $next = $tokens->getNextMeaningfulToken($next);
        }

        if (!$tokens[$next]->equals(')')) {
            return false;
        }

        $info['indexes'][] = $next;
        $info['end'] = $next;

        return $info;
    }
private function getDirnameInfo(Tokens $tokens, $index, $firstArgumentEndIndex = null)
    {
        if (!$tokens[$index]->equals([T_STRING, 'dirname'], false)) {
            return false;
        }

        if (!(new FunctionsAnalyzer())->isGlobalFunctionCall($tokens, $index)) {
            return false;
        }

        $info['indexes'] = [];

        $prev = $tokens->getPrevMeaningfulToken($index);

        if ($tokens[$prev]->isGivenKind(T_NS_SEPARATOR)) {
            $info['indexes'][] = $prev;
        }

        $info['indexes'][] = $index;

        // opening parenthesis "("
        $next = $tokens->getNextMeaningfulToken($index);
        $info['indexes'][] = $next;

        if (null !== $firstArgumentEndIndex) {
            $next = $tokens->getNextMeaningfulToken($firstArgumentEndIndex);
        } else {
            $next = $tokens->getNextMeaningfulToken($next);

            if ($tokens[$next]->equals(')')) {
                return false;
            }

            while (!$tokens[$next]->equalsAny([',', ')'])) {
                $blockType = Tokens::detectBlockType($tokens[$next]);

                if ($blockType) {
                    $next = $tokens->findBlockEnd($blockType['type'], $next);
                }

                $next = $tokens->getNextMeaningfulToken($next);
            }
        }

        $info['indexes'][] = $next;

        if ($tokens[$next]->equals(',')) {
            $next = $tokens->getNextMeaningfulToken($next);
            $info['indexes'][] = $next;
        }

        if ($tokens[$next]->equals(')')) {
            $info['levels'] = 1;
            $info['end'] = $next;

            return $info;
        }

        if (!$tokens[$next]->isGivenKind(T_LNUMBER)) {
            return false;
        }

        $info['secondArgument'] = $next;
        $info['levels'] = (int) $tokens[$next]->getContent();

        $next = $tokens->getNextMeaningfulToken($next);

        if ($tokens[$next]->equals(',')) {
            $info['indexes'][] = $next;
            $next = $tokens->getNextMeaningfulToken($next);
        }

        if (!$tokens[$next]->equals(')')) {
            return false;
        }

        $info['indexes'][] = $next;
        $info['end'] = $next;

        return $info;
    }
private function getDirnameInfo ( Tokens $ tokens , $ index , $ firstArgumentEndIndex = null ) { if ( ! $ tokens [ $ index ] -> equals ( [ T_STRING , 'dirname' ] , false ) ) { return false ; } if ( ! ( new FunctionsAnalyzer ( ) ) -> isGlobalFunctionCall ( $ tokens , $ index ) ) { return false ; } $ info [ 'indexes' ] = [ ] ; $ prev = $ tokens -> getPrevMeaningfulToken ( $ index ) ; if ( $ tokens [ $ prev ] -> isGivenKind ( T_NS_SEPARATOR ) ) { $ info [ 'indexes' ] [ ] = $ prev ; } $ info [ 'indexes' ] [ ] = $ index ; // opening parenthesis "(" $ next = $ tokens -> getNextMeaningfulToken ( $ index ) ; $ info [ 'indexes' ] [ ] = $ next ; if ( null !== $ firstArgumentEndIndex ) { $ next = $ tokens -> getNextMeaningfulToken ( $ firstArgumentEndIndex ) ; } else { $ next = $ tokens -> getNextMeaningfulToken ( $ next ) ; if ( $ tokens [ $ next ] -> equals ( ')' ) ) { return false ; } while ( ! $ tokens [ $ next ] -> equalsAny ( [ ',' , ')' ] ) ) { $ blockType = Tokens :: detectBlockType ( $ tokens [ $ next ] ) ; if ( $ blockType ) { $ next = $ tokens -> findBlockEnd ( $ blockType [ 'type' ] , $ next ) ; } $ next = $ tokens -> getNextMeaningfulToken ( $ next ) ; } } $ info [ 'indexes' ] [ ] = $ next ; if ( $ tokens [ $ next ] -> equals ( ',' ) ) { $ next = $ tokens -> getNextMeaningfulToken ( $ next ) ; $ info [ 'indexes' ] [ ] = $ next ; } if ( $ tokens [ $ next ] -> equals ( ')' ) ) { $ info [ 'levels' ] = 1 ; $ info [ 'end' ] = $ next ; return $ info ; } if ( ! $ tokens [ $ next ] -> isGivenKind ( T_LNUMBER ) ) { return false ; } $ info [ 'secondArgument' ] = $ next ; $ info [ 'levels' ] = ( int ) $ tokens [ $ next ] -> getContent ( ) ; $ next = $ tokens -> getNextMeaningfulToken ( $ next ) ; if ( $ tokens [ $ next ] -> equals ( ',' ) ) { $ info [ 'indexes' ] [ ] = $ next ; $ next = $ tokens -> getNextMeaningfulToken ( $ next ) ; } if ( ! $ tokens [ $ next ] -> equals ( ')' ) ) { return false ; } $ info [ 'indexes' ] [ ] = $ next ; $ info [ 'end' ] = $ next ; return $ info ; }
@param Tokens   $tokens
@param int      $index                 Index of `dirname`
@param null|int $firstArgumentEndIndex Index of last token of first argument of `dirname` call

@return array|bool `false` when it is not a (supported) `dirname` call, an array with info about the dirname call otherwise
@param Tokens $tokens @param int $index Index of dirname @param null|int $firstArgumentEndIndex Index of last token of first argument of dirname call