diff --git a/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php b/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php index fa2d09f2a98..bfd0f3a5435 100644 --- a/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php +++ b/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php @@ -32,6 +32,7 @@ use Psalm\Issue\DuplicateMethod; use Psalm\Issue\DuplicateParam; use Psalm\Issue\InvalidDocblock; +use Psalm\Issue\InvalidPropertyAssignment; use Psalm\Issue\MissingDocblockType; use Psalm\Issue\ParseError; use Psalm\Issue\PrivateFinalMethod; @@ -626,6 +627,18 @@ public function start(PhpParser\Node\FunctionLike $stmt, bool $fake_method = fal } } + if ($this->codebase->analysis_php_version_id < 8_00_00) { + if (IssueBuffer::accepts( + new InvalidPropertyAssignment( + 'Promoted properties are only supported in PHP 8 or newer,' + . ' but promoted property ' . $param_storage->name . ' found', + new CodeLocation($this->file_scanner, $param, null, true), + ), + )) { + return false; + } + } + //no docblock type was provided for param but we have one for property if ($var_comment_type) { $param_storage->type = $var_comment_type; diff --git a/tests/PropertyTypeTest.php b/tests/PropertyTypeTest.php index 3d066210444..1891ce337d7 100644 --- a/tests/PropertyTypeTest.php +++ b/tests/PropertyTypeTest.php @@ -606,6 +606,18 @@ function foo() { 'MixedPropertyFetch', ], ], + 'promotedPropertyOldPhp' => [ + 'code' => ' [], + 'ignored_issues' => [], + 'php_version' => '8.0', + ], 'sharedPropertyInIf' => [ 'code' => 'foo = "bar";', 'error_message' => 'InvalidPropertyAssignment', ], + 'promotedPropertyOldPhp' => [ + 'code' => ' 'InvalidPropertyAssignment', + 'ignored_issues' => [], + 'php_version' => '7.4', + ], 'badFetch' => [ 'code' => '