From 23c754aed3bfa5c795a03e63183158d028a6a408 Mon Sep 17 00:00:00 2001 From: Bernhard Posselt Date: Thu, 2 Jul 2015 11:54:17 +0200 Subject: [PATCH 1/2] 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 --- .../utility/controllermethodreflector.php | 22 ++++++++++--------- .../utility/ControllerMethodReflectorTest.php | 19 ++++++++++++++++ 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/lib/private/appframework/utility/controllermethodreflector.php b/lib/private/appframework/utility/controllermethodreflector.php index 63cf5ac24f..1118332f93 100644 --- a/lib/private/appframework/utility/controllermethodreflector.php +++ b/lib/private/appframework/utility/controllermethodreflector.php @@ -60,16 +60,18 @@ class ControllerMethodReflector implements IControllerMethodReflector{ // extract type parameter information preg_match_all('/@param\h+(?P\w+)\h+\$(?P\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']); - } + $this->types = array_combine($matches['var'], $matches['type']); - // get method parameters 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; + } + } + if($param->isOptional()) { $default = $param->getDefaultValue(); } else { @@ -82,9 +84,9 @@ class ControllerMethodReflector implements IControllerMethodReflector{ /** * Inspects the PHPDoc parameters for types - * @param string $parameter the parameter whose type comments should be + * @param string $parameter the parameter whose type comments should be * parsed - * @return string|null type in the type parameters (@param int $something) + * @return string|null type in the type parameters (@param int $something) * would return int or null if not existing */ public function getType($parameter) { diff --git a/tests/lib/appframework/utility/ControllerMethodReflectorTest.php b/tests/lib/appframework/utility/ControllerMethodReflectorTest.php index a584b5481b..38bd537e07 100644 --- a/tests/lib/appframework/utility/ControllerMethodReflectorTest.php +++ b/tests/lib/appframework/utility/ControllerMethodReflectorTest.php @@ -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 From b2df7b6b8ae420766f1ce0a7b22e153f9ee1b23e Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Wed, 23 Dec 2015 14:12:37 +0100 Subject: [PATCH 2/2] Fix unit test --- .../utility/ControllerMethodReflectorTest.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/lib/appframework/utility/ControllerMethodReflectorTest.php b/tests/lib/appframework/utility/ControllerMethodReflectorTest.php index 38bd537e07..c643c362a9 100644 --- a/tests/lib/appframework/utility/ControllerMethodReflectorTest.php +++ b/tests/lib/appframework/utility/ControllerMethodReflectorTest.php @@ -108,13 +108,17 @@ class ControllerMethodReflectorTest extends \Test\TestCase { * @Annotation * @param int $a * @param int $b + */ + public function arguments3($a, float $b, int $c, $d){} + + /** * @requires PHP 7 */ - public function testReadTypeIntAnnotationsScalarTypes($a, float $b, int $c, $d){ + public function testReadTypeIntAnnotationsScalarTypes(){ $reader = new ControllerMethodReflector(); $reader->reflect( '\OC\AppFramework\Utility\ControllerMethodReflectorTest', - 'testReadTypeIntAnnotationsScalarTypes' + 'arguments3' ); $this->assertEquals('int', $reader->getType('a'));