Skip to content

Releases: rectorphp/rector

Released Rector 0.12.1

09 Nov 16:39
Compare
Choose a tag to compare

Bugfixes 🐛

  • [Php70] Avoid error Undefined property: PhpParser\Node\Stmt\Class_::$namespacedName on ThisCallOnStaticMethodToStaticCallRector (#1197), Thanks @samsonasik!

Released Rector 0.12 with PHPStan 1.0 and lighter Kernel

09 Nov 12:11
Compare
Choose a tag to compare

I'm proud to share the biggest Rector release yet built on work of dozen contributors!

Main focus of this release is on type-completing rules, PHP 7-8 upgrade rules, moving from node attributes to parent node relations and upgrade to PHPStan 1.0.

New Features 🎉

  • Upgrade to Symplify not using symfony/http-kernel (#1119) - Rector is now 10 Symfony packages lighter on every download
  • [Php80] Add Php8ResourceReturnToObjectRector (#1068), Thanks @samsonasik!
  • [Php81] Add Php81ResourceReturnToObjectRector (#1114), Thanks @samsonasik!
  • Extract ObjectReference enum for "self", "static" and "parent" keywords (#1056)
  • [TypeDeclaration] Add TypedPropertyFromStrictGetterMethodReturnTypeRector (#1048)
  • [DowngradePhp54] Add DowngradeStaticClosureRector (#1038), Thanks @Lctrs!
  • [DowngradePhp56] Add DowngradeExponentialOperatorRector (#1181), Thanks @villfa!
  • [DowngradePhp56] Add DowngradeExponentialAssignmentOperatorRector (#1142), Thanks @fezfez!
  • [DowngradePhp74] handle static arrow functions to static closures (#1036), Thanks @Lctrs!
  • [DowngradePhp74] Add DowngradePreviouslyImplementedInterfaceRector (#1159), Thanks @samsonasik!
  • [DowngradePhp74] Handle nested uses on ArrowFunctionToAnonymousFunctionRector (#1040), Thanks @samsonasik!
  • [DowngradePhp81][DowngradePhp80] Add DowngradePhp81ResourceReturnToObjectRector and DowngradePhp80ResourceReturnToObjectRector (#1190), Thanks @samsonasik!
  • [DowngradePhp80/81] Refactor Downgrade Resource Return to Object to use BooleanOr check (#1193), Thanks @samsonasik!
  • Add mask support for skip to StringClassNameToClassConstantRector (#1102)
 use \Rector\Php55\Rector\String_\StringClassNameToClassConstantRector;

 $services->set(StringClassNameToClassConstantRector::class);
    ->call('configure', [[
        StringClassNameToClassConstantRector::CLASSES_TO_SKIP => [
-    		'Nette\Utils\String',
-    		'Nette\Neon\Neon',
-    		'Nette\Application\UI\Presenter',
+    		'Nette\*'
		],
    ]]);

Bugfixes 🐛

  • Fix inverseJoinColumns Doctrine annotation class mapping (#1142), Thanks @fezfez!
  • Fix type without class name mapping without substracted type (#1104)
  • [DeadCode] Skip Route annotation on RemoveDelegatingParentCallRector (#1138), Thanks @samsonasik!
  • [TypeDeclaration] Skip nullable self referencing param and return on AddArrayParamDocTypeRector and ReturnTypeDeclarationRector (#1183), Thanks @samsonasik!
  • [TypeDeclaratoin] Skip variadic param (rectorphp/rector-src@04354c2)
  • Skip union if parent type in ClassMethodParamTypeCompleter (#1103)
  • [DeadCode] Skip dynamic fetch method call on RemoveUnusedPrivateMethodRector (#1128), Thanks @samsonasik!
  • [Renaming] Handle rename property too when parent property renamed (#1031), #6758, Thanks @samsonasik!
  • [Php56] Skip AddDefaultValueForUndefinedVariableRector on has isset check (#1028), #6760, Thanks @samsonasik!
  • Check for ClassLike instance in PropertyFetchFinder (#1033), Thanks @canvural!
  • [AnonymousFunctionFactory] Do not pass variables defined in foreach or parameters list to closure uses (#1038), Thanks @Lctrs!
  • [Php71] Skip typed array property on CountOnNullRector (#1049), Thanks @samsonasik!
  • [Php73] Skip JsonThrowOnErrorRector on passed exact value (#1051), Thanks @samsonasik!
  • [Php80] Skip union callable on ClassPropertyAssignToConstructorPromotionRector (#1101), Thanks @samsonasik!
  • [CodeQuality] Skip Variable may be immutable via New_ or Clone_ on SimplifyUselessVariableRector (#1060), Thanks @samsonasik!
  • [DowngradePhp74] fix uses for nested arrow functions with same param names (#1090), Thanks @Lctrs!
  • [DeadCode] Handle bool var if cond return true next return bool var on RemoveDuplicatedIfReturnRector (#1136), Thanks @samsonasik!
  • fix intersection type with single type (#1086)
  • [TypeDeclaration] Skip ternary on ParamTypeByMethodCallTypeRector (#1131), Thanks @zingimmick!

PHPStan 1.0 Upgrade ⛺️

This Rector version depends on PHPStan more then ever. We're using its php-parser (many of them actually), class name visitor resolver and static/this/self types. That's why we had to take time to make sure the upgrade to PHPStan 1.0 is stable.

  • [PHPStan 1.0] upgrade deprecated getNativeMethods() method (#1069)
  • Improve self/static/parent object reference (#1071)
  • [PHPStan 1.0] Make SelfType, StaticType and ThisType use ClassReflection over string (#1072)
  • SelfType and StaticType are now handled in ObjectTypeSpecifier (#1077)
  • [PHPStan 1.0] Use processNodes() over processNodeStmts() (#1111)
  • [PHPStan 1.0] use selectFromArgs() for function reflectoin to get passed by reference positoins (#1113)
  • [PHPStan 1.0] Remove sorted union types, now handled by default (#1112)
  • [PHPStan 1.0] resolve FunctionReflection getFileName() from main interface (#1117)
  • [PHPStan 1.0] Remove ReflectionWithFilename (#1118)
  • Fix issue of parsing PHP 8 sources on PHP 7.x (#1184), Thanks @ondrejmirtes!
  • [PHPStan 1.0] Remove node naming visitors and re-use PHPStan ones (#1144)
  • PHPStan\Reflection\ClassReflection::getFileName() now returns null|string (rectorphp/rector-src@9686861)
  • PHPStan\Reflection\ClassReflection::getParentClass now returns null|class reflection (rectorphp/rector-src@1cc7dc3)
  • NativeFunctionReflection has new parameter (rectorphp/rector-src@ca82769)
  • Remove ClearReturnNewByReferenceRector, PHPStan cannot handle it (rectorphp/rector-src@051c751)

PHPStan 1.0-Related Changes

Class names are now available in the node itself:

-$className = $node->getAttribute(AttributeKey::CLASS_NAME);

↓

 // in case of class like
+$className = $classLike->namespacedName

 // in case of anonymous class
+$className = $classLike->name

 // or widely used method in AbstractRector
 $className = $this->getName($classLike)

Deprecated/Removed ⚰️

  • [CodingStyle] Deprecate RemoveUnusedAliasRector, job rather for coding standard tool and opinonated (#1157)
  • Remove FileNodeVisitor, available in AbstractRector (#1145)
  • [CodeQuality] Remove FixClassCaseSensitivityNameRector, conflicting with name node removal and edge case already handled by PHPStan reports (#1160)
  • remove deprecated AttributeKey::FILE_INFO const attribute (rectorphp/rector-src@8f7fea0)
  • Remove dead classes (#1133)
  • Remove dead classes #2, remove unused PlatformAgnosticAssertions, remove ConsoleShowOutputFormatter (#1134)
  • [Defluent] Remove often-breaking set (#1062)

Attribute Keys Changes 📈

This is not about PHP 8.0 attributes, but about helper php-parser attributes that allow to store mixed data in any node.

  • Move from CLASS_NODE attribute to more reliable parent node finder (#1162)
  • Move from CLASS_METHOD node attribute to parent finder (#1167)
  • De...
Read more

Released Rector 0.11 with Scoped and PHP 7.1 version by Default

13 May 17:00
Compare
Choose a tag to compare

United Release of Prefixed & Downgraded Version 🚀🚀🚀

For a long time, Rector published 2 releases. It was often confusing which to use when and how they differ. Last couple of month we tried to make them as similar as possible to make transition as smooth as possible.

Since 0.11 we're moving from 2 repositories rectorphp/rector and rectorphp/rector-prefixed to just one rectorphp/rector.
This repository is downgraded to PHP 7.1 and scoped.

Read more in Prefixed Rector by Default.

How to Upgrade?

composer remove rector/rector-prefixed
composer require rector/rector --dev

or

composer update rector/rector:^0.11 --dev

New Features 🎉


Bugfixes 🐛

  • #6390 Fix downgrade scalar types casting in PHP 7.0
  • #6384, #6385, #6386 Fix anonymous class downgrade in PHP 7.0
  • #6378 Fix generic type on in Typed property for PHP 7.4 - thanks @samsonasik

Released Rector 0.10.16 fixing version and allowing older php-parser

30 Apr 09:03
e615756
Compare
Choose a tag to compare

New Features 🎉

  • Added @changelog annotation above rule to explain why the rule does what it does in the output #6073 - thanks @sabbelasichon

Just add it to your Rector rule:

/**
 * @changelog https://wiki.php.net/rfc/typed_properties_v2#proposal
 */
final class TypedPropertyRector extends AbstractRector
{
}

Run Rector:

vendor/bin/rector ...

And if this rule changed the code, it will show the link too:

Applied Rectors:

* TypedPropertyRector - https://wiki.php.net/rfc/typed_properties_v2#proposal


  • [DeadCode] Added RemoveUnusedPrivateMethodParameterRector - #6168
  • Refactored file processors to make use of File object (similar to Scope concept from PHPStan) #6085
  • Added dump_node() helper function to see what node you have #6229 - thanks @ullique for inspiration
dump_node($string);
// change 2nd to increase depth
dump_node($string, 3);

New Downgrade Rules


Bugfixes 🐛

  • Fixed invalid doc block tag crashing #6068
  • Fixed parent, self, static prefixing on class name change #6159
  • Fixed use of AbstractRectorTestCase in tests while using rector/rector-prefixed - f801c76
  • Fixed AUTOLOAD_PATHS and BOOTSTRAP_FILES parameters in tests - #6239
  • Fixed displayed Rector version in rector/rector-prefixed 26d6fff
  • Fixed code conflicts with different php-parser version in rector/rector-prefixed - f15648e, thanks @phpstan for inspiration

Released Rector 0.10.4 with Static Annotation Parser

09 Apr 16:34
Compare
Choose a tag to compare

New Features 🎉

use Symfony\Component\Routing\Annotation\Route;

final class SomeController
{
    /**
     * @Route(path="/some_path", name="some_name")
     */
    public function some()
    {
    }
}
  • #6045 make use of PHPDocNodeTraverser to work with docblock changes

Read more about these features:


Bugfixes 🐛

  • #6057 Restore parent node connection on new node
  • #6064 Fix Php4ConstructorRector with non-stmts content
  • #5967 Fix printing files with fatal errorsage rector deps

Released Rector 0.10 with Static Reflection and PHP 7.1 version

22 Mar 12:46
Compare
Choose a tag to compare

Added Static Reflection 🚀🚀🚀

Do you have files with side effects or missing classes in autoload?

function hi()
{
    echo 'hello';
}

hi();

Static reflection finally refactors code without running it.


Do you still need to include files with constants or custom autoloader? Use BOOTSTRAP_FILES parameter:

$parameters->set(Option::BOOTSTRAP_FILES, [
    __DIR__ . '/constants.php',
    __DIR__ . '/project/special/autoload.php',
]);

Prefixed Rector with min PHP 7.1 🐘

Previous version required at least PHP 7.3 to run or Docker. Both were an obstacle to run Rector out of the box on every project.

We changed that. Now you can run Rector with older PHP and conflicting dependencies with ease:

php --version
# PHP 7.1

composer require symfony/console:^2.8

composer require rector/rector-prefixed:^0.10

Other Changes

  • Inspired by PHPStan, you can run Rector without "process" command if you have configured paths in rector.php:
vendor/bin/rector
13/260 [▓░░░░░░░░░░░░░░░░░░░░░░░░░░░]   5%

Upgrade Today

composer require rector/rector:^0.10
# or prefixed version
composer require rector/rector-prefixed:^0.10

Released Rector 0.9

28 Dec 13:29
5203352
Compare
Choose a tag to compare

New Features 🎉

  • PHP 8 upgrade set
  • Downgrade sets
  • Debuggable scoped Rector

Do you want to know more? Check the Release post

0.8.46

01 Nov 21:18
7ce55d6
Compare
Choose a tag to compare

Summary release for last 2 weeks, since 0.8.28


New Features 🎉

  • [#4490] [EarlyReturn] Brand new set
  • [#4517] [Doctrine] Add a Doctrine DBAL 2.11 set, Thanks @chrisguitarguy
  • [#4526] [CakePHP] Started ruleset for CakePHP 4.2, Thanks @markstory
  • [#4468] [CodeQuality] Added NewStaticToNewSelfRector
  • [#4442] [DoctrineCodeQuality] Added ImproveDoctrineCollectionDocTypeInEntityRector
  • [#4471] [Restoratoin] Added InferParamFromClassMethodReturnRector
  • [#4457] [CodeQualityString] Added MoveOutMethodCallInsideIfConditionRector, Thanks @samsonasik
  • [#4489] [Performance] Add CountArrayToEmptyArrayComparisonRector, Thanks @samsonasik
  • [#4515] [Nette] Add RemoveParentAndNameFromComponentConstructorRector

Changes ⌚

  • AbstractFileSystemRector was dropped and replaced by FileNode, this was a crappy part of Rector, that split node-based refatoring and file-based; now the logic is simplified to essential code, and to workwith file, we can use FileNode
  • [#4510] [TypeDeclaration] We switched types from string "int" fully to @phpstan types new IntegerType()
  • [#4513] Composer v2 was released, so we put it right into our GitHub Actions CI and cut install time to 50 %

Removed 🧹

  • [#4451] [DynamicTypedAnalysis] Very narrow package with lack of practise didn't get any feedback. As unfinished and better suitable for tombstoning, this part was dropped to keep Rector's focus on automated refactoring
  • [#4521] [Decouple] This had only 1 rule, it was hard to configure and use - the set was dropped, better use PHPStorm for local refactoring

They Write about Rector

0.8.28

15 Oct 23:10
16031da
Compare
Choose a tag to compare

This is first release note list, so we included changes from the last month.


New Features 🎉

Do you want to run Rector only on changed files?

# rector.php
use Rector\Core\Configuration\Option;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {
    $parameters = $containerConfigurator->parameters();
    $parameters->set(Option::ENABLE_CACHE, true);
};

  • [#4311] Add init command, so you can create rector.php config
vendor/bin/rector init

# "rector.php" created

  • [#4336] [Restoration] Add RestoreFullyQualifiedNameRector to restore accidentaly shortened class names
-public \SomeClass $someProperty;
+public \App\Full\SomeClass $someProperty;
  • [#4341] [Symfony] Add AutoWireWithClassNameSuffixForMethodWithRequiredAnnotationRector for class method names with @require annotation, Thanks @samsonasik

  • [#4348] [PHP 8.0] Add @required annotation to #[Required] attribute from Symfony 5.2
  • [#4350] [PHP 8.0] Add @route annotation to #[Route] attribute in Symfony 5.2

  • [#4379] [Downgrade PHP 7.4] Added downgrade array spread rule, Thanks @leoloso

composer require rector/simple-php-doc-parser

  • [#4344] [SOLID] Added ChangeAndIfToEarlyReturnRector for refactoring early returns, Thanks @dobryy
 class SomeClass
 {
     public function canDrive(Car $car)
     {
-        if ($car->hasWheels && $car->hasFuel) {
-            return true;
+        if (!$car->hasWheels) {
+            return false;
         }
-        return false;
+        if (!$car->hasFuel) {
+            return false;
+        }
+
+        return true;
     }
 }

Bugfixes 🐛

  • [#4415] Fix ArraySpreadInsteadOfArrayMergeRector for iterator_to_array() function, Thanks @drupol