prefer scalar type hints over phpdoc annotation
use method exists lookup to be safe and not break on old hhvm versions add test that checks if type hint is preferred over annotation
This commit is contained in:
parent
9cdc3f0558
commit
23c754aed3
|
@ -60,16 +60,18 @@ class ControllerMethodReflector implements IControllerMethodReflector{
|
|||
|
||||
// extract type parameter information
|
||||
preg_match_all('/@param\h+(?P<type>\w+)\h+\$(?P<var>\w+)/', $docs, $matches);
|
||||
// this is just a fix for PHP 5.3 (array_combine raises warning if called with
|
||||
// two empty arrays
|
||||
if($matches['var'] === array() && $matches['type'] === array()) {
|
||||
$this->types = array();
|
||||
} else {
|
||||
$this->types = array_combine($matches['var'], $matches['type']);
|
||||
|
||||
foreach ($reflection->getParameters() as $param) {
|
||||
// extract type information from PHP 7 scalar types and prefer them
|
||||
// over phpdoc annotations
|
||||
if (method_exists($param, 'getType')) {
|
||||
$type = $param->getType();
|
||||
if ($type !== null) {
|
||||
$this->types[$param->getName()] = (string) $type;
|
||||
}
|
||||
}
|
||||
|
||||
// get method parameters
|
||||
foreach ($reflection->getParameters() as $param) {
|
||||
if($param->isOptional()) {
|
||||
$default = $param->getDefaultValue();
|
||||
} else {
|
||||
|
|
|
@ -104,6 +104,25 @@ class ControllerMethodReflectorTest extends \Test\TestCase {
|
|||
$this->assertEquals('int', $reader->getType('test'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
* @param int $a
|
||||
* @param int $b
|
||||
* @requires PHP 7
|
||||
*/
|
||||
public function testReadTypeIntAnnotationsScalarTypes($a, float $b, int $c, $d){
|
||||
$reader = new ControllerMethodReflector();
|
||||
$reader->reflect(
|
||||
'\OC\AppFramework\Utility\ControllerMethodReflectorTest',
|
||||
'testReadTypeIntAnnotationsScalarTypes'
|
||||
);
|
||||
|
||||
$this->assertEquals('int', $reader->getType('a'));
|
||||
$this->assertEquals('float', $reader->getType('b'));
|
||||
$this->assertEquals('int', $reader->getType('c'));
|
||||
$this->assertNull($reader->getType('d'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @Annotation
|
||||
|
|
Loading…
Reference in New Issue