Merge pull request #84 from Seldaek/support_rest_arg

Add support for rest argument notation
This commit is contained in:
Mike van Riel
2016-09-30 09:11:17 +02:00
committed by GitHub
2 changed files with 38 additions and 1 deletions
+11 -1
View File
@@ -127,7 +127,7 @@ final class Method extends BaseTag implements Factory\StaticMethod
if ('' !== $arguments) {
$arguments = explode(',', $arguments);
foreach($arguments as &$argument) {
$argument = explode(' ', trim($argument));
$argument = explode(' ', self::stripRestArg(trim($argument)), 2);
if ($argument[0][0] === '$') {
$argumentName = substr($argument[0], 1);
$argumentType = new Void_();
@@ -135,6 +135,7 @@ final class Method extends BaseTag implements Factory\StaticMethod
$argumentType = $typeResolver->resolve($argument[0], $context);
$argumentName = '';
if (isset($argument[1])) {
$argument[1] = self::stripRestArg($argument[1]);
$argumentName = substr($argument[1], 1);
}
}
@@ -217,4 +218,13 @@ final class Method extends BaseTag implements Factory\StaticMethod
return $arguments;
}
private static function stripRestArg($argument)
{
if (strpos($argument, '...') === 0) {
$argument = trim(substr($argument, 3));
}
return $argument;
}
}
+27
View File
@@ -139,6 +139,33 @@ class MethodTest extends \PHPUnit_Framework_TestCase
$this->assertEquals($expected, $fixture->getArguments());
}
/**
* @covers ::create
*/
public function testRestArgumentIsParsedAsRegularArg()
{
$expected = [
[ 'name' => 'arg1', 'type' => new Void_() ],
[ 'name' => 'rest', 'type' => new Void_() ],
[ 'name' => 'rest2', 'type' => new Array_() ],
];
$descriptionFactory = m::mock(DescriptionFactory::class);
$resolver = new TypeResolver();
$context = new Context('');
$description = new Description('');
$descriptionFactory->shouldReceive('create')->with('', $context)->andReturn($description);
$fixture = Method::create(
'void myMethod($arg1, ...$rest, array ... $rest2)',
$resolver,
$descriptionFactory,
$context
);
$this->assertEquals($expected, $fixture->getArguments());
}
/**
* @covers ::__construct
* @covers ::getReturnType