Skip to content

Commit a8b8200

Browse files
committed
static fixes for PHPStan 2
1 parent 5848c24 commit a8b8200

14 files changed

+130
-23
lines changed

composer.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@
44
"description": "Set of Symplify rules for PHPStan",
55
"license": "MIT",
66
"require": {
7-
"php": ">=8.1",
8-
"nette/utils": "^3.2.9 || ^4.0",
7+
"php": ">=8.2",
8+
"nette/utils": "^4.0",
99
"webmozart/assert": "^1.11",
1010
"phpstan/phpstan": "^2.0"
1111
},
1212
"require-dev": {
13-
"nikic/php-parser": "^5.0",
14-
"phpunit/phpunit": "^10.5",
13+
"nikic/php-parser": "^5.3",
14+
"phpunit/phpunit": "^11.5",
1515
"symfony/framework-bundle": "6.1.*",
16-
"symplify/easy-coding-standard": "^12.3",
16+
"symplify/easy-coding-standard": "^12.5",
1717
"tomasvotruba/class-leak": "^1.2",
1818
"rector/rector": "^2.0",
1919
"phpstan/extension-installer": "^1.4"

phpstan.neon

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,8 @@ parameters:
7676
-
7777
message: '#Parameter \#2 \$expectedErrors of method PHPStan\\Testing\\RuleTestCase<(.*?)>::analyse\(\) expects list<array\{0: string, 1: int, 2\?: string\|null\}>, (.*?) given#'
7878
path: tests
79+
80+
# fast effective check
81+
-
82+
message: '#Function is_a\(\) is a runtime reflection concept that might not work in PHPStan because it uses fully static reflection engine#'
83+
path: src/Rules/SeeAnnotationToTestRule.php

src/Enum/ClassName.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Symplify\PHPStanRules\Enum;
6+
7+
final class ClassName
8+
{
9+
/**
10+
* @var string
11+
*/
12+
public const CONFIGURABLE_RECTOR_INTERFACE = 'Rector\Contract\Rector\ConfigurableRectorInterface';
13+
}

src/Enum/RuleIdentifier.php

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Symplify\PHPStanRules\Enum;
6+
7+
final class RuleIdentifier
8+
{
9+
/**
10+
* @var string
11+
*/
12+
public const UPPERCASE_CONSTANT = 'symplify.uppercaseConstant';
13+
14+
/**
15+
* @var string
16+
*/
17+
public const SEE_ANNOTATION_TO_TEST = 'symplify.seeAnnotationToTest';
18+
19+
/**
20+
* @var string
21+
*/
22+
public const REGEX_SUFFIX_IN_REGEX_CONSTANT = 'symplify.regexSuffixInRegexConstant';
23+
24+
/**
25+
* @var string
26+
*/
27+
public const REQUIRE_ATTRIBUTE_NAME = 'symplify.requireAttributeName';
28+
29+
/**
30+
* @var string
31+
*/
32+
public const RECTOR_PHP_RULE_IMPLEMENTS_MIN_VERSION = 'rector.phpRuleImplementsMinVersion';
33+
34+
/**
35+
* @var string
36+
*/
37+
public const RECTOR_UPGRADE_DOWNGRADE_REGISTERED_IN_SET = 'rector.upgradeDowngradeRegisteredInSet';
38+
39+
/**
40+
* @var string
41+
*/
42+
public const PHP_PARSER_NO_LEADING_BACKSLASH_IN_NAME = 'phpParser.noLeadingBackslashInName';
43+
44+
/**
45+
* @var string
46+
*/
47+
public const NO_SINGLE_INTERFACE_IMPLEMENTER = 'symplify.noSingleInterfaceImplementer';
48+
49+
/**
50+
* @var string
51+
*/
52+
public const NO_RETURN_ARRAY_VARIABLE_LIST = 'symplify.noReturnArrayVariableList';
53+
}

src/Rules/NoReturnArrayVariableListRule.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use PHPStan\Reflection\MethodReflection;
1616
use PHPStan\Rules\Rule;
1717
use PHPStan\Rules\RuleErrorBuilder;
18+
use Symplify\PHPStanRules\Enum\RuleIdentifier;
1819
use Symplify\PHPStanRules\ParentClassMethodNodeResolver;
1920
use Symplify\PHPStanRules\Testing\StaticPHPUnitEnvironment;
2021

@@ -67,7 +68,11 @@ public function processNode(Node $node, Scope $scope): array
6768
return [];
6869
}
6970

70-
return [RuleErrorBuilder::message(self::ERROR_MESSAGE)->build()];
71+
$ruleError = RuleErrorBuilder::message(self::ERROR_MESSAGE)
72+
->identifier(RuleIdentifier::NO_RETURN_ARRAY_VARIABLE_LIST)
73+
->build();
74+
75+
return [$ruleError];
7176
}
7277

7378
private function shouldSkip(Scope $scope, Return_ $return): bool

src/Rules/NoSingleInterfaceImplementerRule.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Symplify\PHPStanRules\Collector\ImplementedInterfaceCollector;
1515
use Symplify\PHPStanRules\Collector\InterfaceCollector;
1616
use Symplify\PHPStanRules\Collector\InterfaceOfAbstractClassCollector;
17+
use Symplify\PHPStanRules\Enum\RuleIdentifier;
1718

1819
/**
1920
* @see \Symplify\PHPStanRules\Tests\Rules\NoSingleInterfaceImplementerRule\NoSingleInterfaceImplementerRuleTest
@@ -55,7 +56,7 @@ public function processNode(Node $node, Scope $scope): array
5556
return [];
5657
}
5758

58-
$errorMessages = [];
59+
$ruleErrors = [];
5960
foreach ($onceImplementedInterfaces as $onceImplementedInterface) {
6061
$interfaceReflection = $this->reflectionProvider->getClass($onceImplementedInterface);
6162

@@ -64,12 +65,13 @@ public function processNode(Node $node, Scope $scope): array
6465
continue;
6566
}
6667

67-
$errorMessages[] = RuleErrorBuilder::message(sprintf(self::ERROR_MESSAGE, $onceImplementedInterface))
68+
$ruleErrors[] = RuleErrorBuilder::message(sprintf(self::ERROR_MESSAGE, $onceImplementedInterface))
6869
->file($interfaceReflection->getFileName())
70+
->identifier(RuleIdentifier::NO_SINGLE_INTERFACE_IMPLEMENTER)
6971
->build();
7072
}
7173

72-
return $errorMessages;
74+
return $ruleErrors;
7375
}
7476

7577
/**

src/Rules/Rector/NoLeadingBackslashInNameRule.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use PHPStan\Rules\Rule;
1414
use PHPStan\Rules\RuleErrorBuilder;
1515
use PHPStan\Type\Constant\ConstantStringType;
16+
use Symplify\PHPStanRules\Enum\RuleIdentifier;
1617

1718
/**
1819
* @see \Rector\PHPStanRules\Tests\Rule\NoLeadingBackslashInNameRule\NoLeadingBackslashInNameRuleTest
@@ -60,6 +61,8 @@ public function processNode(Node $node, Scope $scope): array
6061
return [];
6162
}
6263

63-
return [RuleErrorBuilder::message(self::ERROR_MESSAGE)->build()];
64+
return [RuleErrorBuilder::message(self::ERROR_MESSAGE)
65+
->identifier(RuleIdentifier::PHP_PARSER_NO_LEADING_BACKSLASH_IN_NAME)
66+
->build()];
6467
}
6568
}

src/Rules/Rector/PhpUpgradeDowngradeRegisteredInSetRule.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use Rector\Set\ValueObject\DowngradeSetList;
1818
use Rector\Set\ValueObject\SetList;
1919
use SplFileInfo;
20+
use Symplify\PHPStanRules\Enum\RuleIdentifier;
2021
use Symplify\PHPStanRules\Exception\ShouldNotHappenException;
2122

2223
/**
@@ -65,7 +66,9 @@ public function processNode(Node $node, Scope $scope): array
6566
}
6667

6768
$errorMessage = $this->createErrorMessage($configFilePath, $className);
68-
return [RuleErrorBuilder::message($errorMessage)->build()];
69+
return [RuleErrorBuilder::message($errorMessage)
70+
->identifier(RuleIdentifier::RECTOR_UPGRADE_DOWNGRADE_REGISTERED_IN_SET)
71+
->build()];
6972
}
7073

7174
private function resolveRelatedConfigFilePath(string $className): ?string

src/Rules/Rector/PhpUpgradeImplementsMinPhpVersionInterfaceRule.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use PHPStan\Rules\Rule;
1313
use PHPStan\Rules\RuleErrorBuilder;
1414
use Rector\VersionBonding\Contract\MinPhpVersionInterface;
15+
use Symplify\PHPStanRules\Enum\RuleIdentifier;
1516

1617
/**
1718
* @see \Rector\PHPStanRules\Tests\Rule\PhpUpgradeImplementsMinPhpVersionInterfaceRule\PhpUpgradeImplementsMinPhpVersionInterfaceRuleTest
@@ -64,6 +65,10 @@ public function processNode(Node $node, Scope $scope): array
6465
return [];
6566
}
6667

67-
return [RuleErrorBuilder::message(sprintf(self::ERROR_MESSAGE, $className))->build()];
68+
$ruleError = RuleErrorBuilder::message(sprintf(self::ERROR_MESSAGE, $className))
69+
->identifier(RuleIdentifier::RECTOR_PHP_RULE_IMPLEMENTS_MIN_VERSION)
70+
->build();
71+
72+
return [$ruleError];
6873
}
6974
}

src/Rules/Rector/RequireAssertConfigureValueObjectRectorRule.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
use PHPStan\Rules\RuleErrorBuilder;
1919
use PHPStan\Type\ArrayType;
2020
use PHPStan\Type\TypeWithClassName;
21+
use Symplify\PHPStanRules\Enum\ClassName;
22+
use Symplify\PHPStanRules\Enum\RuleIdentifier;
2123
use Webmozart\Assert\Assert;
2224

2325
/**
@@ -54,7 +56,7 @@ public function processNode(Node $node, Scope $scope): array
5456
return [];
5557
}
5658

57-
if (! $classReflection->isSubclassOf('Rector\Contract\Rector\ConfigurableRectorInterface')) {
59+
if (! $classReflection->isSubclassOf(ClassName::CONFIGURABLE_RECTOR_INTERFACE)) {
5860
return [];
5961
}
6062

@@ -66,7 +68,9 @@ public function processNode(Node $node, Scope $scope): array
6668
return [];
6769
}
6870

69-
return [RuleErrorBuilder::message(self::ERROR_MESSAGE)->build()];
71+
return [RuleErrorBuilder::message(self::ERROR_MESSAGE)
72+
->identifier(RuleIdentifier::)
73+
->build()];
7074
}
7175

7276
private function hasAssertAllIsAOfStaticCall(ClassMethod $classMethod): bool

0 commit comments

Comments
 (0)