Current File : /var/www/prestashop/modules/ps_metrics/vendor/friendsofphp/php-cs-fixer/src/DocBlock/DocBlock.php |
<?php
declare (strict_types=1);
/*
* This file is part of PHP CS Fixer.
*
* (c) Fabien Potencier <fabien@symfony.com>
* Dariusz Rumiński <dariusz.ruminski@gmail.com>
*
* This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE.
*/
namespace ps_metrics_module_v4_0_6\PhpCsFixer\DocBlock;
use ps_metrics_module_v4_0_6\PhpCsFixer\Preg;
use ps_metrics_module_v4_0_6\PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceAnalysis;
use ps_metrics_module_v4_0_6\PhpCsFixer\Tokenizer\Analyzer\Analysis\NamespaceUseAnalysis;
/**
* This class represents a docblock.
*
* It internally splits it up into "lines" that we can manipulate.
*
* @author Graham Campbell <hello@gjcampbell.co.uk>
*/
final class DocBlock
{
/**
* The array of lines.
*
* @var Line[]
*/
private $lines = [];
/**
* The array of annotations.
*
* @var null|Annotation[]
*/
private $annotations;
/**
* @var null|NamespaceAnalysis
*/
private $namespace;
/**
* @var NamespaceUseAnalysis[]
*/
private $namespaceUses;
public function __construct(string $content, ?NamespaceAnalysis $namespace = null, array $namespaceUses = [])
{
foreach (Preg::split('/([^\\n\\r]+\\R*)/', $content, -1, \PREG_SPLIT_NO_EMPTY | \PREG_SPLIT_DELIM_CAPTURE) as $line) {
$this->lines[] = new Line($line);
}
$this->namespace = $namespace;
$this->namespaceUses = $namespaceUses;
}
/**
* Get the string representation of object.
*/
public function __toString() : string
{
return $this->getContent();
}
/**
* Get this docblock's lines.
*
* @return Line[]
*/
public function getLines() : array
{
return $this->lines;
}
/**
* Get a single line.
*/
public function getLine(int $pos) : ?Line
{
return $this->lines[$pos] ?? null;
}
/**
* Get this docblock's annotations.
*
* @return Annotation[]
*/
public function getAnnotations() : array
{
if (null !== $this->annotations) {
return $this->annotations;
}
$this->annotations = [];
$total = \count($this->lines);
for ($index = 0; $index < $total; ++$index) {
if ($this->lines[$index]->containsATag()) {
// get all the lines that make up the annotation
$lines = \array_slice($this->lines, $index, $this->findAnnotationLength($index), \true);
$annotation = new Annotation($lines, $this->namespace, $this->namespaceUses);
// move the index to the end of the annotation to avoid
// checking it again because we know the lines inside the
// current annotation cannot be part of another annotation
$index = $annotation->getEnd();
// add the current annotation to the list of annotations
$this->annotations[] = $annotation;
}
}
return $this->annotations;
}
public function isMultiLine() : bool
{
return 1 !== \count($this->lines);
}
/**
* Take a one line doc block, and turn it into a multi line doc block.
*/
public function makeMultiLine(string $indent, string $lineEnd) : void
{
if ($this->isMultiLine()) {
return;
}
$lineContent = $this->getSingleLineDocBlockEntry($this->lines[0]);
if ('' === $lineContent) {
$this->lines = [new Line('/**' . $lineEnd), new Line($indent . ' *' . $lineEnd), new Line($indent . ' */')];
return;
}
$this->lines = [new Line('/**' . $lineEnd), new Line($indent . ' * ' . $lineContent . $lineEnd), new Line($indent . ' */')];
}
public function makeSingleLine() : void
{
if (!$this->isMultiLine()) {
return;
}
$usefulLines = \array_filter($this->lines, static function (Line $line) : bool {
return $line->containsUsefulContent();
});
if (1 < \count($usefulLines)) {
return;
}
$lineContent = '';
if (\count($usefulLines) > 0) {
$lineContent = $this->getSingleLineDocBlockEntry(\array_shift($usefulLines));
}
$this->lines = [new Line('/** ' . $lineContent . ' */')];
}
public function getAnnotation(int $pos) : ?Annotation
{
$annotations = $this->getAnnotations();
return $annotations[$pos] ?? null;
}
/**
* Get specific types of annotations only.
*
* If none exist, we're returning an empty array.
*
* @param string|string[] $types
*
* @return Annotation[]
*/
public function getAnnotationsOfType($types) : array
{
$annotations = [];
$types = (array) $types;
foreach ($this->getAnnotations() as $annotation) {
$tag = $annotation->getTag()->getName();
foreach ($types as $type) {
if ($type === $tag) {
$annotations[] = $annotation;
}
}
}
return $annotations;
}
/**
* Get the actual content of this docblock.
*/
public function getContent() : string
{
return \implode('', $this->lines);
}
private function findAnnotationLength(int $start) : int
{
$index = $start;
while ($line = $this->getLine(++$index)) {
if ($line->containsATag()) {
// we've 100% reached the end of the description if we get here
break;
}
if (!$line->containsUsefulContent()) {
// if next line is also non-useful, or contains a tag, then we're done here
$next = $this->getLine($index + 1);
if (null === $next || !$next->containsUsefulContent() || $next->containsATag()) {
break;
}
// otherwise, continue, the annotation must have contained a blank line in its description
}
}
return $index - $start;
}
private function getSingleLineDocBlockEntry(Line $line) : string
{
$lineString = $line->getContent();
if ('' === $lineString) {
return $lineString;
}
$lineString = \str_replace('*/', '', $lineString);
$lineString = \trim($lineString);
if (\str_starts_with($lineString, '/**')) {
$lineString = \substr($lineString, 3);
} elseif (\str_starts_with($lineString, '*')) {
$lineString = \substr($lineString, 1);
}
return \trim($lineString);
}
}