Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. DocCommentHelper.php

class DocCommentHelper

@internal

Hierarchy

  • class \SlevomatCodingStandard\Helpers\DocCommentHelper

Expanded class hierarchy of DocCommentHelper

20 files declare their use of DocCommentHelper
AbstractRequireOneLineDocComment.php in vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Commenting/AbstractRequireOneLineDocComment.php
ClassStructureSniff.php in vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/ClassStructureSniff.php
DisallowArrayTypeHintSyntaxSniff.php in vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/TypeHints/DisallowArrayTypeHintSyntaxSniff.php
DisallowMultiConstantDefinitionSniff.php in vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowMultiConstantDefinitionSniff.php
DisallowMultiPropertyDefinitionSniff.php in vendor/slevomat/coding-standard/SlevomatCodingStandard/Sniffs/Classes/DisallowMultiPropertyDefinitionSniff.php

... See full list

File

vendor/slevomat/coding-standard/SlevomatCodingStandard/Helpers/DocCommentHelper.php, line 48

Namespace

SlevomatCodingStandard\Helpers
View source
class DocCommentHelper {
    public static function hasDocComment(File $phpcsFile, int $pointer) : bool {
        return self::findDocCommentOpenPointer($phpcsFile, $pointer) !== null;
    }
    public static function getDocComment(File $phpcsFile, int $pointer) : ?string {
        $docCommentOpenToken = self::findDocCommentOpenPointer($phpcsFile, $pointer);
        if ($docCommentOpenToken === null) {
            return null;
        }
        return trim(TokenHelper::getContent($phpcsFile, $docCommentOpenToken, $phpcsFile->getTokens()[$docCommentOpenToken]['comment_closer']));
    }
    
    /**
     * @return list<Comment>|null
     */
    public static function getDocCommentDescription(File $phpcsFile, int $pointer) : ?array {
        $docCommentOpenPointer = self::findDocCommentOpenPointer($phpcsFile, $pointer);
        if ($docCommentOpenPointer === null) {
            return null;
        }
        $tokens = $phpcsFile->getTokens();
        $descriptionStartPointer = TokenHelper::findNextExcluding($phpcsFile, [
            T_DOC_COMMENT_WHITESPACE,
            T_DOC_COMMENT_STAR,
        ], $docCommentOpenPointer + 1, $tokens[$docCommentOpenPointer]['comment_closer']);
        if ($descriptionStartPointer === null) {
            return null;
        }
        if ($tokens[$descriptionStartPointer]['code'] !== T_DOC_COMMENT_STRING) {
            return null;
        }
        $tokenAfterDescriptionPointer = TokenHelper::findNext($phpcsFile, [
            T_DOC_COMMENT_TAG,
            T_DOC_COMMENT_CLOSE_TAG,
        ], $descriptionStartPointer + 1, $tokens[$docCommentOpenPointer]['comment_closer'] + 1);
        
        /** @var list<Comment> $comments */
        $comments = [];
        for ($i = $descriptionStartPointer; $i < $tokenAfterDescriptionPointer; $i++) {
            if ($tokens[$i]['code'] !== T_DOC_COMMENT_STRING) {
                continue;
            }
            $comments[] = new Comment($i, trim($tokens[$i]['content']));
        }
        return count($comments) > 0 ? $comments : null;
    }
    public static function hasInheritdocAnnotation(File $phpcsFile, int $pointer) : bool {
        $docCommentOpenPointer = self::findDocCommentOpenPointer($phpcsFile, $pointer);
        if ($docCommentOpenPointer === null) {
            return false;
        }
        $parsedDocComment = self::parseDocComment($phpcsFile, $docCommentOpenPointer);
        if ($parsedDocComment === null) {
            return false;
        }
        foreach ($parsedDocComment->getNode()->children as $child) {
            if ($child instanceof PhpDocTextNode && stripos($child->text, '{@inheritdoc}') !== false) {
                return true;
            }
            if ($child instanceof PhpDocTagNode && strtolower($child->name) === '@inheritdoc') {
                return true;
            }
        }
        return false;
    }
    public static function hasDocCommentDescription(File $phpcsFile, int $pointer) : bool {
        return self::getDocCommentDescription($phpcsFile, $pointer) !== null;
    }
    public static function findDocCommentOpenPointer(File $phpcsFile, int $pointer) : ?int {
        return SniffLocalCache::getAndSetIfNotCached($phpcsFile, sprintf('doc-comment-open-pointer-%d', $pointer), static function () use ($phpcsFile, $pointer) : ?int {
            $tokens = $phpcsFile->getTokens();
            if ($tokens[$pointer]['code'] === T_DOC_COMMENT_OPEN_TAG) {
                return $pointer;
            }
            $found = TokenHelper::findPrevious($phpcsFile, [
                T_DOC_COMMENT_CLOSE_TAG,
                T_SEMICOLON,
                T_CLOSE_CURLY_BRACKET,
                T_OPEN_CURLY_BRACKET,
            ], $pointer - 1);
            if ($found !== null && $tokens[$found]['code'] === T_DOC_COMMENT_CLOSE_TAG) {
                return $tokens[$found]['comment_opener'];
            }
            return null;
        });
    }
    public static function findDocCommentOwnerPointer(File $phpcsFile, int $docCommentOpenPointer) : ?int {
        $tokens = $phpcsFile->getTokens();
        $docCommentCloserPointer = $tokens[$docCommentOpenPointer]['comment_closer'];
        if (self::isInline($phpcsFile, $docCommentOpenPointer)) {
            return null;
        }
        $docCommentOwnerPointer = null;
        for ($i = $docCommentCloserPointer + 1; $i < count($tokens); $i++) {
            if ($tokens[$i]['code'] === T_ATTRIBUTE) {
                $i = $tokens[$i]['attribute_closer'];
                continue;
            }
            if (in_array($tokens[$i]['code'], [
                T_PUBLIC,
                T_PROTECTED,
                T_PRIVATE,
                T_VAR,
                T_READONLY,
                T_FINAL,
                T_STATIC,
                T_ABSTRACT,
                T_WHITESPACE,
            ], true)) {
                continue;
            }
            if (in_array($tokens[$i]['code'], array_merge([
                T_FUNCTION,
                T_VARIABLE,
                T_CONST,
            ], TokenHelper::$typeKeywordTokenCodes), true)) {
                $docCommentOwnerPointer = $i;
            }
            break;
        }
        return $docCommentOwnerPointer;
    }
    public static function isInline(File $phpcsFile, int $docCommentOpenPointer) : bool {
        $tokens = $phpcsFile->getTokens();
        $nextPointer = TokenHelper::findNextNonWhitespace($phpcsFile, $tokens[$docCommentOpenPointer]['comment_closer'] + 1);
        if ($nextPointer !== null && in_array($tokens[$nextPointer]['code'], [
            T_PUBLIC,
            T_PROTECTED,
            T_PRIVATE,
            T_READONLY,
            T_FINAL,
            T_STATIC,
            T_ABSTRACT,
            T_CONST,
            T_CLASS,
            T_INTERFACE,
            T_TRAIT,
            T_ENUM,
        ], true)) {
            return false;
        }
        $parsedDocComment = self::parseDocComment($phpcsFile, $docCommentOpenPointer);
        if ($parsedDocComment === null) {
            return false;
        }
        foreach ($parsedDocComment->getNode()
            ->getTags() as $annotation) {
            if (preg_match('~^@(?:(?:phpstan|psalm)-)?var~i', $annotation->name) === 1) {
                return true;
            }
        }
        return false;
    }
    public static function parseDocComment(File $phpcsFile, int $docCommentOpenPointer) : ?ParsedDocComment {
        return SniffLocalCache::getAndSetIfNotCached($phpcsFile, sprintf('parsed-doc-comment-%d', $docCommentOpenPointer), static function () use ($phpcsFile, $docCommentOpenPointer) : ?ParsedDocComment {
            $docComment = self::getDocComment($phpcsFile, $docCommentOpenPointer);
            $docCommentTokens = new TokenIterator(PhpDocParserHelper::getLexer()->tokenize($docComment));
            try {
                $parsedDocComment = PhpDocParserHelper::getParser()->parse($docCommentTokens);
                return new ParsedDocComment($docCommentOpenPointer, $phpcsFile->getTokens()[$docCommentOpenPointer]['comment_closer'], $parsedDocComment, $docCommentTokens);
            } catch (ParserException $e) {
                return null;
            }
        });
    }

}

Members

Title Sort descending Modifiers Object type Summary
DocCommentHelper::findDocCommentOpenPointer public static function
DocCommentHelper::findDocCommentOwnerPointer public static function
DocCommentHelper::getDocComment public static function
DocCommentHelper::getDocCommentDescription public static function *
DocCommentHelper::hasDocComment public static function
DocCommentHelper::hasDocCommentDescription public static function
DocCommentHelper::hasInheritdocAnnotation public static function
DocCommentHelper::isInline public static function
DocCommentHelper::parseDocComment public static function

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal