Released Rector 2.5
New Features 🥳 🎉 🎉 🎉
This release has 3 interesting new features. Let's look at them:
[dx] Report skips that never matched (#8058)
-
What? - like PHPStan's
reportUnusedIgnores, but for Rector->withSkip(). Flags skip entries that never matched anything during the run, so you can delete stale skips. -
Why? - skips rot. You skip a path/rule to dodge a problem, later the file moves or the rule stops firing there — the skip lingers forever,
silently masking nothing. This surfaces dead skips so config stays honest.
// rector.php
return RectorConfig::configure()
->withSkip([
SimplifyUselessVariableRector::class => [
'*/src/Legacy/*', // still matches — fine
'*/NonexistentUnused/*', // matches nothing — stale
],
])
->reportUnusedSkips();Run output:
[OK] Rector is done!
[WARNING] This skip is unused, it never matched any element.
You can remove it from "->withSkip()"
* Rector\CodeQuality\Rector\FunctionLike\SimplifyUselessVariableRector => */NonexistentUnused/*[dx] Removing unused imports by default (#8047)
You can update your rector.php config:
return RectorConfig::configure()
- ->withImportNames(removeUnusedImports: true);
+ ->withImportNames();In case it's not for you, turn it off:
return RectorConfig::configure()
- ->withImportNames();
+ ->withImportNames(removeUnusedImports: false);[dx] Introducing Drupal composer-based sets (#8041), Thanks @bbrala!
If you're using Drupal Rector, you can now enable it's per-version sets via:
return RectorConfig::configure()
+ ->withComposerBased(drupal: true);To learn more about composer-based-sets, checkout the documentation.
New Rules 🎉
- [php 8.4] [type-declaration] Add
AddArrayAnyAllClosureParamTypeRectorandNarrowArrayAnyAllNullableParamTypeRector(#8049) - [code-quality] Add
MoveInnerFunctionToTopLevelRector(#8042) - [code-quality] Add
NewArrayItemConcatAssignToAssignRector(#8045) - [code-quality] Add
FixClassCaseSensitivityVarDocblockRector(#8046) - [polyfills] add missing polyfill to PHP 8.4 array functions (#8052)
- [rector] Add
AddParamTypeToRefactorMethodRectorif missing (#8061)
Bugfixes 🐛
- [internal] Streamline use imports management to FileNode (#8040)
- [PostRector] Do not keep an unused import matched only by a partial docblock name's tail (#8043), Thanks @ruudk!
- [CodeQuality] Skip native function on
MoveInnerFunctionToTopLevelRector(#8044) - Fix
--onlyruns caching files as unchanged, hiding pending changes from full runs (#8029), Thanks @SanderMuller! - [fix] Fix
RemoveUnusedPrivateMethodRectorfor NeverType (#8050) - [dead-code] Fix RemoveUnusedVariableAssignRector, allow for SplFileInfo as cleanup on purpose for gc (#8054)
- [fixes] Couple ClassPropertyAssignToConstructorPromotionRector, RemoveAlwaysTrueIfConditionRector and RemoveUnusedVariableAssignRector fixes (#8055)
- [TypeDeclaration][DeadCode] Skip class with Doctrine static function mapping (loadMetadata) in TypedPropertyFromAssignsRector and RemoveUnusedPrivatePropertyRector (#8059)
- [TypeDeclaration] Skip class with Doctrine static function mapping (loadMetadata) in TypedPropertyFromStrictConstructorRector (#8060)
rectorphp/rector-doctrine 🟠
- [NodeAnalyzer] Detect Doctrine static function mapping (loadMetadata) entity in DoctrineEntityDetector (736bf61)