From b7748e003ac4de827bded413825bd467bbca8021 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 16 Oct 2025 12:37:53 +0100 Subject: [PATCH] fix: JIRA-16017 Resolve multi-line array shapes This resolves an issue where multi-line array shapes were being unnecessarily modified. --- composer.json | 2 +- src/PhpCsFixer/SpaceInGenericsFixer.php | 18 +++++-------- tests/PhpCsFixer/SpaceInGenericsFixerTest.php | 27 +++++++++++++++++++ 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/composer.json b/composer.json index 412d3a6..d59f7fa 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "rector/rector": "^2.0", "slevomat/coding-standard": "^8.16", "spaze/phpstan-disallowed-calls": "^4.4", - "symplify/easy-coding-standard": "^12.5" + "symplify/easy-coding-standard": "^12.6" }, "require-dev": { "composer/composer": "^2.8", diff --git a/src/PhpCsFixer/SpaceInGenericsFixer.php b/src/PhpCsFixer/SpaceInGenericsFixer.php index a230625..0e39544 100644 --- a/src/PhpCsFixer/SpaceInGenericsFixer.php +++ b/src/PhpCsFixer/SpaceInGenericsFixer.php @@ -9,6 +9,7 @@ use PhpCsFixer\FixerDefinition\CodeSample; use PhpCsFixer\FixerDefinition\FixerDefinition; use PhpCsFixer\FixerDefinition\FixerDefinitionInterface; +use PhpCsFixer\Preg; use PhpCsFixer\Tokenizer\Token; use PhpCsFixer\Tokenizer\Tokens; use SplFileInfo; @@ -27,13 +28,7 @@ public function getDefinition(): FixerDefinitionInterface protected function fixType(string $type): string { - $newType = preg_replace('/\h*,\s*/', ', ', $type); - - if ($newType === $type) { - return $type; - } - - return $this->fixType($newType); + return Preg::replace('/,(?!\\R)\\s*/', ', ', Preg::replace('/\\h*,/', ',', $type)); } public function fix(SplFileInfo $file, Tokens $tokens): void @@ -50,13 +45,14 @@ public function fix(SplFileInfo $file, Tokens $tokens): void continue; } - $typeExpression = $annotation->getTypeExpression(); - if ($typeExpression === null) { + $types = $annotation->getTypes(); + if ($types === []) { continue; } - $type = $this->fixType($typeExpression->toString()); - $annotation->setTypes([$type]); + $types = \array_map(fn (string $x): string => $this->fixType($x), $types); + + $annotation->setTypes($types); } $newContent = $docBlock->getContent(); diff --git a/tests/PhpCsFixer/SpaceInGenericsFixerTest.php b/tests/PhpCsFixer/SpaceInGenericsFixerTest.php index bcd9fdb..562180d 100644 --- a/tests/PhpCsFixer/SpaceInGenericsFixerTest.php +++ b/tests/PhpCsFixer/SpaceInGenericsFixerTest.php @@ -83,4 +83,31 @@ * @return array Description having "," should not be touched */', ]; + + yield [ + '|ExtensionInterface>, + * renderers?: array{ + * fenced?: array|NodeRendererInterface>, + * indented?: array|NodeRendererInterface> + * }, + * languages?: array + * } + */', + '|ExtensionInterface>, + * renderers?: array{ + * fenced?: array|NodeRendererInterface>, + * indented?: array|NodeRendererInterface> + * }, + * languages?: array + * } + */', + ]; });