From d3e4262ef1f8b3f0b543d42e635bdaa918ca7c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Barto=C5=A1?= Date: Thu, 9 Jul 2026 02:04:04 +0200 Subject: [PATCH] NetteUsageProvider: support whitespace inside @property type (incl. multiline) --- src/Provider/NetteUsageProvider.php | 2 +- tests/Rule/data/providers/nette.php | 31 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Provider/NetteUsageProvider.php b/src/Provider/NetteUsageProvider.php index 2d610ef..e1257a6 100644 --- a/src/Provider/NetteUsageProvider.php +++ b/src/Provider/NetteUsageProvider.php @@ -176,7 +176,7 @@ private function getMagicProperties(ClassReflection $reflection): array } preg_match_all( - '~^ [ \t*]* @property(|-read|-write|-deprecated) [ \t]+ [^\s$]+ [ \t]+ \$ (\w+) ()~mx', + '~^ [ \t*]* @property(|-read|-write|-deprecated) [ \t]+ (?:(?!@)[^\s$*]+[\s*]+)++ \$ (\w+) ()~mx', (string) $rc->getDocComment(), $matches, PREG_SET_ORDER, diff --git a/tests/Rule/data/providers/nette.php b/tests/Rule/data/providers/nette.php index 08740be..36cf7e7 100644 --- a/tests/Rule/data/providers/nette.php +++ b/tests/Rule/data/providers/nette.php @@ -35,6 +35,11 @@ public function HandleCaseInsensitive() { // upper-cased 'H': Nette resolves sig /** * @property float $radius * @property-read bool $visible + * @property array $labels + * @property array{ + * x: float, + * y: float, + * } $center */ class Circle { @@ -56,9 +61,35 @@ protected function isVisible(): bool { return $this->radius > 0; } + + /** + * @return array + */ + protected function getLabels(): array + { + return []; + } + + /** + * @param array $labels + */ + protected function setLabels(array $labels): void + { + } + + /** + * @return array{x: float, y: float} + */ + protected function getCenter(): array + { + return ['x' => 0.0, 'y' => 0.0]; + } } $circle = new Circle; $circle->radius = 10; // actually calls setRadius(10) echo $circle->radius; // calls getRadius() echo $circle->visible; // calls isVisible() +$circle->labels = ['color' => 'red']; // calls setLabels() +print_r($circle->labels); // calls getLabels() +echo $circle->center['x']; // calls getCenter()