Generic types bug fix

This commit is contained in:
M@ster
2022-10-19 23:16:04 +02:00
parent 144140cd39
commit 295d2fba38
4 changed files with 87 additions and 16 deletions
@@ -26,7 +26,7 @@ class ReturnTag extends Tag
{
/** @var string The raw type component. */
protected $type = '';
/** @var Collection The parsed type component. */
protected $types = null;
@@ -49,7 +49,7 @@ class ReturnTag extends Tag
{
parent::setContent($content);
$parts = preg_split('/\s+/Su', $this->description, 2);
$parts = preg_split('/(?<!,)\s+/Su', $this->description, 2);
// any output is considered a type
$this->type = $parts[0];
@@ -112,7 +112,7 @@ class ReturnTag extends Tag
/**
* Returns the type collection.
*
*
* @return void
*/
protected function getTypesCollection()
@@ -106,7 +106,7 @@ class Collection extends \ArrayObject
}
// separate the type by the OR operator
$type_parts = explode(self::OPERATOR_OR, $type);
$type_parts = $this->explode($type);
foreach ($type_parts as $part) {
$expanded_type = $this->expand($part);
if ($expanded_type) {
@@ -114,10 +114,10 @@ class Collection extends \ArrayObject
}
}
}
/**
* Returns a string representation of the collection.
*
*
* @return string The resolved types across the collection, separated with
* {@link self::OPERATOR_OR}.
*/
@@ -126,6 +126,40 @@ class Collection extends \ArrayObject
return implode(self::OPERATOR_OR, $this->getArrayCopy());
}
/**
* Analyzes the given union of types and returns separated by OR operator
* single types.
*
* @param string $type The type or union of types
*
* @return array
*/
protected function explode($type)
{
$type_parts = [];
$curr_type = '';
$nest_level = 0;
foreach (str_split($type) as $char) {
if ($char === self::OPERATOR_OR && $nest_level === 0) {
$type_parts[] = $curr_type;
$curr_type = '';
} else {
if ($char === '<') {
$nest_level++;
} else if ($char === '>') {
$nest_level--;
}
$curr_type .= $char;
}
}
$type_parts[] = $curr_type;
return $type_parts;
}
/**
* Analyzes the given type and returns the FQCN variant.
*