- Notifications
You must be signed in to change notification settings - Fork 127
✨ method parameter default value rendering #374
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
Changes from 1 commit
fde2b59 442a3d1 456d2b0 992c829 93cfc74 6a623a4 54f9b11 2b2242d f26d445 1ed543b File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
- Loading branch information
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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). '()'; | ||
| } | ||
| } | ||
| 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,16 @@ final class MethodParameter | |
| | ||
| private string $name; | ||
| | ||
| private ?string $defaultValue = null; | ||
| private mixed $defaultValue; | ||
| | ||
| private const NO_DEFAULT_VALUE = '__NO_VALUE__'; | ||
| | ||
| 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 +63,17 @@ public function isVariadic(): bool | |
| return $this->isVariadic; | ||
| } | ||
| | ||
| public function getDefaultValue(): ?string | ||
| public function getDefaultValue(): mixed | ||
| ||
| { | ||
| 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,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 | ||
| ); | ||
| } | ||
| } |
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.
Please mark this class as final and
@internalas we should not make this part of the backward compatibility promise. Extending this class should be blocked as it is an internal only class. Maybe this should even be part of theMethodtag? Unless there is a reason to extract this because you want to share this class?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.
All good
For me, extracting this logic from the base code is a good idea for the maintanability
It could have been a trait but I did get inspired by the package way of working, could be wrong