From f7373e877e500d3389152032294fd0c3585e911d Mon Sep 17 00:00:00 2001 From: Piotr Markiewicz Date: Fri, 25 Apr 2025 10:20:20 +0200 Subject: [PATCH] Added Excessive Parameters List rule --- README.md | 10 +++- extension.neon | 21 ++++++- src/Rules/ExcessiveParameterListRule.php | 60 +++++++++++++++++++ tests/ExcessiveParameterListRuleTest.php | 51 ++++++++++++++++ tests/fixtures/ExcessiveParameterListRule.php | 59 ++++++++++++++++++ 5 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 src/Rules/ExcessiveParameterListRule.php create mode 100644 tests/ExcessiveParameterListRuleTest.php create mode 100644 tests/fixtures/ExcessiveParameterListRule.php diff --git a/README.md b/README.md index e237fe1..4867589 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Set of additional PHPStan rules *PHPMD rules* - check for boolean argument flag -- more coming soon ... +- maximum number of parameters (default 10) ## Installation @@ -19,4 +19,12 @@ Edit your phpstan configuration file and add ``` includes: - vendor/pmarki/phpstan-rules/extension.neon +``` + +Additional configuration: +``` +parameters: + pmarki: + excessiveParameterListRule: + maxNumberOfParameters: 10 ``` \ No newline at end of file diff --git a/extension.neon b/extension.neon index 6990faa..b26cedc 100644 --- a/extension.neon +++ b/extension.neon @@ -18,4 +18,23 @@ services: - class: PMarki\PHPStanRules\Rules\BooleanArgumentFlagRule tags: - - phpstan.rules.rule \ No newline at end of file + - phpstan.rules.rule + - + class: PMarki\PHPStanRules\Rules\ExcessiveParameterListRule + arguments: + maxNumberOfParameters: %pmarki.excessiveParameterListRule.maxNumberOfParameters% + tags: + - phpstan.rules.rule + +parameters: + pmarki: + excessiveParameterListRule: + maxNumberOfParameters: 10 + +parametersSchema: + pmarki: structure([ + excessiveParameterListRule: structure([ + maxNumberOfParameters: int(), + ]) + ]) + diff --git a/src/Rules/ExcessiveParameterListRule.php b/src/Rules/ExcessiveParameterListRule.php new file mode 100644 index 0000000..ecbb3f7 --- /dev/null +++ b/src/Rules/ExcessiveParameterListRule.php @@ -0,0 +1,60 @@ + + */ +class ExcessiveParameterListRule implements Rule +{ + public function __construct( + private readonly Ancestors $ancestors, + private readonly int $maxNumberOfParameters, + ) { + } + + public function getNodeType(): string + { + return FunctionLike::class; + } + + /** + * @return array + */ + public function processNode(Node $node, Scope $scope): array + { + if (!$node instanceof FunctionLike) { + return []; + } + + if ($node->name instanceof Node\Identifier && $this->ancestors->methodInherited($node->name->name, $scope)) { + return []; + } + + $numberOfParams = count($node->getParams()); + if ($numberOfParams > $this->maxNumberOfParameters) { + return [ + RuleErrorBuilder::message( + sprintf( + 'Too many parameters in function declaration, expected %s, found %s.', + $this->maxNumberOfParameters, + $numberOfParams, + ) + )->tip('Create a new object to wrap the numerous parameters.') + ->identifier('extraExcessiveParameterList') + ->build(), + ]; + } + + return []; + } +} diff --git a/tests/ExcessiveParameterListRuleTest.php b/tests/ExcessiveParameterListRuleTest.php new file mode 100644 index 0000000..d597218 --- /dev/null +++ b/tests/ExcessiveParameterListRuleTest.php @@ -0,0 +1,51 @@ +analyse( + [ + __DIR__ . '/fixtures/ExcessiveParameterListRule.php', + ], + [ + [ + sprintf( + "Too many parameters in function declaration, expected %s, found 11.%s", + self::MAX_NUMBER_OF_PARAMS, + self::TIP, + ), + 6, + ], + [ + sprintf( + "Too many parameters in function declaration, expected %s, found 11.%s", + self::MAX_NUMBER_OF_PARAMS, + self::TIP, + ), + 34, + ], + ], + ); + } + + protected function getRule(): Rule + { + return new ExcessiveParameterListRule( + new Ancestors(), + self::MAX_NUMBER_OF_PARAMS, + ); + } +} diff --git a/tests/fixtures/ExcessiveParameterListRule.php b/tests/fixtures/ExcessiveParameterListRule.php new file mode 100644 index 0000000..911ee4f --- /dev/null +++ b/tests/fixtures/ExcessiveParameterListRule.php @@ -0,0 +1,59 @@ +