mirror of
https://github.com/barryvdh/ReflectionDocBlock.git
synced 2026-08-18 01:57:13 +00:00
♻️ cover more default value cases
This commit is contained in:
@@ -57,7 +57,7 @@ final class MethodFactory implements PHPStanFactory
|
|||||||
),
|
),
|
||||||
$param->isReference,
|
$param->isReference,
|
||||||
$param->isVariadic,
|
$param->isVariadic,
|
||||||
(string) $param->defaultValue
|
$param->defaultValue
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
$tagValue->parameters
|
$tagValue->parameters
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file is part of phpDocumentor.
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*
|
||||||
|
* @link http://phpdoc.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace phpDocumentor\Reflection\DocBlock\Tags\Factory;
|
||||||
|
|
||||||
|
use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
|
||||||
|
use function str_repeat;
|
||||||
|
use function strlen;
|
||||||
|
|
||||||
|
class MethodParameterFactory
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Formats the given default value to a string-able mixin
|
||||||
|
*/
|
||||||
|
public function format($defaultValue): string
|
||||||
|
{
|
||||||
|
if (method_exists($this, $method = 'format'.ucfirst(gettype($defaultValue)))) {
|
||||||
|
return ' = ' . $this->{$method}($defaultValue);
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatDouble(float $defaultValue): string
|
||||||
|
{
|
||||||
|
return var_export($defaultValue, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatNull($defaultValue): string
|
||||||
|
{
|
||||||
|
return 'null';
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatInteger(int $defaultValue): string
|
||||||
|
{
|
||||||
|
return var_export($defaultValue, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatString(string $defaultValue): string
|
||||||
|
{
|
||||||
|
return var_export($defaultValue, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatBoolean(bool $defaultValue): string
|
||||||
|
{
|
||||||
|
return var_export($defaultValue, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatArray(array $defaultValue): string
|
||||||
|
{
|
||||||
|
$formatedValue = '[';
|
||||||
|
|
||||||
|
foreach ($defaultValue as $key => $value) {
|
||||||
|
if (method_exists($this, $method = 'format'.ucfirst(gettype($value)))) {
|
||||||
|
$formatedValue .= $this->{$method}($value);
|
||||||
|
|
||||||
|
if ($key !== array_key_last($defaultValue)) {
|
||||||
|
$formatedValue .= ',';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$formatedValue .= ']';
|
||||||
|
|
||||||
|
return $formatedValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function formatObject(object $defaultValue): string
|
||||||
|
{
|
||||||
|
return 'new '. get_class($defaultValue). '()';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -261,18 +261,7 @@ final class Method extends BaseTag implements Factory\StaticMethod
|
|||||||
{
|
{
|
||||||
$arguments = [];
|
$arguments = [];
|
||||||
foreach ($this->parameters as $parameter) {
|
foreach ($this->parameters as $parameter) {
|
||||||
$parameterDefaultValueStr = null;
|
$arguments[] = (string) $parameter;
|
||||||
if ($parameter->getDefaultValue() !== null) {
|
|
||||||
$parameterDefaultValueStr = $parameter->getDefaultValue();
|
|
||||||
settype($parameterDefaultValueStr, (string)$parameter->getType());
|
|
||||||
$parameterDefaultValueStr = sprintf(' = %s', var_export($parameterDefaultValueStr, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
$arguments[] = $parameter->getType() . ' ' .
|
|
||||||
($parameter->isReference() ? '&' : '') .
|
|
||||||
($parameter->isVariadic() ? '...' : '') .
|
|
||||||
'$' . $parameter->getName() .
|
|
||||||
($parameterDefaultValueStr ?? '');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$argumentStr = '(' . implode(', ', $arguments) . ')';
|
$argumentStr = '(' . implode(', ', $arguments) . ')';
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace phpDocumentor\Reflection\DocBlock\Tags;
|
namespace phpDocumentor\Reflection\DocBlock\Tags;
|
||||||
|
|
||||||
|
use phpDocumentor\Reflection\DocBlock\Tags\Factory\MethodParameterFactory;
|
||||||
use phpDocumentor\Reflection\Type;
|
use phpDocumentor\Reflection\Type;
|
||||||
|
|
||||||
final class MethodParameter
|
final class MethodParameter
|
||||||
@@ -24,14 +25,16 @@ final class MethodParameter
|
|||||||
|
|
||||||
private string $name;
|
private string $name;
|
||||||
|
|
||||||
private ?string $defaultValue = null;
|
private mixed $defaultValue;
|
||||||
|
|
||||||
|
private const NO_DEFAULT_VALUE = '__NO_VALUE__';
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
string $name,
|
string $name,
|
||||||
Type $type,
|
Type $type,
|
||||||
bool $isReference = false,
|
bool $isReference = false,
|
||||||
bool $isVariadic = false,
|
bool $isVariadic = false,
|
||||||
?string $defaultValue = null
|
$defaultValue = self::NO_DEFAULT_VALUE
|
||||||
) {
|
) {
|
||||||
$this->type = $type;
|
$this->type = $type;
|
||||||
$this->isReference = $isReference;
|
$this->isReference = $isReference;
|
||||||
@@ -60,8 +63,17 @@ final class MethodParameter
|
|||||||
return $this->isVariadic;
|
return $this->isVariadic;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getDefaultValue(): ?string
|
public function getDefaultValue(): mixed
|
||||||
{
|
{
|
||||||
return $this->defaultValue;
|
return $this->defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function __toString(): string
|
||||||
|
{
|
||||||
|
return $this->getType() . ' ' .
|
||||||
|
($this->isReference() ? '&' : '') .
|
||||||
|
($this->isVariadic() ? '...' : '') .
|
||||||
|
'$' . $this->getName() .
|
||||||
|
($this->getDefaultValue() !== self::NO_DEFAULT_VALUE ? (new MethodParameterFactory)->format($this->getDefaultValue()) : '');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,104 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This file is part of phpDocumentor.
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*
|
||||||
|
* @link http://phpdoc.org
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace phpDocumentor\Reflection\DocBlock\Tags;
|
||||||
|
|
||||||
|
use Mockery as m;
|
||||||
|
use phpDocumentor\Reflection\DocBlock\Description;
|
||||||
|
use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
|
||||||
|
use phpDocumentor\Reflection\Fqsen;
|
||||||
|
use phpDocumentor\Reflection\Type;
|
||||||
|
use phpDocumentor\Reflection\TypeResolver;
|
||||||
|
use phpDocumentor\Reflection\Types\Array_;
|
||||||
|
use phpDocumentor\Reflection\Types\Boolean;
|
||||||
|
use phpDocumentor\Reflection\Types\Compound;
|
||||||
|
use phpDocumentor\Reflection\Types\Context;
|
||||||
|
use phpDocumentor\Reflection\Types\Float_;
|
||||||
|
use phpDocumentor\Reflection\Types\Integer;
|
||||||
|
use phpDocumentor\Reflection\Types\Mixed_;
|
||||||
|
use phpDocumentor\Reflection\Types\Null_;
|
||||||
|
use phpDocumentor\Reflection\Types\Nullable;
|
||||||
|
use phpDocumentor\Reflection\Types\Object_;
|
||||||
|
use phpDocumentor\Reflection\Types\String_;
|
||||||
|
use phpDocumentor\Reflection\Types\This;
|
||||||
|
use phpDocumentor\Reflection\Types\Void_;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Method
|
||||||
|
* @covers ::<private>
|
||||||
|
*/
|
||||||
|
class MethodParameterTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Call Mockery::close after each test.
|
||||||
|
*/
|
||||||
|
public function tearDown(): void
|
||||||
|
{
|
||||||
|
m::close();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function collectionDefaultValuesProvider(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
[new String_(), '1', '\'1\''],
|
||||||
|
[new Integer(), 1, '1'],
|
||||||
|
[new Boolean(), true, 'true'],
|
||||||
|
[new Float_(), 1.23, '1.23'],
|
||||||
|
[new Array_(), [1, '2', true], '[1,\'2\',true]'],
|
||||||
|
[new Array_(), [[1, 2], '2', true], '[[1,2],\'2\',true]'],
|
||||||
|
[new Nullable(new Float_()), null, 'null'],
|
||||||
|
[new Nullable(new Float_()), 1.23, '1.23'],
|
||||||
|
[new Object_(new Fqsen('\\stdClass')), new \stdClass(), 'new stdClass()'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::__construct
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::getDefaultValue()
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::__toString
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
|
||||||
|
*
|
||||||
|
* @dataProvider collectionDefaultValuesProvider
|
||||||
|
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
|
||||||
|
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
|
||||||
|
*/
|
||||||
|
public function testIfTagCanBeRenderedUsingMethodParameterWithDefaultValue(Type $type, $defaultValue, string $defaultValueStr): void
|
||||||
|
{
|
||||||
|
$fixture = new MethodParameter('argument', $type, false, false, $defaultValue);
|
||||||
|
|
||||||
|
$this->assertSame(
|
||||||
|
sprintf('%s $argument = %s', $type, $defaultValueStr),
|
||||||
|
(string) $fixture
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::__construct
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::getDefaultValue()
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::__toString
|
||||||
|
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
|
||||||
|
*
|
||||||
|
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
|
||||||
|
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
|
||||||
|
*/
|
||||||
|
public function testIfTagCanBeRenderedUsingMethodParameterWithNoDefaultValue(): void
|
||||||
|
{
|
||||||
|
$fixture = new MethodParameter('argument', new Float_());
|
||||||
|
|
||||||
|
$this->assertSame(
|
||||||
|
'float $argument',
|
||||||
|
(string) $fixture
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ use Mockery as m;
|
|||||||
use phpDocumentor\Reflection\DocBlock\Description;
|
use phpDocumentor\Reflection\DocBlock\Description;
|
||||||
use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
|
use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
|
||||||
use phpDocumentor\Reflection\Fqsen;
|
use phpDocumentor\Reflection\Fqsen;
|
||||||
|
use phpDocumentor\Reflection\Type;
|
||||||
use phpDocumentor\Reflection\TypeResolver;
|
use phpDocumentor\Reflection\TypeResolver;
|
||||||
use phpDocumentor\Reflection\Types\Array_;
|
use phpDocumentor\Reflection\Types\Array_;
|
||||||
use phpDocumentor\Reflection\Types\Boolean;
|
use phpDocumentor\Reflection\Types\Boolean;
|
||||||
@@ -700,41 +701,4 @@ class MethodTest extends TestCase
|
|||||||
$this->assertSame($description, $fixture->getDescription());
|
$this->assertSame($description, $fixture->getDescription());
|
||||||
$this->assertTrue($fixture->returnsReference());
|
$this->assertTrue($fixture->returnsReference());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::__construct
|
|
||||||
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::getDefaultValue()
|
|
||||||
* @uses \phpDocumentor\Reflection\DocBlock\Tags\MethodParameter::__toString
|
|
||||||
* @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
|
|
||||||
*
|
|
||||||
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
|
|
||||||
* @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
|
|
||||||
*/
|
|
||||||
public function testIfTagCanBeRenderedUsingMethodParameterWithDefaultValue(): void
|
|
||||||
{
|
|
||||||
$arguments = [
|
|
||||||
['name' => 'argument1', 'type' => new String_()],
|
|
||||||
['name' => 'argument2', 'type' => new Object_()],
|
|
||||||
];
|
|
||||||
|
|
||||||
$fixture = new Method(
|
|
||||||
'myMethod',
|
|
||||||
$arguments,
|
|
||||||
new Void_(),
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
false,
|
|
||||||
[
|
|
||||||
new MethodParameter('argument1', new String_(), false, false, '1'),
|
|
||||||
new MethodParameter('argument2', new Integer(), false, false, '1'),
|
|
||||||
new MethodParameter('argument3', new Boolean(), false, false, 'true'),
|
|
||||||
new MethodParameter('argument4', new Float_(), false, false, '1.23'),
|
|
||||||
]
|
|
||||||
);
|
|
||||||
|
|
||||||
$this->assertSame(
|
|
||||||
'@method void myMethod(string $argument1 = \'1\', int $argument2 = 1, bool $argument3 = true, float $argument4 = 1.23)',
|
|
||||||
$fixture->render()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user