Skip to content

Commit 59ccf55

Browse files
committed
Playground rule - PromoteParameterRule
1 parent 7f90fec commit 59ccf55

File tree

3 files changed

+108
-0
lines changed

3 files changed

+108
-0
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\Playground;
4+
5+
use PhpParser\Node;
6+
use PHPStan\Analyser\Scope;
7+
use PHPStan\Rules\Rule;
8+
use PHPStan\Rules\RuleErrorBuilder;
9+
use function sprintf;
10+
11+
/**
12+
* @template TNodeType of Node
13+
* @implements Rule<TNodeType>
14+
*/
15+
final class PromoteParameterRule implements Rule
16+
{
17+
18+
/**
19+
* @param Rule<TNodeType> $rule
20+
* @param class-string<TNodeType> $nodeType
21+
*/
22+
public function __construct(
23+
private Rule $rule,
24+
private string $nodeType,
25+
private bool $parameterValue,
26+
private string $parameterName,
27+
)
28+
{
29+
}
30+
31+
public function getNodeType(): string
32+
{
33+
return $this->nodeType;
34+
}
35+
36+
public function processNode(Node $node, Scope $scope): array
37+
{
38+
if ($this->parameterValue) {
39+
return [];
40+
}
41+
42+
if ($this->nodeType !== $this->rule->getNodeType()) {
43+
return [];
44+
}
45+
46+
$errors = [];
47+
foreach ($this->rule->processNode($node, $scope) as $error) {
48+
$errors[] = RuleErrorBuilder::message($error->getMessage())
49+
->identifier('phpstanPlayground.configParameter')
50+
->tip(sprintf('This error would be reported if the <fg=cyan>%s: true</> parameter was enabled in your <fg=cyan>%%configurationFile%%</>.', $this->parameterName))
51+
->build();
52+
}
53+
54+
return $errors;
55+
}
56+
57+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Rules\Playground;
4+
5+
use PHPStan\Node\ClassPropertiesNode;
6+
use PHPStan\Reflection\ConstructorsHelper;
7+
use PHPStan\Rules\Properties\UninitializedPropertyRule;
8+
use PHPStan\Rules\Rule;
9+
use PHPStan\Testing\RuleTestCase;
10+
11+
/**
12+
* @extends RuleTestCase<PromoteParameterRule<ClassPropertiesNode>>
13+
*/
14+
class PromoteParameterRuleTest extends RuleTestCase
15+
{
16+
17+
protected function getRule(): Rule
18+
{
19+
return new PromoteParameterRule(
20+
new UninitializedPropertyRule(new ConstructorsHelper(
21+
self::getContainer(),
22+
[],
23+
)),
24+
ClassPropertiesNode::class,
25+
false,
26+
'checkUninitializedProperties',
27+
);
28+
}
29+
30+
public function testRule(): void
31+
{
32+
$this->analyse([__DIR__ . '/data/promote-parameter.php'], [
33+
[
34+
'Class PromoteParameter\Foo has an uninitialized property $test. Give it default value or assign it in the constructor.',
35+
5,
36+
'This error would be reported if the <fg=cyan>checkUninitializedProperties: true</> parameter was enabled in your <fg=cyan>%configurationFile%</>.',
37+
],
38+
]);
39+
}
40+
41+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
namespace PromoteParameter;
4+
5+
class Foo
6+
{
7+
8+
public int $test;
9+
10+
}

0 commit comments

Comments
 (0)