-
Notifications
You must be signed in to change notification settings - Fork 124
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
✨ method parameter default value rendering #374
Changes from 8 commits
fde2b59
442a3d1
456d2b0
992c829
93cfc74
6a623a4
54f9b11
2b2242d
f26d445
1ed543b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
<?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; | ||
|
||
/** | ||
* @internal This class is not part of the BC promise of this library. | ||
*/ | ||
final class MethodParameterFactory | ||
{ | ||
/** | ||
* Formats the given default value to a string-able mixin | ||
* | ||
* @param mixed $defaultValue | ||
* @return string | ||
*/ | ||
public function format($defaultValue): string | ||
{ | ||
if (method_exists($this, $method = 'format'.ucfirst(gettype($defaultValue)))) { | ||
return ' = ' . $this->{$method}($defaultValue); | ||
} | ||
return ''; | ||
} | ||
|
||
private function formatDouble(float $defaultValue): string | ||
{ | ||
return var_export($defaultValue, true); | ||
} | ||
|
||
/** | ||
* @param mixed $defaultValue | ||
* @return string | ||
*/ | ||
private function formatNull($defaultValue): string | ||
{ | ||
return 'null'; | ||
} | ||
|
||
private function formatInteger(int $defaultValue): string | ||
{ | ||
return var_export($defaultValue, true); | ||
} | ||
|
||
private function formatString(string $defaultValue): string | ||
{ | ||
return var_export($defaultValue, true); | ||
} | ||
|
||
private function formatBoolean(bool $defaultValue): string | ||
{ | ||
return var_export($defaultValue, true); | ||
} | ||
|
||
/** | ||
* @param array<array, null, int, float, bool, string, object> $defaultValue | ||
* @return string | ||
*/ | ||
private function formatArray(array $defaultValue): string | ||
Check failure on line 72 in src/DocBlock/Tags/Factory/MethodParameterFactory.php GitHub Actions / Static analysis / Static Code Analysis (8.0)
Check failure on line 72 in src/DocBlock/Tags/Factory/MethodParameterFactory.php GitHub Actions / Static analysis / Static Code Analysis (8.0)
|
||
{ | ||
$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; | ||
} | ||
|
||
private function formatObject(object $defaultValue): string | ||
{ | ||
return 'new '. get_class($defaultValue). '()'; | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -12,6 +12,7 @@ | |
|
||
namespace phpDocumentor\Reflection\DocBlock\Tags; | ||
|
||
use phpDocumentor\Reflection\DocBlock\Tags\Factory\MethodParameterFactory; | ||
use phpDocumentor\Reflection\Type; | ||
|
||
final class MethodParameter | ||
|
@@ -24,14 +25,22 @@ final class MethodParameter | |
|
||
private string $name; | ||
|
||
private ?string $defaultValue = null; | ||
/** | ||
* @var mixed | ||
*/ | ||
private $defaultValue; | ||
|
||
public const NO_DEFAULT_VALUE = '__NO_VALUE__'; | ||
|
||
/** | ||
* @param mixed $defaultValue | ||
*/ | ||
public function __construct( | ||
string $name, | ||
Type $type, | ||
bool $isReference = false, | ||
bool $isVariadic = false, | ||
?string $defaultValue = null | ||
$defaultValue = self::NO_DEFAULT_VALUE | ||
) { | ||
$this->type = $type; | ||
$this->isReference = $isReference; | ||
|
@@ -60,8 +69,17 @@ public function isVariadic(): bool | |
return $this->isVariadic; | ||
} | ||
|
||
public function getDefaultValue(): ?string | ||
public function getDefaultValue(): mixed | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we please revert this as I did notice before, because I see this as a backward compatibility break. I think we should not do that right now. This will also solve the failing tests |
||
{ | ||
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()) : ''); | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
<?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\Fqsen; | ||
use phpDocumentor\Reflection\Type; | ||
use phpDocumentor\Reflection\Types\Array_; | ||
use phpDocumentor\Reflection\Types\Boolean; | ||
use phpDocumentor\Reflection\Types\Float_; | ||
use phpDocumentor\Reflection\Types\Integer; | ||
use phpDocumentor\Reflection\Types\Nullable; | ||
use phpDocumentor\Reflection\Types\Object_; | ||
use phpDocumentor\Reflection\Types\String_; | ||
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 | ||
); | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.