From 9443586d49cd7d1753530ade01d5c09918065109 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Mon, 14 Sep 2026 13:03:06 +0200 Subject: [PATCH] [Naming] Keep mass nouns ending in "data"/"info" untouched when singularizing Names like "ruleMetadata" ended in lowercase "data", which the Data/Info suffix guard (matching only capitalized "Data"/"Info" words) missed, so they fell through to the plain inflector and became "ruleMetadatum". Claude-Session: https://claude.ai/code/session_01GpZfp2wM56hSqNVvLPSY5T --- .../Fixture/skip_metadata_mass_noun.php.inc | 24 +++++++++++++++++++ .../Source/RuleMetadata.php | 9 +++++++ rules/Naming/RectorNamingInflector.php | 19 +++++++++++---- 3 files changed, 47 insertions(+), 5 deletions(-) create mode 100644 rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Fixture/skip_metadata_mass_noun.php.inc create mode 100644 rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Source/RuleMetadata.php diff --git a/rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Fixture/skip_metadata_mass_noun.php.inc b/rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Fixture/skip_metadata_mass_noun.php.inc new file mode 100644 index 00000000000..bcaac4a467c --- /dev/null +++ b/rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Fixture/skip_metadata_mass_noun.php.inc @@ -0,0 +1,24 @@ +findCore() as $ruleMetadata) { + $array[] = $ruleMetadata; + } + } + + /** + * @return RuleMetadata[] + */ + public function findCore(): array + { + return []; + } +} diff --git a/rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Source/RuleMetadata.php b/rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Source/RuleMetadata.php new file mode 100644 index 00000000000..c3e25b3ffef --- /dev/null +++ b/rules-tests/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector/Source/RuleMetadata.php @@ -0,0 +1,9 @@ +.+)(?Data|Info)$#'; + /** + * Mass nouns ending in lowercase "data"/"info", eg "metadata", must stay untouched + */ + private const string MASS_NOUN_SUFFIX_REGEX = '#(?:data|info)$#'; + public function __construct( private Inflector $inflector ) { @@ -22,13 +27,17 @@ public function __construct( public function singularize(string $name): string { $matches = Strings::match($name, self::DATA_INFO_SUFFIX_REGEX); - if ($matches === null) { - return $this->inflector->singularize($name); + if ($matches !== null) { + $singularized = $this->inflector->singularize((string) $matches['prefix']); + $uninflectable = $matches['suffix']; + + return $singularized . $uninflectable; } - $singularized = $this->inflector->singularize((string) $matches['prefix']); - $uninflectable = $matches['suffix']; + if (Strings::match($name, self::MASS_NOUN_SUFFIX_REGEX) !== null) { + return $name; + } - return $singularized . $uninflectable; + return $this->inflector->singularize($name); } }