Skip to content

Commit 265afac

Browse files
committed
Implement property name as an expression in AccessPropertiesRule
1 parent ed7aeb7 commit 265afac

File tree

1 file changed

+26
-3
lines changed

1 file changed

+26
-3
lines changed

src/Rules/Properties/AccessPropertiesRule.php

+26-3
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,16 @@
33
namespace PHPStan\Rules\Properties;
44

55
use PhpParser\Node\Expr\PropertyFetch;
6+
use PhpParser\Node\Identifier;
67
use PHPStan\Analyser\Scope;
78
use PHPStan\Reflection\ReflectionProvider;
9+
use PHPStan\Rules\RuleError;
810
use PHPStan\Rules\RuleErrorBuilder;
911
use PHPStan\Rules\RuleLevelHelper;
12+
use PHPStan\Type\Constant\ConstantStringType;
1013
use PHPStan\Type\ErrorType;
1114
use PHPStan\Type\Type;
15+
use PHPStan\Type\TypeUtils;
1216
use PHPStan\Type\VerbosityLevel;
1317

1418
/**
@@ -41,11 +45,30 @@ public function getNodeType(): string
4145

4246
public function processNode(\PhpParser\Node $node, Scope $scope): array
4347
{
44-
if (!$node->name instanceof \PhpParser\Node\Identifier) {
45-
return [];
48+
if ($node->name instanceof Identifier) {
49+
$names = [$node->name->name];
50+
} else {
51+
$names = array_map(static function (ConstantStringType $type): string {
52+
return $type->getValue();
53+
}, TypeUtils::getConstantStrings($scope->getType($node->name)));
54+
}
55+
56+
$errors = [];
57+
foreach ($names as $name) {
58+
$errors = array_merge($errors, $this->processSingleProperty($scope, $node, $name));
4659
}
4760

48-
$name = $node->name->name;
61+
return $errors;
62+
}
63+
64+
/**
65+
* @param Scope $scope
66+
* @param PropertyFetch $node
67+
* @param string $name
68+
* @return RuleError[]
69+
*/
70+
private function processSingleProperty(Scope $scope, PropertyFetch $node, string $name): array
71+
{
4972
$typeResult = $this->ruleLevelHelper->findTypeToCheck(
5073
$scope,
5174
$node->var,

0 commit comments

Comments
 (0)