diff --git a/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php b/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php index 969633e2e54..cc101391318 100644 --- a/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php +++ b/src/Psalm/Internal/PhpVisitor/Reflector/FunctionLikeNodeScanner.php @@ -606,6 +606,7 @@ public function start(PhpParser\Node\FunctionLike $stmt, bool $fake_method = fal $doc_comment = $param->getDocComment(); $var_comment_type = null; $var_comment_readonly = false; + $var_comment_allow_private_mutation = false; if ($doc_comment) { $var_comments = CommentAnalyzer::getTypeFromComment( $doc_comment, @@ -620,6 +621,7 @@ public function start(PhpParser\Node\FunctionLike $stmt, bool $fake_method = fal if ($var_comment !== null) { $var_comment_type = $var_comment->type; $var_comment_readonly = $var_comment->readonly; + $var_comment_allow_private_mutation = $var_comment->allow_private_mutation; } } @@ -652,6 +654,7 @@ public function start(PhpParser\Node\FunctionLike $stmt, bool $fake_method = fal $property_storage->has_default = (bool)$param->default; $param_type_readonly = (bool)($param->flags & PhpParser\Node\Stmt\Class_::MODIFIER_READONLY); $property_storage->readonly = $param_type_readonly ?: $var_comment_readonly; + $property_storage->allow_private_mutation = $var_comment_allow_private_mutation; $param_storage->promoted_property = true; $property_storage->is_promoted = true; diff --git a/tests/ReadonlyPropertyTest.php b/tests/ReadonlyPropertyTest.php index 4cf7c4728c8..ec69276c81b 100644 --- a/tests/ReadonlyPropertyTest.php +++ b/tests/ReadonlyPropertyTest.php @@ -64,7 +64,7 @@ public function setBar(string $s) : void { echo (new A)->bar;' ], - 'readonlyPublicPropertySetInAnotherMEthod' => [ + 'readonlyPublicPropertySetInAnotherMethod' => [ 'bar;' ], + 'docblockReadonlyWithPrivateMutationsAllowedConstructorPropertySetInAnotherMethod' => [ + 'bar = $s; + } + } + + echo (new A)->bar;' + ], + 'readonlyPublicConstructorPropertySetInAnotherMethod' => [ + 'bar = $s; + } + } + + echo (new A)->bar;' + ], 'readonlyPropertySetChildClass' => [ '