public static function createFromDocComment(PhpToken $input, array $ignoredTags = [])
    {
        if (!$input->isGivenKind(T_DOC_COMMENT)) {
            throw new \InvalidArgumentException('Input must be a T_DOC_COMMENT token.');
        }

        $tokens = new self();

        $content = $input->getContent();
        $ignoredTextPosition = 0;
        $currentPosition = 0;
        while (false !== $nextAtPosition = strpos($content, '@', $currentPosition)) {
            if (0 !== $nextAtPosition && !Preg::match('/\s/', $content[$nextAtPosition - 1])) {
                $currentPosition = $nextAtPosition + 1;

                continue;
            }

            $lexer = new DocLexer();
            $lexer->setInput(substr($content, $nextAtPosition));

            $scannedTokens = [];
            $index = 0;
            $nbScannedTokensToUse = 0;
            $nbScopes = 0;
            while (null !== $token = $lexer->peek()) {
                if (0 === $index && DocLexer::T_AT !== $token['type']) {
                    break;
                }

                if (1 === $index) {
                    if (DocLexer::T_IDENTIFIER !== $token['type'] || \in_array($token['value'], $ignoredTags, true)) {
                        break;
                    }

                    $nbScannedTokensToUse = 2;
                }

                if ($index >= 2 && 0 === $nbScopes && !\in_array($token['type'], [DocLexer::T_NONE, DocLexer::T_OPEN_PARENTHESIS], true)) {
                    break;
                }

                $scannedTokens[] = $token;

                if (DocLexer::T_OPEN_PARENTHESIS === $token['type']) {
                    ++$nbScopes;
                } elseif (DocLexer::T_CLOSE_PARENTHESIS === $token['type']) {
                    if (0 === --$nbScopes) {
                        $nbScannedTokensToUse = \count($scannedTokens);

                        break;
                    }
                }

                ++$index;
            }

            if (0 !== $nbScopes) {
                break;
            }

            if (0 !== $nbScannedTokensToUse) {
                $ignoredTextLength = $nextAtPosition - $ignoredTextPosition;
                if (0 !== $ignoredTextLength) {
                    $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition, $ignoredTextLength));
                }

                $lastTokenEndIndex = 0;
                foreach (\array_slice($scannedTokens, 0, $nbScannedTokensToUse) as $token) {
                    if (DocLexer::T_STRING === $token['type']) {
                        $token['value'] = '"'.str_replace('"', '""', $token['value']).'"';
                    }

                    $missingTextLength = $token['position'] - $lastTokenEndIndex;
                    if ($missingTextLength > 0) {
                        $tokens[] = new Token(DocLexer::T_NONE, substr(
                            $content,
                            $nextAtPosition + $lastTokenEndIndex,
                            $missingTextLength
                        ));
                    }

                    $tokens[] = new Token($token['type'], $token['value']);
                    $lastTokenEndIndex = $token['position'] + \strlen($token['value']);
                }

                $currentPosition = $ignoredTextPosition = $nextAtPosition + $token['position'] + \strlen($token['value']);
            } else {
                $currentPosition = $nextAtPosition + 1;
            }
        }

        if ($ignoredTextPosition < \strlen($content)) {
            $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition));
        }

        return $tokens;
    }
public static function createFromDocComment(PhpToken $input, array $ignoredTags = [])
    {
        if (!$input->isGivenKind(T_DOC_COMMENT)) {
            throw new \InvalidArgumentException('Input must be a T_DOC_COMMENT token.');
        }

        $tokens = new self();

        $content = $input->getContent();
        $ignoredTextPosition = 0;
        $currentPosition = 0;
        while (false !== $nextAtPosition = strpos($content, '@', $currentPosition)) {
            if (0 !== $nextAtPosition && !Preg::match('/\s/', $content[$nextAtPosition - 1])) {
                $currentPosition = $nextAtPosition + 1;

                continue;
            }

            $lexer = new DocLexer();
            $lexer->setInput(substr($content, $nextAtPosition));

            $scannedTokens = [];
            $index = 0;
            $nbScannedTokensToUse = 0;
            $nbScopes = 0;
            while (null !== $token = $lexer->peek()) {
                if (0 === $index && DocLexer::T_AT !== $token['type']) {
                    break;
                }

                if (1 === $index) {
                    if (DocLexer::T_IDENTIFIER !== $token['type'] || \in_array($token['value'], $ignoredTags, true)) {
                        break;
                    }

                    $nbScannedTokensToUse = 2;
                }

                if ($index >= 2 && 0 === $nbScopes && !\in_array($token['type'], [DocLexer::T_NONE, DocLexer::T_OPEN_PARENTHESIS], true)) {
                    break;
                }

                $scannedTokens[] = $token;

                if (DocLexer::T_OPEN_PARENTHESIS === $token['type']) {
                    ++$nbScopes;
                } elseif (DocLexer::T_CLOSE_PARENTHESIS === $token['type']) {
                    if (0 === --$nbScopes) {
                        $nbScannedTokensToUse = \count($scannedTokens);

                        break;
                    }
                }

                ++$index;
            }

            if (0 !== $nbScopes) {
                break;
            }

            if (0 !== $nbScannedTokensToUse) {
                $ignoredTextLength = $nextAtPosition - $ignoredTextPosition;
                if (0 !== $ignoredTextLength) {
                    $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition, $ignoredTextLength));
                }

                $lastTokenEndIndex = 0;
                foreach (\array_slice($scannedTokens, 0, $nbScannedTokensToUse) as $token) {
                    if (DocLexer::T_STRING === $token['type']) {
                        $token['value'] = '"'.str_replace('"', '""', $token['value']).'"';
                    }

                    $missingTextLength = $token['position'] - $lastTokenEndIndex;
                    if ($missingTextLength > 0) {
                        $tokens[] = new Token(DocLexer::T_NONE, substr(
                            $content,
                            $nextAtPosition + $lastTokenEndIndex,
                            $missingTextLength
                        ));
                    }

                    $tokens[] = new Token($token['type'], $token['value']);
                    $lastTokenEndIndex = $token['position'] + \strlen($token['value']);
                }

                $currentPosition = $ignoredTextPosition = $nextAtPosition + $token['position'] + \strlen($token['value']);
            } else {
                $currentPosition = $nextAtPosition + 1;
            }
        }

        if ($ignoredTextPosition < \strlen($content)) {
            $tokens[] = new Token(DocLexer::T_NONE, substr($content, $ignoredTextPosition));
        }

        return $tokens;
    }
public static function createFromDocComment ( PhpToken $ input , array $ ignoredTags = [ ] ) { if ( ! $ input -> isGivenKind ( T_DOC_COMMENT ) ) { throw new \ InvalidArgumentException ( 'Input must be a T_DOC_COMMENT token.' ) ; } $ tokens = new self ( ) ; $ content = $ input -> getContent ( ) ; $ ignoredTextPosition = 0 ; $ currentPosition = 0 ; while ( false !== $ nextAtPosition = strpos ( $ content , '@' , $ currentPosition ) ) { if ( 0 !== $ nextAtPosition && ! Preg :: match ( '/\s/' , $ content [ $ nextAtPosition - 1 ] ) ) { $ currentPosition = $ nextAtPosition + 1 ; continue ; } $ lexer = new DocLexer ( ) ; $ lexer -> setInput ( substr ( $ content , $ nextAtPosition ) ) ; $ scannedTokens = [ ] ; $ index = 0 ; $ nbScannedTokensToUse = 0 ; $ nbScopes = 0 ; while ( null !== $ token = $ lexer -> peek ( ) ) { if ( 0 === $ index && DocLexer :: T_AT !== $ token [ 'type' ] ) { break ; } if ( 1 === $ index ) { if ( DocLexer :: T_IDENTIFIER !== $ token [ 'type' ] || \ in_array ( $ token [ 'value' ] , $ ignoredTags , true ) ) { break ; } $ nbScannedTokensToUse = 2 ; } if ( $ index >= 2 && 0 === $ nbScopes && ! \ in_array ( $ token [ 'type' ] , [ DocLexer :: T_NONE , DocLexer :: T_OPEN_PARENTHESIS ] , true ) ) { break ; } $ scannedTokens [ ] = $ token ; if ( DocLexer :: T_OPEN_PARENTHESIS === $ token [ 'type' ] ) { ++ $ nbScopes ; } elseif ( DocLexer :: T_CLOSE_PARENTHESIS === $ token [ 'type' ] ) { if ( 0 === -- $ nbScopes ) { $ nbScannedTokensToUse = \ count ( $ scannedTokens ) ; break ; } } ++ $ index ; } if ( 0 !== $ nbScopes ) { break ; } if ( 0 !== $ nbScannedTokensToUse ) { $ ignoredTextLength = $ nextAtPosition - $ ignoredTextPosition ; if ( 0 !== $ ignoredTextLength ) { $ tokens [ ] = new Token ( DocLexer :: T_NONE , substr ( $ content , $ ignoredTextPosition , $ ignoredTextLength ) ) ; } $ lastTokenEndIndex = 0 ; foreach ( \ array_slice ( $ scannedTokens , 0 , $ nbScannedTokensToUse ) as $ token ) { if ( DocLexer :: T_STRING === $ token [ 'type' ] ) { $ token [ 'value' ] = '"' . str_replace ( '"' , '""' , $ token [ 'value' ] ) . '"' ; } $ missingTextLength = $ token [ 'position' ] - $ lastTokenEndIndex ; if ( $ missingTextLength > 0 ) { $ tokens [ ] = new Token ( DocLexer :: T_NONE , substr ( $ content , $ nextAtPosition + $ lastTokenEndIndex , $ missingTextLength ) ) ; } $ tokens [ ] = new Token ( $ token [ 'type' ] , $ token [ 'value' ] ) ; $ lastTokenEndIndex = $ token [ 'position' ] + \ strlen ( $ token [ 'value' ] ) ; } $ currentPosition = $ ignoredTextPosition = $ nextAtPosition + $ token [ 'position' ] + \ strlen ( $ token [ 'value' ] ) ; } else { $ currentPosition = $ nextAtPosition + 1 ; } } if ( $ ignoredTextPosition < \ strlen ( $ content ) ) { $ tokens [ ] = new Token ( DocLexer :: T_NONE , substr ( $ content , $ ignoredTextPosition ) ) ; } return $ tokens ; }
@param PhpToken $input
@param string[] $ignoredTags

@throws \InvalidArgumentException

@return self
@param PhpToken $input @param string [] $ignoredTags