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:
Bernhard Posselt 2015-07-02 11:54:17 +02:00 committed by Roeland Jago Douma
parent 9cdc3f0558
commit 23c754aed3
2 changed files with 31 additions and 10 deletions

View File

@ -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 {

View File

@ -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