commit 4b7e0fc012c528acdd150eaec92aa594120cf5fd Author: upstream Date: Sun Sep 13 19:06:22 2026 +0200 Upstream dedoc/scramble state of the touched files before 26d30bc054 diff --git a/src/Support/PhpDoc.php b/src/Support/PhpDoc.php new file mode 100644 index 0000000..ed794fc --- /dev/null +++ b/src/Support/PhpDoc.php @@ -0,0 +1,94 @@ + true, 'indexes' => true]); + $lexer = new Lexer($config); + $constExprParser = new ConstExprParser($config); + $typeParser = new TypeParser($config, $constExprParser); + $phpDocParser = new PhpDocParser($config, $typeParser, $constExprParser); + + return [$lexer, $phpDocParser, $typeParser]; + } + + $lexer = new Lexer; + $constExprParser = new ConstExprParser; + $typeParser = new TypeParser($constExprParser); + + return [$lexer, new PhpDocParser($typeParser, $constExprParser), $typeParser]; + } + + public static function parse(string $docComment, ?FileNameResolver $nameResolver = null): PhpDocNode + { + $hasBodyTag = (bool) preg_match('/(^|\s)@body(?=\s|$)/', $docComment); + + $docComment = Str::replace(['@body'], '@var', $docComment); + + [$lexer, $phpDocParser] = static::getTokenizerAndParser(); + + $tokens = new TokenIterator($lexer->tokenize($docComment)); + + /** @var PhpDocNode $node */ + $node = $phpDocParser->parse($tokens); + + $node->setAttribute('hasBodyTag', $hasBodyTag); + + static::addSummaryAttributes($node); + + if ($nameResolver) { + $tagValues = [ + ...$node->getParamTagValues(), + ...$node->getMixinTagValues(), + ...$node->getExtendsTagValues(), + ...$node->getUsesTagValues(), + ...$node->getReturnTagValues(), + ...$node->getReturnTagValues('@response'), + ...$node->getReturnTagValues('@scramble-return'), + ...$node->getVarTagValues(), + ...$node->getThrowsTagValues(), + ...$node->getPropertyTagValues(), + ...$node->getPropertyReadTagValues(), + ]; + + foreach ($tagValues as $tagValue) { + PhpDocTypeWalker::traverse($tagValue->type, [ + new ResolveFqnPhpDocTypeVisitor($nameResolver), + ]); + } + } + + return $node; + } + + public static function addSummaryAttributes(PhpDocNode $phpDoc) + { + $text = collect($phpDoc->children) + ->filter(fn ($v) => $v instanceof PhpDocTextNode) + ->map(fn (PhpDocTextNode $n) => $n->text) + ->implode("\n"); + + $text = Str::of($text) + ->trim() + ->explode("\n\n", 2); + + $phpDoc->setAttribute('summary', trim($text[0] ?? '')); + $phpDoc->setAttribute('description', trim($text[1] ?? '')); + } +}