mirror of
https://github.com/nextcloud/server.git
synced 2026-02-27 18:37:17 +01:00
fix(controller): Support native int ranges
Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
@@ -18,6 +18,8 @@ class ControllerMethodReflector implements IControllerMethodReflector {
|
||||
private $types = [];
|
||||
private $parameters = [];
|
||||
private array $ranges = [];
|
||||
private int $startLine = 0;
|
||||
private string $file = '';
|
||||
|
||||
/**
|
||||
* @param object $object an object or classname
|
||||
@@ -25,6 +27,9 @@ class ControllerMethodReflector implements IControllerMethodReflector {
|
||||
*/
|
||||
public function reflect($object, string $method) {
|
||||
$reflection = new \ReflectionMethod($object, $method);
|
||||
$this->startLine = $reflection->getStartLine();
|
||||
$this->file = $reflection->getFileName();
|
||||
|
||||
$docs = $reflection->getDocComment();
|
||||
|
||||
if ($docs !== false) {
|
||||
@@ -50,7 +55,7 @@ class ControllerMethodReflector implements IControllerMethodReflector {
|
||||
// extract type parameter information
|
||||
preg_match_all('/@param\h+(?P<type>\w+)\h+\$(?P<var>\w+)/', $docs, $matches);
|
||||
$this->types = array_combine($matches['var'], $matches['type']);
|
||||
preg_match_all('/@psalm-param\h+(?P<type>\w+)<(?P<rangeMin>(-?\d+|min)),\h*(?P<rangeMax>(-?\d+|max))>\h+\$(?P<var>\w+)/', $docs, $matches);
|
||||
preg_match_all('/@(?:psalm-)?param\h+(\?)?(?P<type>\w+)<(?P<rangeMin>(-?\d+|min)),\h*(?P<rangeMax>(-?\d+|max))>(\|null)?\h+\$(?P<var>\w+)/', $docs, $matches);
|
||||
foreach ($matches['var'] as $index => $varName) {
|
||||
if ($matches['type'][$index] !== 'int') {
|
||||
// only int ranges are possible at the moment
|
||||
@@ -134,4 +139,12 @@ class ControllerMethodReflector implements IControllerMethodReflector {
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
public function getStartLine(): int {
|
||||
return $this->startLine;
|
||||
}
|
||||
|
||||
public function getFile(): string {
|
||||
return $this->file;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,9 +43,21 @@ class MiddleController extends BaseController {
|
||||
/**
|
||||
* @psalm-param int<-4, 42> $rangedOne
|
||||
* @psalm-param int<min, max> $rangedTwo
|
||||
* @psalm-param int<1, 6>|null $rangedThree
|
||||
* @psalm-param ?int<-70, -30> $rangedFour
|
||||
* @return void
|
||||
*/
|
||||
public function test4(int $rangedOne, int $rangedTwo) {
|
||||
public function test4(int $rangedOne, int $rangedTwo, ?int $rangedThree, ?int $rangedFour) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int<-4, 42> $rangedOne
|
||||
* @param int<min, max> $rangedTwo
|
||||
* @param int<1, 6>|null $rangedThree
|
||||
* @param ?int<-70, -30> $rangedFour
|
||||
* @return void
|
||||
*/
|
||||
public function test5(int $rangedOne, int $rangedTwo, ?int $rangedThree, ?int $rangedFour) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -132,9 +144,6 @@ class ControllerMethodReflectorTest extends \Test\TestCase {
|
||||
public function arguments3($a, float $b, int $c, $d) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @requires PHP 7
|
||||
*/
|
||||
public function testReadTypeIntAnnotationsScalarTypes(): void {
|
||||
$reader = new ControllerMethodReflector();
|
||||
$reader->reflect(
|
||||
@@ -228,7 +237,7 @@ class ControllerMethodReflectorTest extends \Test\TestCase {
|
||||
$this->assertFalse($reader->hasAnnotation('Annotation'));
|
||||
}
|
||||
|
||||
public function testRangeDetection(): void {
|
||||
public function testRangeDetectionPsalm(): void {
|
||||
$reader = new ControllerMethodReflector();
|
||||
$reader->reflect('Test\AppFramework\Utility\EndController', 'test4');
|
||||
|
||||
@@ -239,5 +248,34 @@ class ControllerMethodReflectorTest extends \Test\TestCase {
|
||||
$rangeInfo2 = $reader->getRange('rangedTwo');
|
||||
$this->assertSame(PHP_INT_MIN, $rangeInfo2['min']);
|
||||
$this->assertSame(PHP_INT_MAX, $rangeInfo2['max']);
|
||||
|
||||
$rangeInfo3 = $reader->getRange('rangedThree');
|
||||
$this->assertSame(1, $rangeInfo3['min']);
|
||||
$this->assertSame(6, $rangeInfo3['max']);
|
||||
|
||||
$rangeInfo3 = $reader->getRange('rangedFour');
|
||||
$this->assertSame(-70, $rangeInfo3['min']);
|
||||
$this->assertSame(-30, $rangeInfo3['max']);
|
||||
}
|
||||
|
||||
public function testRangeDetectionNative(): void {
|
||||
$reader = new ControllerMethodReflector();
|
||||
$reader->reflect('Test\AppFramework\Utility\EndController', 'test5');
|
||||
|
||||
$rangeInfo1 = $reader->getRange('rangedOne');
|
||||
$this->assertSame(-4, $rangeInfo1['min']);
|
||||
$this->assertSame(42, $rangeInfo1['max']);
|
||||
|
||||
$rangeInfo2 = $reader->getRange('rangedTwo');
|
||||
$this->assertSame(PHP_INT_MIN, $rangeInfo2['min']);
|
||||
$this->assertSame(PHP_INT_MAX, $rangeInfo2['max']);
|
||||
|
||||
$rangeInfo3 = $reader->getRange('rangedThree');
|
||||
$this->assertSame(1, $rangeInfo3['min']);
|
||||
$this->assertSame(6, $rangeInfo3['max']);
|
||||
|
||||
$rangeInfo3 = $reader->getRange('rangedFour');
|
||||
$this->assertSame(-70, $rangeInfo3['min']);
|
||||
$this->assertSame(-30, $rangeInfo3['max']);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user