From a8ef9b3f007361671b0fefd7435f420ba2fe305a Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 20 Jul 2026 00:54:41 +0200 Subject: [PATCH] Skip StandaloneLinePlainConstructorParamFixer for 3 or fewer params --- ...andaloneLinePlainConstructorParamFixer.php | 44 ++++++++++++++----- .../Fixture/plain_params.php.inc | 5 ++- .../Fixture/skip_three_params.php.inc | 10 +++++ 3 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/skip_three_params.php.inc diff --git a/packages/coding-standard/src/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer.php b/packages/coding-standard/src/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer.php index b03a5a2637..f20f19edd8 100644 --- a/packages/coding-standard/src/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer.php +++ b/packages/coding-standard/src/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer.php @@ -17,7 +17,8 @@ use Symplify\CodingStandard\TokenAnalyzer\ParamNewliner; /** - * Every parameter of a constructor without promoted properties must be on a standalone line. + * Every parameter of a constructor without promoted properties must be on a standalone line, unless the constructor + * has 3 or less parameters. * * Constructors with promoted properties are handled by @see StandaloneLinePromotedPropertyFixer, so both rules can * be used side by side without processing the same constructor twice. @@ -28,6 +29,11 @@ final class StandaloneLinePlainConstructorParamFixer extends AbstractSymplifyFix { private const string ERROR_MESSAGE = 'Constructor param should be on a standalone line to ease git diffs on new dependency'; + /** + * Short parameter lists are readable on a single line. + */ + private const int MIN_PARAM_COUNT = 4; + /** * @var int[] */ @@ -99,7 +105,7 @@ public function fix(SplFileInfo $fileInfo, Tokens $tokens): void continue; } - if (! $this->hasParams($tokens, $paramBracketPosition)) { + if ($this->countParams($tokens, $paramBracketPosition) < self::MIN_PARAM_COUNT) { continue; } @@ -125,21 +131,35 @@ private function resolveOpenBracketPosition(Tokens $tokens, int $position): ?int } /** - * An empty parameter list would be broken into an empty line between the brackets. - * * @param Tokens $tokens */ - private function hasParams(Tokens $tokens, int $openBracketPosition): bool + private function countParams(Tokens $tokens, int $openBracketPosition): int { - $firstParamPosition = $tokens->getNextMeaningfulToken($openBracketPosition); - if ($firstParamPosition === null) { - return false; - } + $closeBracketPosition = $tokens->findBlockEnd(Tokens::BLOCK_TYPE_PARENTHESIS_BRACE, $openBracketPosition); + + $paramCount = 0; + $nestingLevel = 0; - /** @var Token $firstParamToken */ - $firstParamToken = $tokens[$firstParamPosition]; + for ($index = $openBracketPosition + 1; $index < $closeBracketPosition; ++$index) { + /** @var Token $token */ + $token = $tokens[$index]; + + if ($token->equalsAny(['(', '[', '{'])) { + ++$nestingLevel; + continue; + } + + if ($token->equalsAny([')', ']', '}'])) { + --$nestingLevel; + continue; + } + + if ($nestingLevel === 0 && $token->isGivenKind(T_VARIABLE)) { + ++$paramCount; + } + } - return $firstParamToken->getContent() !== ')'; + return $paramCount; } /** diff --git a/packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/plain_params.php.inc b/packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/plain_params.php.inc index ea1f6e5ee7..cc53839e57 100644 --- a/packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/plain_params.php.inc +++ b/packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/plain_params.php.inc @@ -4,7 +4,7 @@ namespace Symplify\CodingStandard\Tests\Fixer\Spacing\StandaloneLinePlainConstru final class PlainParams { - public function __construct(CorePermissions $security, Translator $translator, RouterInterface $router) + public function __construct(CorePermissions $security, Translator $translator, RouterInterface $router, Logger $logger) { } } @@ -20,7 +20,8 @@ final class PlainParams public function __construct( CorePermissions $security, Translator $translator, - RouterInterface $router + RouterInterface $router, + Logger $logger ) { } diff --git a/packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/skip_three_params.php.inc b/packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/skip_three_params.php.inc new file mode 100644 index 0000000000..f9855488fa --- /dev/null +++ b/packages/coding-standard/tests/Fixer/Spacing/StandaloneLinePlainConstructorParamFixer/Fixture/skip_three_params.php.inc @@ -0,0 +1,10 @@ +