From 48acf9987ec9c6623f94516461ef10a7e745a974 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 29 Jun 2026 11:14:22 +0200 Subject: [PATCH] [CodeQuality] Deprecate JoinStringConcatRector as depends on context and personal preference, hard to generalize --- phpstan.neon | 1 + .../Fixture/single_concat.php.inc | 27 --------- .../Fixture/skip_longer_than_120.php.inc | 13 ----- .../Fixture/skip_multiple_lines.php.inc | 14 ----- .../Fixture/skip_multiple_newline.php.inc | 11 ---- .../Fixture/skip_newline.php.inc | 11 ---- .../Fixture/skip_with_ascii.php.inc | 11 ---- .../Fixture/three_items.php.inc | 31 ---------- .../JoinStringConcatRectorTest.php | 28 --------- .../config/configured_rule.php | 9 --- .../Rector/Concat/JoinStringConcatRector.php | 58 +++---------------- src/Config/Level/CodeQualityLevel.php | 2 - 12 files changed, 9 insertions(+), 207 deletions(-) delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/single_concat.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_longer_than_120.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_multiple_lines.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_multiple_newline.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_newline.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_with_ascii.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/three_items.php.inc delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/JoinStringConcatRectorTest.php delete mode 100644 rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/config/configured_rule.php diff --git a/phpstan.neon b/phpstan.neon index 3114dd9d2a6..5a124796077 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -418,6 +418,7 @@ parameters: - '#Class "Rector\\Php70\\Rector\\StaticCall\\StaticCallOnNonStaticToInstanceCallRector" is missing @see annotation with test case class reference#' - '#Class "Rector\\TypeDeclaration\\Rector\\ClassMethod\\StrictStringParamConcatRector" is missing @see annotation with test case class reference#' - '#Class "Rector\\CodingStyle\\Rector\\Enum_\\EnumCaseToPascalCaseRector" is missing @see annotation with test case class reference#' + - '#Class "Rector\\CodeQuality\\Rector\\Concat\\JoinStringConcatRector" is missing @see annotation with test case class reference#' # false positive - diff --git a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/single_concat.php.inc b/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/single_concat.php.inc deleted file mode 100644 index d9bb80bbb49..00000000000 --- a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/single_concat.php.inc +++ /dev/null @@ -1,27 +0,0 @@ - ------ - diff --git a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_longer_than_120.php.inc b/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_longer_than_120.php.inc deleted file mode 100644 index f42681639eb..00000000000 --- a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/Fixture/skip_longer_than_120.php.inc +++ /dev/null @@ -1,13 +0,0 @@ - ------ - diff --git a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/JoinStringConcatRectorTest.php b/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/JoinStringConcatRectorTest.php deleted file mode 100644 index 63015f88e40..00000000000 --- a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/JoinStringConcatRectorTest.php +++ /dev/null @@ -1,28 +0,0 @@ -doTestFile($filePath); - } - - public static function provideData(): Iterator - { - return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); - } - - public function provideConfigFilePath(): string - { - return __DIR__ . '/config/configured_rule.php'; - } -} diff --git a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/config/configured_rule.php b/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/config/configured_rule.php deleted file mode 100644 index adf827d06d1..00000000000 --- a/rules-tests/CodeQuality/Rector/Concat/JoinStringConcatRector/config/configured_rule.php +++ /dev/null @@ -1,9 +0,0 @@ -withRules([JoinStringConcatRector::class]); diff --git a/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php b/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php index 60103f05bba..8ea81cf8c01 100644 --- a/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php +++ b/rules/CodeQuality/Rector/Concat/JoinStringConcatRector.php @@ -4,28 +4,19 @@ namespace Rector\CodeQuality\Rector\Concat; -use Nette\Utils\Strings; use PhpParser\Node; use PhpParser\Node\Expr\BinaryOp\Concat; -use PhpParser\Node\Scalar\String_; +use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; -use Rector\Util\StringUtils; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\CodeQuality\Rector\Concat\JoinStringConcatRector\JoinStringConcatRectorTest + * @deprecated as depends on context and personal preference, hard to generalize. Handle it manually or via a custom rule instead. */ -final class JoinStringConcatRector extends AbstractRector +final class JoinStringConcatRector extends AbstractRector implements DeprecatedInterface { - private const int LINE_BREAK_POINT = 100; - - /** - * @see https://regex101.com/r/VaXM1t/1 - * @see https://stackoverflow.com/questions/4147646/determine-if-utf-8-text-is-all-ascii - */ - private const string ASCII_REGEX = '#[^\x00-\x7F]#'; - public function getRuleDefinition(): RuleDefinition { return new RuleDefinition( @@ -69,42 +60,9 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if (! $node->left instanceof String_) { - return null; - } - - if (! $node->right instanceof String_) { - return null; - } - - $leftStartLine = $node->left->getStartLine(); - $rightStartLine = $node->right->getStartLine(); - - if ($leftStartLine > 0 && $rightStartLine > 0 && $rightStartLine > $leftStartLine) { - return null; - } - - return $this->joinConcatIfStrings($node->left, $node->right); - } - - private function joinConcatIfStrings(String_ $leftString, String_ $rightString): ?String_ - { - $leftValue = $leftString->value; - $rightValue = $rightString->value; - - if (str_contains($leftValue, "\n") || str_contains($rightValue, "\n")) { - return null; - } - - $joinedStringValue = $leftValue . $rightValue; - if (StringUtils::isMatch($joinedStringValue, self::ASCII_REGEX)) { - return null; - } - - if (Strings::length($joinedStringValue) >= self::LINE_BREAK_POINT) { - return null; - } - - return new String_($joinedStringValue); + throw new ShouldNotHappenException(sprintf( + '"%s" is deprecated as depends on context and personal preference, hard to generalize. Handle it manually or via a custom rule instead', + self::class + )); } } diff --git a/src/Config/Level/CodeQualityLevel.php b/src/Config/Level/CodeQualityLevel.php index 92ffa6a1970..e4d3b3954a4 100644 --- a/src/Config/Level/CodeQualityLevel.php +++ b/src/Config/Level/CodeQualityLevel.php @@ -26,7 +26,6 @@ use Rector\CodeQuality\Rector\ClassMethod\InlineArrayReturnAssignRector; use Rector\CodeQuality\Rector\ClassMethod\LocallyCalledStaticMethodToNonStaticRector; use Rector\CodeQuality\Rector\ClassMethod\OptionalParametersAfterRequiredRector; -use Rector\CodeQuality\Rector\Concat\JoinStringConcatRector; use Rector\CodeQuality\Rector\Empty_\SimplifyEmptyCheckOnEmptyArrayRector; use Rector\CodeQuality\Rector\Equal\UseIdenticalOverEqualWithSameTypeRector; use Rector\CodeQuality\Rector\Expression\InlineIfToExplicitIfRector; @@ -138,7 +137,6 @@ final class CodeQualityLevel SingleInArrayToCompareRector::class, SimplifyIfElseToTernaryRector::class, TernaryImplodeToImplodeRector::class, - JoinStringConcatRector::class, ConsecutiveNullCompareReturnsToNullCoalesceQueueRector::class, ExplicitBoolCompareRector::class, CombineIfRector::class,