Skip to content

Commit 36552aa

Browse files
authored
feat: Add PHPStan-Rule MLL\Utils\PHPStan\Rules\ThrowableClassNameRule (#41)
1 parent 4f745da commit 36552aa

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ See [GitHub releases](https://github.com/mll-lab/php-utils/releases).
99

1010
## Unreleased
1111

12+
## v5.8.0
13+
14+
### Added
15+
16+
- Add PHPStan-Rule `MLL\Utils\PHPStan\Rules\ThrowableClassNameRule`
17+
1218
## v5.7.0
1319

1420
### Added
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php declare(strict_types=1);
2+
3+
namespace MLL\Utils\PHPStan\Rules;
4+
5+
use Illuminate\Support\Str;
6+
use PhpParser\Node;
7+
use PhpParser\Node\Stmt\Class_;
8+
use PHPStan\Analyser\Scope;
9+
use PHPStan\Rules\Rule;
10+
use PHPStan\Rules\RuleErrorBuilder;
11+
12+
/** @implements Rule<Class_> */
13+
class ThrowableClassNameRule implements Rule
14+
{
15+
public function getNodeType(): string
16+
{
17+
return Class_::class;
18+
}
19+
20+
public function processNode(Node $node, Scope $scope): array
21+
{
22+
$nodeName = $node->name;
23+
if ($nodeName === null) {
24+
return [];
25+
}
26+
27+
$className = $nodeName->name;
28+
29+
$extends = $node->extends;
30+
if ($extends === null) {
31+
if (Str::endsWith($className, 'Exception')) {
32+
return [
33+
RuleErrorBuilder::message(<<<TXT
34+
Class "{$className}" is suffixed with "Exception" but does not extend \Exception. Consider using "Exemption" or another term.
35+
TXT)->build(),
36+
];
37+
}
38+
39+
return [];
40+
}
41+
42+
$parentClass = $extends->toString();
43+
$extendsThrowable = is_subclass_of($parentClass, \Exception::class)
44+
|| $parentClass === \Exception::class;
45+
46+
if ($extendsThrowable && ! Str::endsWith($className, 'Exception')) {
47+
return [
48+
RuleErrorBuilder::message(<<<TXT
49+
Class "{$className}" extends \Exception but is not suffixed with "Exception".
50+
TXT)->build(),
51+
];
52+
}
53+
54+
return [];
55+
}
56+
}

0 commit comments

Comments
 (0)