From 7a2c4a0924b6886b2eab5d48b35d1c021b6aa48e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Oct 2023 13:57:10 +0200 Subject: [PATCH] Bump rector/rector from 0.18.5 to 0.18.6 (#136) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Markus Staab --- composer.json | 2 +- composer.lock | 24 ++-- vendor/composer/installed.json | 26 ++-- vendor/composer/installed.php | 16 +-- vendor/phpstan/phpstan/phpstan.phar | Bin 22085270 -> 22093632 bytes vendor/phpstan/phpstan/phpstan.phar.asc | 26 ++-- vendor/rector/rector/bin/rector.php | 1 - .../rector/rector/config/set/code-quality.php | 3 +- vendor/rector/rector/config/set/dead-code.php | 2 + vendor/rector/rector/config/set/php80.php | 3 +- .../rector/packages/Config/RectorConfig.php | 9 -- .../NodeTypeResolver/NodeTypeResolver.php | 3 + .../Scope/PHPStanNodeScopeResolver.php | 1 + .../TypeAnalyzer/BoolUnionTypeAnalyzer.php | 18 --- .../TypeAnalyzer/UnionTypeAnalyzer.php | 9 +- .../TypeMapper/UnionTypeMapper.php | 99 +++---------- .../ValueObject/UnionTypeAnalysis.php | 12 +- .../SimpleCallableNodeTraverser.php | 2 +- .../NodeVisitor/CallableNodeVisitor.php | 22 ++- .../SimplifyBoolIdenticalTrueRector.php | 2 +- .../Rector/If_/CombineIfRector.php | 2 + .../CompleteMissingIfElseBracketRector.php | 108 +++++++++++++++ ...OnPropertyObjectToPropertyExistsRector.php | 4 + .../NodeManipulator/CountManipulator.php | 19 ++- .../PhpDoc/DeadReturnTagValueNodeAnalyzer.php | 6 +- .../RemoveUnusedVariableAssignRector.php | 4 +- .../Rector/Cast/RecastingRemovalRector.php | 8 +- ...moveUselessReturnExprInConstructRector.php | 116 ++++++++++++++++ .../For_/RemoveDeadIfForeachForRector.php | 98 ++++++++++--- .../Foreach_/RemoveUnusedForeachKeyRector.php | 50 +++++-- ...UnusedNonEmptyArrayBeforeForeachRector.php | 31 ++++- .../RemoveNonExistingVarAnnotationRector.php | 13 +- .../SideEffect/PureFunctionDetector.php | 1 + .../MatchParamTypeExpectedNameResolver.php | 10 +- .../Guard/BreakingVariableRenameGuard.php | 12 +- .../Naming/Naming/ExpectedNameResolver.php | 16 ++- .../RenameVariableToMatchNewTypeRector.php | 4 + ...iableToMatchMethodCallReturnTypeRector.php | 7 + .../ClassMethod/Php4ConstructorRector.php | 2 +- .../ArraySpreadInsteadOfArrayMergeRector.php | 9 +- ...eturnTypeFromStrictScalarReturnsRector.php | 28 +++- ...eturnTypeFromStrictScalarReturnsRector.php | 20 ++- ...dReturnTypeDeclarationFromYieldsRector.php | 19 ++- .../DeclareStrictTypesRector.php | 4 + .../rules/TypeDeclaration/TypeNormalizer.php | 42 +----- .../Application/ChangedNodeScopeRefresher.php | 1 - .../src/Application/VersionResolver.php | 4 +- .../LazyContainerFactory.php | 2 +- .../rector/src/NodeAnalyzer/ExprAnalyzer.php | 20 ++- .../rector/src/NodeAnalyzer/ScopeAnalyzer.php | 28 ---- .../rector/src/PhpParser/AstResolver.php | 56 ++++---- .../src/PhpParser/ClassLikeAstResolver.php | 62 --------- .../rector/src/PhpParser/Node/NodeFactory.php | 20 +-- .../src/ProcessAnalyzer/RectifiedAnalyzer.php | 18 ++- .../rector/src/Rector/AbstractRector.php | 4 +- .../src/Rector/AbstractScopeAwareRector.php | 12 -- .../rector/src/ValueObject/PhpVersion.php | 4 + vendor/rector/rector/src/constants.php | 13 -- vendor/rector/rector/vendor/autoload.php | 2 +- .../vendor/composer/autoload_classmap.php | 7 +- .../rector/vendor/composer/autoload_files.php | 1 - .../rector/vendor/composer/autoload_real.php | 10 +- .../vendor/composer/autoload_static.php | 16 ++- .../rector/vendor/composer/installed.json | 54 ++++---- .../rector/vendor/composer/installed.php | 2 +- .../rector/vendor/composer/pcre/src/Preg.php | 2 +- .../xdebug-handler/src/XdebugHandler.php | 2 +- .../src/GeneratedConfig.php | 2 +- .../config/set/downgrade-php81.php | 3 +- ...DowngradeProcOpenArrayCommandArgRector.php | 7 +- .../DowngradeHashAlgorithmXxHashRector.php | 131 ++++++++++++++++++ .../config/sets/phpunit-code-quality.php | 4 +- .../rector-phpunit/config/sets/phpunit100.php | 1 + ...NullableObjectToAssertInstanceofRector.php | 97 +++++++++++++ .../WithConsecutiveRector.php | 94 +++++++++++-- .../sets/symfony/symfony-code-quality.php | 3 + .../ClassMethod/ActionSuffixRemoverRector.php | 3 + ...ameResponseCodeWithDebugContentsRector.php | 115 +++++++++++++++ ...tionBuilderToRoutingConfiguratorRector.php | 20 ++- .../vendor/symfony/console/Terminal.php | 2 +- 80 files changed, 1185 insertions(+), 550 deletions(-) delete mode 100644 vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/BoolUnionTypeAnalyzer.php create mode 100644 vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php create mode 100644 vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php delete mode 100644 vendor/rector/rector/src/PhpParser/ClassLikeAstResolver.php delete mode 100644 vendor/rector/rector/src/constants.php create mode 100644 vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php diff --git a/composer.json b/composer.json index e61bed6ae..081fa1c34 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "require": { "php": ">=7.4", - "rector/rector": "0.18.5", + "rector/rector": "0.18.6", "friendsofphp/php-cs-fixer": "3.35.1", "redaxo/php-cs-fixer-config": "^1.0" }, diff --git a/composer.lock b/composer.lock index b1d00caf9..e702f3232 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "743a8f224ddc727c44b2d0332245f2e8", + "content-hash": "6477ab0fd5ee213caa372ad95d93244b", "packages": [ { "name": "composer/pcre", @@ -319,16 +319,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.38", + "version": "1.10.39", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691" + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5302bb402c57f00fb3c2c015bac86e0827e4b691", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", "shasum": "" }, "require": { @@ -377,7 +377,7 @@ "type": "tidelift" } ], - "time": "2023-10-06T14:19:14+00:00" + "time": "2023-10-17T15:46:26+00:00" }, { "name": "psr/container", @@ -529,16 +529,16 @@ }, { "name": "rector/rector", - "version": "0.18.5", + "version": "0.18.6", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "2a3b82f317e431fc142d21f3303891a4e64c96eb" + "reference": "02041b220704b9cbe075f0310d0954b2fda5c40c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/2a3b82f317e431fc142d21f3303891a4e64c96eb", - "reference": "2a3b82f317e431fc142d21f3303891a4e64c96eb", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/02041b220704b9cbe075f0310d0954b2fda5c40c", + "reference": "02041b220704b9cbe075f0310d0954b2fda5c40c", "shasum": "" }, "require": { @@ -573,7 +573,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.5" + "source": "https://github.com/rectorphp/rector/tree/0.18.6" }, "funding": [ { @@ -581,7 +581,7 @@ "type": "github" } ], - "time": "2023-10-05T11:25:40+00:00" + "time": "2023-10-24T15:00:59+00:00" }, { "name": "redaxo/php-cs-fixer-config", diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 77f0ab0b3..f14af0602 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -325,17 +325,17 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.38", - "version_normalized": "1.10.38.0", + "version": "1.10.39", + "version_normalized": "1.10.39.0", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691" + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/5302bb402c57f00fb3c2c015bac86e0827e4b691", - "reference": "5302bb402c57f00fb3c2c015bac86e0827e4b691", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/d9dedb0413f678b4d03cbc2279a48f91592c97c4", + "reference": "d9dedb0413f678b4d03cbc2279a48f91592c97c4", "shasum": "" }, "require": { @@ -344,7 +344,7 @@ "conflict": { "phpstan/phpstan-shim": "*" }, - "time": "2023-10-06T14:19:14+00:00", + "time": "2023-10-17T15:46:26+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -547,17 +547,17 @@ }, { "name": "rector/rector", - "version": "0.18.5", - "version_normalized": "0.18.5.0", + "version": "0.18.6", + "version_normalized": "0.18.6.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "2a3b82f317e431fc142d21f3303891a4e64c96eb" + "reference": "02041b220704b9cbe075f0310d0954b2fda5c40c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/2a3b82f317e431fc142d21f3303891a4e64c96eb", - "reference": "2a3b82f317e431fc142d21f3303891a4e64c96eb", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/02041b220704b9cbe075f0310d0954b2fda5c40c", + "reference": "02041b220704b9cbe075f0310d0954b2fda5c40c", "shasum": "" }, "require": { @@ -570,7 +570,7 @@ "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, - "time": "2023-10-05T11:25:40+00:00", + "time": "2023-10-24T15:00:59+00:00", "bin": [ "bin/rector" ], @@ -594,7 +594,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.5" + "source": "https://github.com/rectorphp/rector/tree/0.18.6" }, "funding": [ { diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index c22abd571..36e68e3ad 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => '__root__', 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '751cecfb121f04bc07ddec2e227c0cc1bba81278', + 'reference' => 'ec69a5f08b5a3f6f3feaf8e755f2b632ee7d6270', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '751cecfb121f04bc07ddec2e227c0cc1bba81278', + 'reference' => 'ec69a5f08b5a3f6f3feaf8e755f2b632ee7d6270', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -56,9 +56,9 @@ 'dev_requirement' => false, ), 'phpstan/phpstan' => array( - 'pretty_version' => '1.10.38', - 'version' => '1.10.38.0', - 'reference' => '5302bb402c57f00fb3c2c015bac86e0827e4b691', + 'pretty_version' => '1.10.39', + 'version' => '1.10.39.0', + 'reference' => 'd9dedb0413f678b4d03cbc2279a48f91592c97c4', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), @@ -104,9 +104,9 @@ ), ), 'rector/rector' => array( - 'pretty_version' => '0.18.5', - 'version' => '0.18.5.0', - 'reference' => '2a3b82f317e431fc142d21f3303891a4e64c96eb', + 'pretty_version' => '0.18.6', + 'version' => '0.18.6.0', + 'reference' => '02041b220704b9cbe075f0310d0954b2fda5c40c', 'type' => 'library', 'install_path' => __DIR__ . '/../rector/rector', 'aliases' => array(), diff --git a/vendor/phpstan/phpstan/phpstan.phar b/vendor/phpstan/phpstan/phpstan.phar index e15dae3b2b3e9e288bb060bae06de4b7eb63b411..2f8b0889ace420b871d34e3d23366c5545d0e477 100755 GIT binary patch delta 172098 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

0$#IgG#f)>qKcSkUp925~sh)UH%alkIs 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 w#dR}g|53zz+eS?6cbw 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 diff --git a/vendor/phpstan/phpstan/phpstan.phar.asc b/vendor/phpstan/phpstan/phpstan.phar.asc index 8d51d59b9..b9d6e386a 100644 --- a/vendor/phpstan/phpstan/phpstan.phar.asc +++ b/vendor/phpstan/phpstan/phpstan.phar.asc @@ -1,16 +1,16 @@ -----BEGIN PGP SIGNATURE----- -iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmUgF0sACgkQUcZzBf/C -5cA9pg/9G+QHFiTkxBu1LUiDhsxnBZqxj/GPQKjJUXtl/XGOxVK8w4R1zvJKn9Te -Kd76wzc7qoif/dnyl7Pcr1CMvHvN8DG2Ke40dqNMv9TSFcYuYUtJG2f8H6mTMs1C -F34dTlozorEoMG3R63W3kZ7QVJZE6LVPnCI6rjBjnqqhKJqYGsvb2rny2ogUtQoA -mNaEcFHa3qOJ67FRJWDbn+quR2GzWQcuTh7htSRwGAFZc5LUY4cpbZqksy2c7Pmm -B/c9CIsOp0rE9s7fmUiFDzVpNQx+EV74ZJddxZPn4FmoLN7+AzYwLg9T3YIujeWB -a3J1HV7M1/BICxBl1OtjFz2leWrwkdnNZh9bXVRFGZayG2I5EWr4N2EySSJzDypz -wD8Hdl1EVwYTVbt9yZhvff3LuDc6u5jIshlfDELtPsw2aQL0rb4268e9UB4RjOFn -NFK7KBBmsdXCUrYGWwqyyZBSDM7UMlPFTpBvoQo9+t8QNOYFEj2CCPL4U3tKiWW1 -TiHCdzHjBlKrRQrMZnHmRzjGYfpeLpkdxAkxWNomKFImVxG9E/HwP3Sxf5vttOtm -YHDrKChwDvmDRGlt6eqaqqDFfcnbkk6b3x6UEPt8rlxi2alVAqlCDiT0O6g+s7/I -gZNJOvVcYmi+HgrwxvSCITfTJhK7RFrCsB+fbqmGesLIHIQklaE= -=hdHc +iQIzBAABCgAdFiEEynwsejDI6OEnSoR2UcZzBf/C5cAFAmUurDUACgkQUcZzBf/C +5cB3EBAAliV1KtpxdUv1UtLFxgKx5eREf3SFAwzogUu/UYOGKX3s36pZ93CpveIg +7Qj2hiAyKiel/J6nTMtR0Ix0KxHcsVX8S3jxNZ9zxFVfkynL1S+d8REt2IHp5/6F +zEtEjwvnSgYxAMG7WhJQKoBti7IFoTmapfl9k0Xpd6BAgmZIAxpEIn+fs2swyFbt +v1esDqgPXoUfK9KygU4xgSlDmo/nzCziYNSP6ouSXDfO/eafdGC3l5YeiDTSrRdj +35XTqXlfl7dw/GJuMopRV7JpFLwLfaEB1Tsz5ykRodsDnyb22IpVAoXcZBp9/9lp +bk0Kygn9Va1acIU1zt7KBC8/DL1+G4pWI1ObxA3LbjwzeU0MMHVc+8iEei9NFQcM +JRpXt2u0GPZlKS0qKqypyEl+0WIfB6ajhUQSyNFRpR2H3HdonqZtFc+0O/CsVBw5 +6J9sJsvOMHowlQU3CNMiZUJucR//0MIzGFz7TWN47DN2BRzpopmELEq4w9ZevqDX +wb251Bx3jQeREwFj9wy9/uAL0Tn8n8QPlTSsQEHHMbmbqVExfHXfWe/Xz/Ie+Qd6 +dSvqf5yZ0/vfw54Lfm5IMl+9cmugMsRBQLD8trclIGh8MuP17Gw2g9HceaSFWrnL +0hyEwcktUx/L8VTTLCnAfFjhpYLGkoc2iPUw2npmilUbXCy+fZ8= +=yIG3 -----END PGP SIGNATURE----- diff --git a/vendor/rector/rector/bin/rector.php b/vendor/rector/rector/bin/rector.php index a19aaf907..df6876800 100755 --- a/vendor/rector/rector/bin/rector.php +++ b/vendor/rector/rector/bin/rector.php @@ -100,7 +100,6 @@ public function loadIfExistsAndNotLoadedYet(string $filePath) : void if (\file_exists(__DIR__ . '/../preload-split-package.php') && \is_dir(__DIR__ . '/../../../../vendor')) { require_once __DIR__ . '/../preload-split-package.php'; } -require_once __DIR__ . '/../src/constants.php'; $autoloadIncluder->loadIfExistsAndNotLoadedYet(__DIR__ . '/../vendor/scoper-autoload.php'); $autoloadIncluder->autoloadProjectAutoloaderFile(); $autoloadIncluder->autoloadRectorInstalledAsGlobalDependency(); diff --git a/vendor/rector/rector/config/set/code-quality.php b/vendor/rector/rector/config/set/code-quality.php index 048ccf10d..c1191d37b 100644 --- a/vendor/rector/rector/config/set/code-quality.php +++ b/vendor/rector/rector/config/set/code-quality.php @@ -52,6 +52,7 @@ use Rector\CodeQuality\Rector\Identical\SimplifyConditionsRector; use Rector\CodeQuality\Rector\Identical\StrlenZeroToIdenticalEmptyStringRector; use Rector\CodeQuality\Rector\If_\CombineIfRector; +use Rector\CodeQuality\Rector\If_\CompleteMissingIfElseBracketRector; use Rector\CodeQuality\Rector\If_\ConsecutiveNullCompareReturnsToNullCoalesceQueueRector; use Rector\CodeQuality\Rector\If_\ExplicitBoolCompareRector; use Rector\CodeQuality\Rector\If_\ShortenElseIfRector; @@ -108,5 +109,5 @@ 'mbstrrpos' => 'mb_strrpos', 'mbsubstr' => 'mb_substr', ]); - $rectorConfig->rules([CombinedAssignRector::class, SimplifyEmptyArrayCheckRector::class, ReplaceMultipleBooleanNotRector::class, ForeachToInArrayRector::class, SimplifyForeachToCoalescingRector::class, SimplifyFuncGetArgsCountRector::class, SimplifyInArrayValuesRector::class, SimplifyStrposLowerRector::class, GetClassToInstanceOfRector::class, SimplifyArraySearchRector::class, SimplifyConditionsRector::class, SimplifyIfNotNullReturnRector::class, SimplifyIfReturnBoolRector::class, SimplifyUselessVariableRector::class, UnnecessaryTernaryExpressionRector::class, RemoveExtraParametersRector::class, SimplifyDeMorganBinaryRector::class, SimplifyTautologyTernaryRector::class, SingleInArrayToCompareRector::class, SimplifyIfElseToTernaryRector::class, JoinStringConcatRector::class, ConsecutiveNullCompareReturnsToNullCoalesceQueueRector::class, ExplicitBoolCompareRector::class, CombineIfRector::class, UseIdenticalOverEqualWithSameTypeRector::class, SimplifyBoolIdenticalTrueRector::class, SimplifyRegexPatternRector::class, BooleanNotIdenticalToNotIdenticalRector::class, StrvalToTypeCastRector::class, FloatvalToTypeCastRector::class, CallableThisArrayToAnonymousFunctionRector::class, AndAssignsToSeparateLinesRector::class, CompactToVariablesRector::class, CompleteDynamicPropertiesRector::class, IsAWithStringWithThirdArgumentRector::class, StrlenZeroToIdenticalEmptyStringRector::class, ThrowWithPreviousExceptionRector::class, RemoveSoleValueSprintfRector::class, ShortenElseIfRector::class, ArrayMergeOfNonArraysToSimpleArrayRector::class, IntvalToTypeCastRector::class, BoolvalToTypeCastRector::class, ArrayKeyExistsTernaryThenValueToCoalescingRector::class, AbsolutizeRequireAndIncludePathRector::class, ChangeArrayPushToArrayAssignRector::class, ForRepeatedCountToOwnVariableRector::class, ForeachItemsAssignToEmptyArrayToAssignRector::class, InlineIfToExplicitIfRector::class, UnusedForeachValueToArrayKeysRector::class, CommonNotEqualRector::class, SetTypeToCastRector::class, LogicalToBooleanRector::class, VarToPublicPropertyRector::class, IssetOnPropertyObjectToPropertyExistsRector::class, NewStaticToNewSelfRector::class, UnwrapSprintfOneArgumentRector::class, SwitchNegatedTernaryRector::class, SingularSwitchToIfRector::class, SimplifyIfNullableReturnRector::class, FuncGetArgsToVariadicParamRector::class, CallUserFuncToMethodCallRector::class, CallUserFuncWithArrowFunctionToInlineRector::class, CountArrayToEmptyArrayComparisonRector::class, FlipTypeControlToUseExclusiveTypeRector::class, InlineArrayReturnAssignRector::class, InlineIsAInstanceOfRector::class, TernaryFalseExpressionToIfRector::class, InlineConstructorDefaultToPropertyRector::class, TernaryEmptyArrayArrayDimFetchToCoalesceRector::class, OptionalParametersAfterRequiredRector::class, SimplifyEmptyCheckOnEmptyArrayRector::class, SwitchTrueToIfRector::class, CleanupUnneededNullsafeOperatorRector::class, DisallowedEmptyRuleFixerRector::class, ConvertStaticPrivateConstantToSelfRector::class, LocallyCalledStaticMethodToNonStaticRector::class, NumberCompareToMaxFuncCallRector::class]); + $rectorConfig->rules([CombinedAssignRector::class, SimplifyEmptyArrayCheckRector::class, ReplaceMultipleBooleanNotRector::class, ForeachToInArrayRector::class, SimplifyForeachToCoalescingRector::class, SimplifyFuncGetArgsCountRector::class, SimplifyInArrayValuesRector::class, SimplifyStrposLowerRector::class, GetClassToInstanceOfRector::class, SimplifyArraySearchRector::class, SimplifyConditionsRector::class, SimplifyIfNotNullReturnRector::class, SimplifyIfReturnBoolRector::class, SimplifyUselessVariableRector::class, UnnecessaryTernaryExpressionRector::class, RemoveExtraParametersRector::class, SimplifyDeMorganBinaryRector::class, SimplifyTautologyTernaryRector::class, SingleInArrayToCompareRector::class, SimplifyIfElseToTernaryRector::class, JoinStringConcatRector::class, ConsecutiveNullCompareReturnsToNullCoalesceQueueRector::class, ExplicitBoolCompareRector::class, CombineIfRector::class, UseIdenticalOverEqualWithSameTypeRector::class, SimplifyBoolIdenticalTrueRector::class, SimplifyRegexPatternRector::class, BooleanNotIdenticalToNotIdenticalRector::class, StrvalToTypeCastRector::class, FloatvalToTypeCastRector::class, CallableThisArrayToAnonymousFunctionRector::class, AndAssignsToSeparateLinesRector::class, CompactToVariablesRector::class, CompleteDynamicPropertiesRector::class, IsAWithStringWithThirdArgumentRector::class, StrlenZeroToIdenticalEmptyStringRector::class, ThrowWithPreviousExceptionRector::class, RemoveSoleValueSprintfRector::class, ShortenElseIfRector::class, ArrayMergeOfNonArraysToSimpleArrayRector::class, IntvalToTypeCastRector::class, BoolvalToTypeCastRector::class, ArrayKeyExistsTernaryThenValueToCoalescingRector::class, AbsolutizeRequireAndIncludePathRector::class, ChangeArrayPushToArrayAssignRector::class, ForRepeatedCountToOwnVariableRector::class, ForeachItemsAssignToEmptyArrayToAssignRector::class, InlineIfToExplicitIfRector::class, UnusedForeachValueToArrayKeysRector::class, CommonNotEqualRector::class, SetTypeToCastRector::class, LogicalToBooleanRector::class, VarToPublicPropertyRector::class, IssetOnPropertyObjectToPropertyExistsRector::class, NewStaticToNewSelfRector::class, UnwrapSprintfOneArgumentRector::class, SwitchNegatedTernaryRector::class, SingularSwitchToIfRector::class, SimplifyIfNullableReturnRector::class, FuncGetArgsToVariadicParamRector::class, CallUserFuncToMethodCallRector::class, CallUserFuncWithArrowFunctionToInlineRector::class, CountArrayToEmptyArrayComparisonRector::class, FlipTypeControlToUseExclusiveTypeRector::class, InlineArrayReturnAssignRector::class, InlineIsAInstanceOfRector::class, TernaryFalseExpressionToIfRector::class, InlineConstructorDefaultToPropertyRector::class, TernaryEmptyArrayArrayDimFetchToCoalesceRector::class, OptionalParametersAfterRequiredRector::class, SimplifyEmptyCheckOnEmptyArrayRector::class, SwitchTrueToIfRector::class, CleanupUnneededNullsafeOperatorRector::class, DisallowedEmptyRuleFixerRector::class, ConvertStaticPrivateConstantToSelfRector::class, LocallyCalledStaticMethodToNonStaticRector::class, NumberCompareToMaxFuncCallRector::class, CompleteMissingIfElseBracketRector::class]); }; diff --git a/vendor/rector/rector/config/set/dead-code.php b/vendor/rector/rector/config/set/dead-code.php index a340ea6ec..3c716ddc3 100644 --- a/vendor/rector/rector/config/set/dead-code.php +++ b/vendor/rector/rector/config/set/dead-code.php @@ -17,6 +17,7 @@ use Rector\DeadCode\Rector\ClassMethod\RemoveUnusedPrivateMethodRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUnusedPromotedPropertyRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessParamTagRector; +use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnExprInConstructRector; use Rector\DeadCode\Rector\ClassMethod\RemoveUselessReturnTagRector; use Rector\DeadCode\Rector\Concat\RemoveConcatAutocastRector; use Rector\DeadCode\Rector\ConstFetch\RemovePhpVersionIdCheckRector; @@ -89,5 +90,6 @@ RemoveAlwaysTrueIfConditionRector::class, RemoveDeadZeroAndOneOperationRector::class, RemovePhpVersionIdCheckRector::class, + RemoveUselessReturnExprInConstructRector::class, ]); }; diff --git a/vendor/rector/rector/config/set/php80.php b/vendor/rector/rector/config/set/php80.php index 71e29bff2..2a99a3cd1 100644 --- a/vendor/rector/rector/config/set/php80.php +++ b/vendor/rector/rector/config/set/php80.php @@ -8,6 +8,7 @@ use Rector\Arguments\ValueObject\ArgumentAdder; use Rector\Arguments\ValueObject\ReplaceFuncCallArgumentDefaultValue; use Rector\CodeQuality\Rector\ClassMethod\OptionalParametersAfterRequiredRector; +use Rector\CodingStyle\Rector\FuncCall\ConsistentImplodeRector; use Rector\Config\RectorConfig; use Rector\DeadCode\Rector\StaticCall\RemoveParentCallWithoutParentRector; use Rector\Php80\Rector\Catch_\RemoveUnusedVariableInCatchRector; @@ -28,7 +29,7 @@ use Rector\Transform\Rector\StaticCall\StaticCallToFuncCallRector; use Rector\Transform\ValueObject\StaticCallToFuncCall; return static function (RectorConfig $rectorConfig) : void { - $rectorConfig->rules([StrContainsRector::class, StrStartsWithRector::class, StrEndsWithRector::class, StringableForToStringRector::class, ClassOnObjectRector::class, GetDebugTypeRector::class, RemoveUnusedVariableInCatchRector::class, ClassPropertyAssignToConstructorPromotionRector::class, ChangeSwitchToMatchRector::class, RemoveParentCallWithoutParentRector::class, SetStateToStaticRector::class, FinalPrivateToPrivateVisibilityRector::class, AddParamBasedOnParentClassMethodRector::class, MixedTypeRector::class, ClassOnThisVariableObjectRector::class]); + $rectorConfig->rules([StrContainsRector::class, StrStartsWithRector::class, StrEndsWithRector::class, StringableForToStringRector::class, ClassOnObjectRector::class, GetDebugTypeRector::class, RemoveUnusedVariableInCatchRector::class, ClassPropertyAssignToConstructorPromotionRector::class, ChangeSwitchToMatchRector::class, RemoveParentCallWithoutParentRector::class, SetStateToStaticRector::class, FinalPrivateToPrivateVisibilityRector::class, AddParamBasedOnParentClassMethodRector::class, MixedTypeRector::class, ClassOnThisVariableObjectRector::class, ConsistentImplodeRector::class]); $rectorConfig->ruleWithConfiguration(StaticCallToFuncCallRector::class, [new StaticCallToFuncCall('Nette\\Utils\\Strings', 'startsWith', 'str_starts_with'), new StaticCallToFuncCall('Nette\\Utils\\Strings', 'endsWith', 'str_ends_with'), new StaticCallToFuncCall('Nette\\Utils\\Strings', 'contains', 'str_contains')]); // nette\utils and Strings::replace() $rectorConfig->ruleWithConfiguration(ArgumentAdderRector::class, [new ArgumentAdder('Nette\\Utils\\Strings', 'replace', 2, 'replacement', '')]); diff --git a/vendor/rector/rector/packages/Config/RectorConfig.php b/vendor/rector/rector/packages/Config/RectorConfig.php index b25050618..c2ef63219 100644 --- a/vendor/rector/rector/packages/Config/RectorConfig.php +++ b/vendor/rector/rector/packages/Config/RectorConfig.php @@ -13,8 +13,6 @@ use Rector\Core\Contract\Rector\RectorInterface; use Rector\Core\DependencyInjection\Laravel\ContainerMemento; use Rector\Core\Exception\ShouldNotHappenException; -use Rector\Core\NodeAnalyzer\ScopeAnalyzer; -use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersion; use Rector\Skipper\SkipCriteriaResolver\SkippedClassResolver; use RectorPrefix202310\Webmozart\Assert\Assert; @@ -182,13 +180,6 @@ public function rule(string $rectorClass) : void if (\is_a($rectorClass, CollectorRectorInterface::class, \true)) { $this->tag($rectorClass, CollectorRectorInterface::class); } - if (\is_a($rectorClass, AbstractScopeAwareRector::class, \true)) { - $this->extend($rectorClass, static function (AbstractScopeAwareRector $scopeAwareRector, Container $container) : AbstractScopeAwareRector { - $scopeAnalyzer = $container->make(ScopeAnalyzer::class); - $scopeAwareRector->autowireAbstractScopeAwareRector($scopeAnalyzer); - return $scopeAwareRector; - }); - } // for cache invalidation in case of change SimpleParameterProvider::addParameter(Option::REGISTERED_RECTOR_RULES, $rectorClass); } diff --git a/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php b/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php index b0cf32eb8..b24e3b626 100644 --- a/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php +++ b/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php @@ -383,6 +383,9 @@ private function isMatchingUnionType(Type $resolvedType, ObjectType $requiredObj $type = TypeCombinator::removeNull($resolvedType); // for falsy nullables $type = TypeCombinator::remove($type, new ConstantBooleanType(\false)); + if ($type instanceof ObjectWithoutClassType) { + return $this->isMatchObjectWithoutClassType($type, $requiredObjectType); + } return $type->isSuperTypeOf($requiredObjectType)->yes(); } private function resolveByNodeTypeResolvers(Node $node) : ?Type diff --git a/vendor/rector/rector/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php b/vendor/rector/rector/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php index 392fbea5c..fb1681bf8 100644 --- a/vendor/rector/rector/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php +++ b/vendor/rector/rector/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php @@ -141,6 +141,7 @@ public function processNodes(array $stmts, string $filePath, ?MutatingScope $for // skip chain method calls, performance issue: https://github.com/phpstan/phpstan/issues/254 $nodeCallback = function (Node $node, MutatingScope $mutatingScope) use(&$nodeCallback, $filePath) : void { if ($node instanceof FileWithoutNamespace) { + $node->setAttribute(AttributeKey::SCOPE, $mutatingScope); $this->nodeScopeResolver->processNodes($node->stmts, $mutatingScope, $nodeCallback); return; } diff --git a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/BoolUnionTypeAnalyzer.php b/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/BoolUnionTypeAnalyzer.php deleted file mode 100644 index f18f71159..000000000 --- a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/BoolUnionTypeAnalyzer.php +++ /dev/null @@ -1,18 +0,0 @@ -getTypes() as $unionedType) { - if (!$unionedType->isBoolean()->yes()) { - return \false; - } - } - return \true; - } -} diff --git a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeAnalyzer.php b/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeAnalyzer.php index e3f6333a6..5cc2bbf11 100644 --- a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeAnalyzer.php +++ b/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeAnalyzer.php @@ -13,9 +13,8 @@ use Traversable; final class UnionTypeAnalyzer { - public function analyseForNullableAndIterable(UnionType $unionType) : ?UnionTypeAnalysis + public function analyseForArrayAndIterable(UnionType $unionType) : ?UnionTypeAnalysis { - $isNullableType = \false; $hasIterable = \false; $hasArray = \false; foreach ($unionType->getTypes() as $unionedType) { @@ -27,17 +26,13 @@ public function analyseForNullableAndIterable(UnionType $unionType) : ?UnionType $hasArray = \true; continue; } - if ($unionedType instanceof NullType) { - $isNullableType = \true; - continue; - } if ($unionedType instanceof ObjectType && $unionedType->getClassName() === Traversable::class) { $hasIterable = \true; continue; } return null; } - return new UnionTypeAnalysis($isNullableType, $hasIterable, $hasArray); + return new UnionTypeAnalysis($hasIterable, $hasArray); } /** * @return TypeWithClassName[] diff --git a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php b/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php index 8d9e68829..dee133db2 100644 --- a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php +++ b/vendor/rector/rector/packages/PHPStanStaticTypeMapper/TypeMapper/UnionTypeMapper.php @@ -30,12 +30,9 @@ use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PHPStanStaticTypeMapper\Contract\TypeMapperInterface; -use Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer; use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; use Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper; -use Rector\PHPStanStaticTypeMapper\TypeAnalyzer\BoolUnionTypeAnalyzer; use Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeAnalyzer; -use Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeCommonTypeNarrower; use Rector\PHPStanStaticTypeMapper\ValueObject\UnionTypeAnalysis; use RectorPrefix202310\Webmozart\Assert\Assert; use RectorPrefix202310\Webmozart\Assert\InvalidArgumentException; @@ -44,11 +41,6 @@ */ final class UnionTypeMapper implements TypeMapperInterface { - /** - * @readonly - * @var \Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer - */ - private $doctrineTypeAnalyzer; /** * @readonly * @var \Rector\Core\Php\PhpVersionProvider @@ -59,16 +51,6 @@ final class UnionTypeMapper implements TypeMapperInterface * @var \Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeAnalyzer */ private $unionTypeAnalyzer; - /** - * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeAnalyzer\BoolUnionTypeAnalyzer - */ - private $boolUnionTypeAnalyzer; - /** - * @readonly - * @var \Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeCommonTypeNarrower - */ - private $unionTypeCommonTypeNarrower; /** * @readonly * @var \Rector\NodeNameResolver\NodeNameResolver @@ -83,13 +65,10 @@ final class UnionTypeMapper implements TypeMapperInterface * @var \Rector\PHPStanStaticTypeMapper\PHPStanStaticTypeMapper */ private $phpStanStaticTypeMapper; - public function __construct(DoctrineTypeAnalyzer $doctrineTypeAnalyzer, PhpVersionProvider $phpVersionProvider, UnionTypeAnalyzer $unionTypeAnalyzer, BoolUnionTypeAnalyzer $boolUnionTypeAnalyzer, UnionTypeCommonTypeNarrower $unionTypeCommonTypeNarrower, NodeNameResolver $nodeNameResolver, TypeFactory $typeFactory) + public function __construct(PhpVersionProvider $phpVersionProvider, UnionTypeAnalyzer $unionTypeAnalyzer, NodeNameResolver $nodeNameResolver, TypeFactory $typeFactory) { - $this->doctrineTypeAnalyzer = $doctrineTypeAnalyzer; $this->phpVersionProvider = $phpVersionProvider; $this->unionTypeAnalyzer = $unionTypeAnalyzer; - $this->boolUnionTypeAnalyzer = $boolUnionTypeAnalyzer; - $this->unionTypeCommonTypeNarrower = $unionTypeCommonTypeNarrower; $this->nodeNameResolver = $nodeNameResolver; $this->typeFactory = $typeFactory; } @@ -126,15 +105,10 @@ public function mapToPHPStanPhpDocTypeNode(Type $type) : TypeNode */ public function mapToPhpParserNode(Type $type, string $typeKind) : ?Node { - $arrayNode = $this->matchArrayTypes($type); - if ($arrayNode !== null) { - return $arrayNode; - } // special case for nullable $nullabledType = $this->matchTypeForNullableUnionType($type); if (!$nullabledType instanceof Type) { - // use first unioned type in case of unioned object types - return $this->matchTypeForUnionedObjectTypes($type, $typeKind); + return $this->matchTypeForUnionedTypes($type, $typeKind); } return $this->mapNullabledType($nullabledType, $typeKind); } @@ -212,7 +186,7 @@ private function mapNullabledType(Type $nullabledType, string $typeKind) : ?Node } private function shouldSkipIterable(UnionType $unionType) : bool { - $unionTypeAnalysis = $this->unionTypeAnalyzer->analyseForNullableAndIterable($unionType); + $unionTypeAnalysis = $this->unionTypeAnalyzer->analyseForArrayAndIterable($unionType); if (!$unionTypeAnalysis instanceof UnionTypeAnalysis) { return \false; } @@ -221,21 +195,6 @@ private function shouldSkipIterable(UnionType $unionType) : bool } return $unionTypeAnalysis->hasArray(); } - /** - * @return \PhpParser\Node\Identifier|\PhpParser\Node\NullableType|PhpParserUnionType|null - */ - private function matchArrayTypes(UnionType $unionType) - { - $unionTypeAnalysis = $this->unionTypeAnalyzer->analyseForNullableAndIterable($unionType); - if (!$unionTypeAnalysis instanceof UnionTypeAnalysis) { - return null; - } - $type = $unionTypeAnalysis->hasIterable() ? 'iterable' : 'array'; - if ($unionTypeAnalysis->isNullableType()) { - return $this->resolveNullableType(new NullableType($type)); - } - return new Identifier($type); - } private function resolveUnionTypes(PhpParserUnionType $phpParserUnionType, int $totalTypes) : ?PhpParserUnionType { if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::UNION_TYPES)) { @@ -297,33 +256,25 @@ private function hasObjectAndStaticType(PhpParserUnionType $phpParserUnionType) * @param TypeKind::* $typeKind * @return Name|FullyQualified|ComplexType|Identifier|null */ - private function matchTypeForUnionedObjectTypes(UnionType $unionType, string $typeKind) : ?Node + private function matchTypeForUnionedTypes(UnionType $unionType, string $typeKind) : ?Node { + // use first unioned type in case of unioned object types + $compatibleObjectTypeNode = $this->processResolveCompatibleObjectCandidates($unionType); + if ($compatibleObjectTypeNode instanceof NullableType || $compatibleObjectTypeNode instanceof FullyQualified) { + return $compatibleObjectTypeNode; + } $phpParserUnionType = $this->matchPhpParserUnionType($unionType, $typeKind); if ($phpParserUnionType instanceof NullableType) { return $phpParserUnionType; } if ($phpParserUnionType instanceof PhpParserUnionType) { - return $this->narrowBoolType($unionType, $phpParserUnionType, $typeKind); - } - $compatibleObjectTypeNode = $this->processResolveCompatibleObjectCandidates($unionType); - if ($compatibleObjectTypeNode instanceof NullableType || $compatibleObjectTypeNode instanceof FullyQualified) { - return $compatibleObjectTypeNode; - } - $integerIdentifier = $this->narrowIntegerType($unionType); - if ($integerIdentifier instanceof Identifier) { - return $integerIdentifier; + return $this->resolveUnionTypeNode($unionType, $phpParserUnionType, $typeKind); } - return $this->narrowStringTypes($unionType); - } - private function narrowStringTypes(UnionType $unionType) : ?Identifier - { - foreach ($unionType->getTypes() as $unionedType) { - if (!$unionedType->isString()->yes()) { - return null; - } + $type = $this->typeFactory->createMixedPassedOrUnionType($unionType->getTypes()); + if (!$type instanceof UnionType) { + return $this->phpStanStaticTypeMapper->mapToPhpParserNode($type, $typeKind); } - return new Identifier('string'); + return null; } private function processResolveCompatibleObjectCandidates(UnionType $unionType) : ?Node { @@ -391,10 +342,6 @@ private function resolveAllowedStandaloneTypeInUnionType(Type $unionedType, stri */ private function resolveCompatibleObjectCandidate(UnionType $unionType) { - if ($this->doctrineTypeAnalyzer->isDoctrineCollectionWithIterableUnionType($unionType)) { - $objectType = new ObjectType('Doctrine\\Common\\Collections\\Collection'); - return $this->unionTypeAnalyzer->isNullable($unionType) ? new UnionType([new NullType(), $objectType]) : $objectType; - } $typesWithClassNames = $this->unionTypeAnalyzer->matchExclusiveTypesWithClassNames($unionType); if ($typesWithClassNames === []) { return null; @@ -403,8 +350,7 @@ private function resolveCompatibleObjectCandidate(UnionType $unionType) if ($sharedTypeWithClassName instanceof TypeWithClassName) { return $this->correctObjectType($sharedTypeWithClassName); } - // find least common denominator - return $this->unionTypeCommonTypeNarrower->narrowToSharedObjectType($unionType); + return null; } /** * @param TypeWithClassName[] $typesWithClassNames @@ -435,25 +381,12 @@ private function correctObjectType(TypeWithClassName $typeWithClassName) : TypeW } return $typeWithClassName; } - private function narrowIntegerType(UnionType $unionType) : ?Identifier - { - foreach ($unionType->getTypes() as $unionedType) { - if (!$unionedType->isInteger()->yes()) { - return null; - } - } - return new Identifier('int'); - } /** * @param TypeKind::* $typeKind * @return PhpParserUnionType|null|\PhpParser\Node\Identifier|\PhpParser\Node\Name|\PhpParser\Node\ComplexType */ - private function narrowBoolType(UnionType $unionType, PhpParserUnionType $phpParserUnionType, string $typeKind) + private function resolveUnionTypeNode(UnionType $unionType, PhpParserUnionType $phpParserUnionType, string $typeKind) { - // maybe all one type - if ($this->boolUnionTypeAnalyzer->isBoolUnionType($unionType)) { - return new Identifier('bool'); - } if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::UNION_TYPES)) { return null; } diff --git a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/ValueObject/UnionTypeAnalysis.php b/vendor/rector/rector/packages/PHPStanStaticTypeMapper/ValueObject/UnionTypeAnalysis.php index 14ba43ec2..df1c11286 100644 --- a/vendor/rector/rector/packages/PHPStanStaticTypeMapper/ValueObject/UnionTypeAnalysis.php +++ b/vendor/rector/rector/packages/PHPStanStaticTypeMapper/ValueObject/UnionTypeAnalysis.php @@ -5,11 +5,6 @@ final class UnionTypeAnalysis { - /** - * @readonly - * @var bool - */ - private $isNullableType; /** * @readonly * @var bool @@ -20,16 +15,11 @@ final class UnionTypeAnalysis * @var bool */ private $hasArray; - public function __construct(bool $isNullableType, bool $hasIterable, bool $hasArray) + public function __construct(bool $hasIterable, bool $hasArray) { - $this->isNullableType = $isNullableType; $this->hasIterable = $hasIterable; $this->hasArray = $hasArray; } - public function isNullableType() : bool - { - return $this->isNullableType; - } public function hasIterable() : bool { return $this->hasIterable; diff --git a/vendor/rector/rector/packages/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php b/vendor/rector/rector/packages/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php index 183184aa2..3c1734699 100644 --- a/vendor/rector/rector/packages/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php +++ b/vendor/rector/rector/packages/PhpDocParser/NodeTraverser/SimpleCallableNodeTraverser.php @@ -12,7 +12,7 @@ final class SimpleCallableNodeTraverser { /** - * @param callable(Node $node): (int|Node|null) $callable + * @param callable(Node): (int|Node|null|Node[]) $callable * @param Node|Node[]|null $node */ public function traverseNodesWithCallable($node, callable $callable) : void diff --git a/vendor/rector/rector/packages/PhpDocParser/NodeVisitor/CallableNodeVisitor.php b/vendor/rector/rector/packages/PhpDocParser/NodeVisitor/CallableNodeVisitor.php index ae7318e6e..826426a3b 100644 --- a/vendor/rector/rector/packages/PhpDocParser/NodeVisitor/CallableNodeVisitor.php +++ b/vendor/rector/rector/packages/PhpDocParser/NodeVisitor/CallableNodeVisitor.php @@ -12,7 +12,7 @@ final class CallableNodeVisitor extends NodeVisitorAbstract { /** - * @var callable(Node): (int|Node|null) + * @var callable(Node): (int|Node|null|Node[]) */ private $callable; /** @@ -20,7 +20,11 @@ final class CallableNodeVisitor extends NodeVisitorAbstract */ private $nodeIdToRemove; /** - * @param callable(Node $node): (int|Node|null) $callable + * @var array + */ + private $nodesToReturn = []; + /** + * @param callable(Node $node): (int|Node|null|Node[]) $callable */ public function __construct(callable $callable) { @@ -33,19 +37,24 @@ public function enterNode(Node $node) { $originalNode = $node; $callable = $this->callable; - /** @var int|Node|null $newNode */ + /** @var int|Node|null|Node[] $newNode */ $newNode = $callable($node); if ($newNode === NodeTraverser::REMOVE_NODE) { $this->nodeIdToRemove = \spl_object_id($originalNode); return $originalNode; } + if (\is_array($newNode)) { + $nodeId = \spl_object_id($node); + $this->nodesToReturn[$nodeId] = $newNode; + return $node; + } if ($originalNode instanceof Stmt && $newNode instanceof Expr) { return new Expression($newNode); } return $newNode; } /** - * @return int|\PhpParser\Node + * @return int|Node|Node[] */ public function leaveNode(Node $node) { @@ -53,6 +62,9 @@ public function leaveNode(Node $node) $this->nodeIdToRemove = null; return NodeTraverser::REMOVE_NODE; } - return $node; + if ($this->nodesToReturn === []) { + return $node; + } + return $this->nodesToReturn[\spl_object_id($node)] ?? $node; } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php index 5e87d3efa..eaa0c3e5f 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php @@ -111,6 +111,6 @@ private function isBooleanButNotTrueAndFalse(Expr $expr) : bool if ($this->valueResolver->isTrueOrFalse($expr)) { return \false; } - return $this->getType($expr)->isBoolean()->yes(); + return $this->nodeTypeResolver->getNativeType($expr)->isBoolean()->yes(); } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php index de6f80590..6f7432d43 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php @@ -12,6 +12,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; +use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -82,6 +83,7 @@ public function refactor(Node $node) : ?Node if ($this->hasVarTag($subIf)) { return null; } + $node->cond->setAttribute(AttributeKey::ORIGINAL_NODE, null); $node->cond = new BooleanAnd($node->cond, $subIf->cond); $node->stmts = $subIf->stmts; $this->commentsMerger->keepComments($node, [$subIf]); diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php new file mode 100644 index 000000000..ca5f0d7ff --- /dev/null +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php @@ -0,0 +1,108 @@ +> + */ + public function getNodeTypes() : array + { + return [If_::class, ElseIf_::class, Else_::class]; + } + /** + * @param If_|ElseIf_|Else_ $node + */ + public function refactor(Node $node) : ?Node + { + if ($this->isBareNewNode($node)) { + return null; + } + $oldTokens = $this->file->getOldTokens(); + if ($this->isIfConditionFollowedByOpeningCurlyBracket($node, $oldTokens)) { + return null; + } + // invoke reprint with brackets + $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + return $node; + } + /** + * @param mixed[] $oldTokens + * @param \PhpParser\Node\Stmt\If_|\PhpParser\Node\Stmt\ElseIf_|\PhpParser\Node\Stmt\Else_ $if + */ + private function isIfConditionFollowedByOpeningCurlyBracket($if, array $oldTokens) : bool + { + $startStmt = \current($if->stmts); + if (!$startStmt instanceof Stmt) { + return \true; + } + $startTokenPos = $if->getStartTokenPos(); + $i = $startStmt->getStartTokenPos() - 1; + $condEndTokenPos = $if instanceof Else_ ? $startTokenPos : $if->cond->getEndTokenPos(); + while (isset($oldTokens[$i])) { + if ($i === $condEndTokenPos) { + return \false; + } + if (\in_array($oldTokens[$i], ['{', ':'], \true)) { + // all good + return \true; + } + if ($i === $startTokenPos) { + return \false; + } + --$i; + } + return \false; + } + /** + * @param \PhpParser\Node\Stmt\If_|\PhpParser\Node\Stmt\ElseIf_|\PhpParser\Node\Stmt\Else_ $if + */ + private function isBareNewNode($if) : bool + { + $originalNode = $if->getAttribute(AttributeKey::ORIGINAL_NODE); + if (!$originalNode instanceof Node) { + return \true; + } + // not defined, probably new if + return $if->getStartTokenPos() === -1; + } +} diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php index fb90c7691..10485e8e5 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\Isset_; use PhpParser\Node\Expr\PropertyFetch; +use PhpParser\Node\Identifier; use PhpParser\Node\Scalar\String_; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\Php\PhpPropertyReflection; @@ -141,6 +142,9 @@ private function createNotIdenticalToNull(PropertyFetch $propertyFetch) : NotIde } private function shouldSkipForPropertyTypeDeclaration(PropertyFetch $propertyFetch) : bool { + if (!$propertyFetch->name instanceof Identifier) { + return \true; + } $phpPropertyReflection = $this->reflectionResolver->resolvePropertyReflectionFromPropertyFetch($propertyFetch); if (!$phpPropertyReflection instanceof PhpPropertyReflection) { return \false; diff --git a/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php b/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php index 141489224..4311c664a 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php +++ b/vendor/rector/rector/rules/DeadCode/NodeManipulator/CountManipulator.php @@ -10,8 +10,10 @@ use PhpParser\Node\Expr\BinaryOp\SmallerOrEqual; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Scalar\LNumber; +use PHPStan\Type\NeverType; use Rector\Core\PhpParser\Comparing\NodeComparator; use Rector\NodeNameResolver\NodeNameResolver; +use Rector\NodeTypeResolver\NodeTypeResolver; final class CountManipulator { /** @@ -24,10 +26,16 @@ final class CountManipulator * @var \Rector\Core\PhpParser\Comparing\NodeComparator */ private $nodeComparator; - public function __construct(NodeNameResolver $nodeNameResolver, NodeComparator $nodeComparator) + /** + * @readonly + * @var \Rector\NodeTypeResolver\NodeTypeResolver + */ + private $nodeTypeResolver; + public function __construct(NodeNameResolver $nodeNameResolver, NodeComparator $nodeComparator, NodeTypeResolver $nodeTypeResolver) { $this->nodeNameResolver = $nodeNameResolver; $this->nodeComparator = $nodeComparator; + $this->nodeTypeResolver = $nodeTypeResolver; } public function isCounterHigherThanOne(Expr $firstExpr, Expr $secondExpr) : bool { @@ -99,6 +107,13 @@ private function isCountWithExpression(Expr $node, Expr $expr) : bool return \false; } $countedExpr = $node->getArgs()[0]->value; - return $this->nodeComparator->areNodesEqual($countedExpr, $expr); + if ($this->nodeComparator->areNodesEqual($countedExpr, $expr)) { + $exprType = $this->nodeTypeResolver->getNativeType($expr); + if (!$exprType->isArray()->yes()) { + return $exprType instanceof NeverType; + } + return \true; + } + return \false; } } diff --git a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php index f64dc97d1..8a9aaf748 100644 --- a/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php +++ b/vendor/rector/rector/rules/DeadCode/PhpDoc/DeadReturnTagValueNodeAnalyzer.php @@ -78,9 +78,9 @@ public function isDead(ReturnTagValueNode $returnTagValueNode, ClassMethod $clas if ($this->mixedArrayTypeNodeAnalyzer->hasMixedArrayType($returnTagValueNode->type)) { return \false; } - return !$this->hasTruePseudoType($returnTagValueNode->type); + return !$this->hasTrueFalsePseudoType($returnTagValueNode->type); } - private function hasTruePseudoType(BracketsAwareUnionTypeNode $bracketsAwareUnionTypeNode) : bool + private function hasTrueFalsePseudoType(BracketsAwareUnionTypeNode $bracketsAwareUnionTypeNode) : bool { $unionTypes = $bracketsAwareUnionTypeNode->types; foreach ($unionTypes as $unionType) { @@ -88,7 +88,7 @@ private function hasTruePseudoType(BracketsAwareUnionTypeNode $bracketsAwareUnio continue; } $name = \strtolower((string) $unionType); - if ($name === 'true') { + if (\in_array($name, ['true', 'false'], \true)) { return \true; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php index 730d41fa6..14901b192 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php @@ -112,7 +112,9 @@ public function refactorWithScope(Node $node, Scope $scope) : ?ClassMethod if ($this->hasCallLikeInAssignExpr($assign, $scope)) { // clean safely $cleanAssignedExpr = $this->cleanCastedExpr($assign->expr); - $node->stmts[$stmtPosition] = new Expression($cleanAssignedExpr); + $newExpression = new Expression($cleanAssignedExpr); + $this->mirrorComments($newExpression, $currentStmt); + $node->stmts[$stmtPosition] = $newExpression; } else { unset($node->stmts[$stmtPosition]); } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php index 6a33baed1..a5e615494 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php @@ -14,7 +14,6 @@ use PhpParser\Node\Expr\Cast\String_; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; -use PhpParser\Node\Expr\StaticPropertyFetch; use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Type\ArrayType; use PHPStan\Type\BooleanType; @@ -24,7 +23,6 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\StringType; use PHPStan\Type\Type; -use PHPStan\Type\UnionType; use Rector\Core\NodeAnalyzer\ExprAnalyzer; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Core\Rector\AbstractRector; @@ -126,11 +124,7 @@ private function shouldSkip(Expr $expr) : bool } $phpPropertyReflection = $this->reflectionResolver->resolvePropertyReflectionFromPropertyFetch($expr); if (!$phpPropertyReflection instanceof PhpPropertyReflection) { - $propertyType = $expr instanceof StaticPropertyFetch ? $this->nodeTypeResolver->getType($expr->class) : $this->nodeTypeResolver->getType($expr->var); - // need to UnionType check due rectify with RecastingRemovalRector + CountOnNullRector - // cause add (array) cast on $node->args - // on union $node types FuncCall|MethodCall|StaticCall - return !$propertyType instanceof UnionType; + return \true; } $nativeType = $phpPropertyReflection->getNativeType(); return $nativeType instanceof MixedType; diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php new file mode 100644 index 000000000..4851e475a --- /dev/null +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php @@ -0,0 +1,116 @@ +exprAnalyzer = $exprAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Remove useless return Expr in __construct()', [new CodeSample(<<<'CODE_SAMPLE' +class SomeClass +{ + public function __construct() + { + if (rand(0, 1)) { + $this->init(); + return true; + } + + if (rand(2, 3)) { + return parent::construct(); + } + + $this->execute(); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeClass +{ + public function __construct() + { + if (rand(0, 1)) { + $this->init(); + return; + } + + if (rand(2, 3)) { + parent::construct(); + return; + } + + $this->execute(); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [ClassMethod::class]; + } + /** + * @param ClassMethod $node + */ + public function refactor(Node $node) : ?Node + { + if ($node->stmts === null) { + return null; + } + if (!$this->isName($node, MethodName::CONSTRUCT)) { + return null; + } + $hasChanged = \false; + $this->traverseNodesWithCallable($node->stmts, function (Node $subNode) use(&$hasChanged) { + if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if (!$subNode instanceof Return_) { + return null; + } + if (!$subNode->expr instanceof Expr) { + return null; + } + $hasChanged = \true; + if ($this->exprAnalyzer->isDynamicExpr($subNode->expr)) { + return [new Expression($subNode->expr), new Return_()]; + } + $subNode->expr = null; + return $subNode; + }); + if ($hasChanged) { + return $node; + } + return null; + } +} diff --git a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php index 26c59e7a4..c9c5bc5e6 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php @@ -7,11 +7,13 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\CallLike; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\For_; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\If_; -use PhpParser\NodeTraverser; +use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\NodeManipulator\StmtsManipulator; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\EarlyReturn\NodeTransformer\ConditionInverter; @@ -32,10 +34,20 @@ final class RemoveDeadIfForeachForRector extends AbstractRector * @var \Rector\Core\PhpParser\Node\BetterNodeFinder */ private $betterNodeFinder; - public function __construct(ConditionInverter $conditionInverter, BetterNodeFinder $betterNodeFinder) + /** + * @readonly + * @var \Rector\Core\NodeManipulator\StmtsManipulator + */ + private $stmtsManipulator; + /** + * @var bool + */ + private $hasChanged = \false; + public function __construct(ConditionInverter $conditionInverter, BetterNodeFinder $betterNodeFinder, StmtsManipulator $stmtsManipulator) { $this->conditionInverter = $conditionInverter; $this->betterNodeFinder = $betterNodeFinder; + $this->stmtsManipulator = $stmtsManipulator; } public function getRuleDefinition() : RuleDefinition { @@ -70,39 +82,81 @@ public function run($value) */ public function getNodeTypes() : array { - return [For_::class, If_::class, Foreach_::class]; + return [StmtsAwareInterface::class]; } /** - * @param For_|If_|Foreach_ $node + * @param StmtsAwareInterface $node * @return \PhpParser\Node|null|int */ public function refactor(Node $node) { - if ($node instanceof If_) { - if ($node->stmts !== []) { - return null; + if ($node->stmts === null) { + return null; + } + $this->hasChanged = \false; + foreach ($node->stmts as $key => $stmt) { + if (!$stmt instanceof If_ && !$stmt instanceof For_ && !$stmt instanceof Foreach_) { + continue; } - if ($node->elseifs !== []) { - return null; + if ($stmt->stmts !== []) { + continue; } - // useless if () - if (!$node->else instanceof Else_) { - if ($this->hasNodeSideEffect($node->cond)) { - return null; - } - return NodeTraverser::REMOVE_NODE; + if ($stmt instanceof If_) { + $this->processIf($stmt, $key, $node); + continue; } - $node->cond = $this->conditionInverter->createInvertedCondition($node->cond); - $node->stmts = $node->else->stmts; - $node->else = null; - return $node; + $this->processForForeach($stmt, $key, $node); } - // nothing to "for" - if ($node->stmts === []) { - return NodeTraverser::REMOVE_NODE; + if ($this->hasChanged) { + return $node; } return null; } + private function processIf(If_ $if, int $key, StmtsAwareInterface $stmtsAware) : void + { + if ($if->elseifs !== []) { + return; + } + // useless if () + if (!$if->else instanceof Else_) { + if ($this->hasNodeSideEffect($if->cond)) { + return; + } + unset($stmtsAware->stmts[$key]); + $this->hasChanged = \true; + return; + } + $if->cond = $this->conditionInverter->createInvertedCondition($if->cond); + $if->stmts = $if->else->stmts; + $if->else = null; + $this->hasChanged = \true; + } + /** + * @param \PhpParser\Node\Stmt\For_|\PhpParser\Node\Stmt\Foreach_ $for + */ + private function processForForeach($for, int $key, StmtsAwareInterface $stmtsAware) : void + { + if ($for instanceof For_) { + $variables = $this->betterNodeFinder->findInstanceOf(\array_merge($for->init, $for->cond, $for->loop), Variable::class); + foreach ($variables as $variable) { + if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmtsAware, $key + 1, (string) $this->getName($variable))) { + return; + } + } + unset($stmtsAware->stmts[$key]); + $this->hasChanged = \true; + return; + } + $exprs = \array_filter([$for->expr, $for->valueVar, $for->valueVar]); + $variables = $this->betterNodeFinder->findInstanceOf($exprs, Variable::class); + foreach ($variables as $variable) { + if ($this->stmtsManipulator->isVariableUsedInNextStmt($stmtsAware, $key + 1, (string) $this->getName($variable))) { + return; + } + } + unset($stmtsAware->stmts[$key]); + $this->hasChanged = \true; + } private function hasNodeSideEffect(Expr $expr) : bool { return $this->betterNodeFinder->hasInstancesOf($expr, [CallLike::class, Assign::class]); diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php index 37d66bae9..98988a41b 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php @@ -4,8 +4,10 @@ namespace Rector\DeadCode\Rector\Foreach_; use PhpParser\Node; -use PhpParser\Node\Expr; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Foreach_; +use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\NodeManipulator\StmtsManipulator; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -20,9 +22,15 @@ final class RemoveUnusedForeachKeyRector extends AbstractRector * @var \Rector\Core\PhpParser\Node\BetterNodeFinder */ private $betterNodeFinder; - public function __construct(BetterNodeFinder $betterNodeFinder) + /** + * @readonly + * @var \Rector\Core\NodeManipulator\StmtsManipulator + */ + private $stmtsManipulator; + public function __construct(BetterNodeFinder $betterNodeFinder, StmtsManipulator $stmtsManipulator) { $this->betterNodeFinder = $betterNodeFinder; + $this->stmtsManipulator = $stmtsManipulator; } public function getRuleDefinition() : RuleDefinition { @@ -45,24 +53,40 @@ public function getRuleDefinition() : RuleDefinition */ public function getNodeTypes() : array { - return [Foreach_::class]; + return [StmtsAwareInterface::class]; } /** - * @param Foreach_ $node + * @param StmtsAwareInterface $node */ public function refactor(Node $node) : ?Node { - if (!$node->keyVar instanceof Expr) { + if ($node->stmts === null) { return null; } - $keyVar = $node->keyVar; - $isNodeUsed = (bool) $this->betterNodeFinder->findFirst($node->stmts, function (Node $node) use($keyVar) : bool { - return $this->nodeComparator->areNodesEqual($node, $keyVar); - }); - if ($isNodeUsed) { - return null; + $hasChanged = \false; + foreach ($node->stmts as $key => $stmt) { + if (!$stmt instanceof Foreach_) { + continue; + } + if (!$stmt->keyVar instanceof Variable) { + continue; + } + $keyVar = $stmt->keyVar; + $isNodeUsed = (bool) $this->betterNodeFinder->findFirst($stmt->stmts, function (Node $node) use($keyVar) : bool { + return $this->nodeComparator->areNodesEqual($node, $keyVar); + }); + if ($isNodeUsed) { + continue; + } + if ($this->stmtsManipulator->isVariableUsedInNextStmt($node, $key + 1, (string) $this->getName($keyVar))) { + continue; + } + $stmt->keyVar = null; + $hasChanged = \true; + } + if ($hasChanged) { + return $node; } - $node->keyVar = null; - return $node; + return null; } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php index be7600c81..ae7e9dcc2 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveUnusedNonEmptyArrayBeforeForeachRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; @@ -115,18 +116,15 @@ private function isUselessBeforeForeachCheck(If_ $if, Scope $scope) : bool /** @var Foreach_ $foreach */ $foreach = $if->stmts[0]; $foreachExpr = $foreach->expr; - if ($foreachExpr instanceof Variable) { - $variableName = $this->nodeNameResolver->getName($foreachExpr); - if (\is_string($variableName) && $this->reservedKeywordAnalyzer->isNativeVariable($variableName)) { - return \false; - } + if ($this->shouldSkipForeachExpr($foreachExpr, $scope)) { + return \false; } $ifCond = $if->cond; if ($ifCond instanceof BooleanAnd) { return $this->isUselessBooleanAnd($ifCond, $foreachExpr); } if (($ifCond instanceof Variable || $this->propertyFetchAnalyzer->isPropertyFetch($ifCond)) && $this->nodeComparator->areNodesEqual($ifCond, $foreachExpr)) { - $ifType = $scope->getType($ifCond); + $ifType = $scope->getNativeType($ifCond); return $ifType->isArray()->yes(); } if ($this->uselessIfCondBeforeForeachDetector->isMatchingNotIdenticalEmptyArray($if, $foreachExpr)) { @@ -186,4 +184,25 @@ private function refactorIf(If_ $if, Scope $scope) : ?Foreach_ $stmt->setAttribute(AttributeKey::COMMENTS, $comments); return $stmt; } + private function shouldSkipForeachExpr(Expr $foreachExpr, Scope $scope) : bool + { + if ($foreachExpr instanceof ArrayDimFetch && $foreachExpr->dim !== null) { + $exprType = $this->nodeTypeResolver->getNativeType($foreachExpr->var); + $dimType = $this->nodeTypeResolver->getNativeType($foreachExpr->dim); + if (!$exprType->hasOffsetValueType($dimType)->yes()) { + return \true; + } + } + if ($foreachExpr instanceof Variable) { + $variableName = $this->nodeNameResolver->getName($foreachExpr); + if (\is_string($variableName) && $this->reservedKeywordAnalyzer->isNativeVariable($variableName)) { + return \true; + } + $ifType = $scope->getNativeType($foreachExpr); + if (!$ifType->isArray()->yes()) { + return \true; + } + } + return \false; + } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php index f4f2d8d9c..0ebc960db 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php @@ -4,6 +4,7 @@ namespace Rector\DeadCode\Rector\Node; use PhpParser\Node; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\CallLike; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\New_; @@ -13,6 +14,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\If_; +use PhpParser\Node\Stmt\InlineHTML; use PhpParser\Node\Stmt\Nop; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Static_; @@ -136,7 +138,7 @@ public function refactor(Node $node) : ?Node continue; } $variableName = \ltrim($varTagValueNode->variableName, '$'); - if ($variableName === '' && $this->isAnnotatableReturn($stmt)) { + if ($variableName === '' && $this->isAllowedEmptyVariableName($stmt)) { continue; } if ($this->hasVariableName($stmt, $variableName)) { @@ -172,7 +174,7 @@ private function shouldSkip(StmtsAwareInterface $stmtsAware, int $key, Stmt $stm return \true; } } - return \false; + return isset($stmtsAware->stmts[$key + 1]) && $stmtsAware->stmts[$key + 1] instanceof InlineHTML; } private function hasVariableName(Stmt $stmt, string $variableName) : bool { @@ -200,8 +202,11 @@ private function isObjectShapePseudoType(VarTagValueNode $varTagValueNode) : boo } return \strpos($varTagValueNode->description, '}') !== \false; } - private function isAnnotatableReturn(Stmt $stmt) : bool + private function isAllowedEmptyVariableName(Stmt $stmt) : bool { - return $stmt instanceof Return_ && $stmt->expr instanceof CallLike && !$stmt->expr instanceof New_; + if ($stmt instanceof Return_ && $stmt->expr instanceof CallLike && !$stmt->expr instanceof New_) { + return \true; + } + return $stmt instanceof Expression && $stmt->expr instanceof Assign && $stmt->expr->var instanceof Variable; } } diff --git a/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php b/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php index 8ee119cc8..0be20e52c 100644 --- a/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php +++ b/vendor/rector/rector/rules/DeadCode/SideEffect/PureFunctionDetector.php @@ -75,6 +75,7 @@ final class PureFunctionDetector 'header_remove', 'http_response_code', 'setcookie', + 'file_get_contents', // output buffer 'ob_start', 'ob_end_clean', diff --git a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php index 4ad76b9f1..207ffc74a 100644 --- a/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php +++ b/vendor/rector/rector/rules/Naming/ExpectedNameResolver/MatchParamTypeExpectedNameResolver.php @@ -5,6 +5,7 @@ use PhpParser\Node\Param; use PHPStan\Type\ObjectType; +use PHPStan\Type\Type; use Rector\Naming\Naming\PropertyNaming; use Rector\Naming\ValueObject\ExpectedName; use Rector\StaticTypeMapper\StaticTypeMapper; @@ -34,7 +35,7 @@ public function resolve(Param $param) : ?string $staticType = $this->staticTypeMapper->mapPhpParserNodePHPStanType($param->type); // include nullable too // skip date time + date time interface, as should be kept - if ($staticType->isSuperTypeOf(new ObjectType('DateTimeInterface'))->yes()) { + if ($this->isDateTimeType($staticType)) { return null; } $expectedName = $this->propertyNaming->getExpectedNameFromType($staticType); @@ -43,4 +44,11 @@ public function resolve(Param $param) : ?string } return $expectedName->getName(); } + private function isDateTimeType(Type $type) : bool + { + if ($type->isSuperTypeOf(new ObjectType('DateTimeInterface'))->yes()) { + return \true; + } + return $type->isSuperTypeOf(new ObjectType('DateTime'))->yes(); + } } diff --git a/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php b/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php index f5be7d942..576a34c63 100644 --- a/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php +++ b/vendor/rector/rector/rules/Naming/Guard/BreakingVariableRenameGuard.php @@ -187,6 +187,16 @@ private function isDateTimeAtNamingConvention(Param $param) : bool } private function isGenerator(Param $param) : bool { - return $this->nodeTypeResolver->isObjectType($param, new ObjectType('Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator')); + if (!$param->type instanceof Node) { + return \false; + } + $paramType = $this->nodeTypeResolver->getType($param); + if (!$paramType instanceof ObjectType) { + return \false; + } + if (\substr_compare($paramType->getClassName(), 'Generator', -\strlen('Generator')) === 0 || \substr_compare($paramType->getClassName(), 'Iterator', -\strlen('Iterator')) === 0) { + return \true; + } + return $paramType->isInstanceOf('Symfony\\Component\\DependencyInjection\\Argument\\RewindableGenerator')->yes(); } } diff --git a/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php b/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php index 321530f6f..0fc0e9ae9 100644 --- a/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php +++ b/vendor/rector/rector/rules/Naming/Naming/ExpectedNameResolver.php @@ -119,8 +119,7 @@ public function resolveForCall($expr) : ?string if ($returnedType instanceof MixedType) { return null; } - if ($returnedType instanceof ObjectType && $returnedType->isInstanceOf('DateTimeInterface')->yes()) { - // skip date time, as custom naming + if ($this->isDateTimeType($returnedType)) { return null; } $expectedName = $this->propertyNaming->getExpectedNameFromType($returnedType); @@ -195,4 +194,17 @@ private function resolveReturnTypeFromArrayType(ArrayType $arrayType) : ?Type } return $arrayType->getItemType(); } + /** + * Skip date time, as custom naming + */ + private function isDateTimeType(Type $type) : bool + { + if (!$type instanceof ObjectType) { + return \false; + } + if ($type->isInstanceOf('DateTimeInterface')->yes()) { + return \true; + } + return $type->isInstanceOf('DateTime')->yes(); + } } diff --git a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php index ca3e0d0c0..1754d65eb 100644 --- a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php @@ -87,6 +87,10 @@ public function refactor(Node $node) : ?Node $assignsOfNew = $this->getAssignsOfNew($node); foreach ($assignsOfNew as $assignOfNew) { $expectedName = $this->expectedNameResolver->resolveForAssignNew($assignOfNew); + // skip self name as not useful + if ($expectedName === 'self') { + continue; + } /** @var Variable $variable */ $variable = $assignOfNew->var; if ($expectedName === null) { diff --git a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php index 985110955..22f2c6a4b 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchMethodCallReturnTypeRector.php @@ -49,6 +49,10 @@ final class RenameForeachValueVariableToMatchMethodCallReturnTypeRector extends * @var \Rector\Naming\Matcher\ForeachMatcher */ private $foreachMatcher; + /** + * @var string[] + */ + private const UNREADABLE_GENERIC_NAMES = ['traversable', 'iterable', 'generator', 'rewindableGenerator']; public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, NamingConventionAnalyzer $namingConventionAnalyzer, VariableRenamer $variableRenamer, ForeachMatcher $foreachMatcher) { $this->breakingVariableRenameGuard = $breakingVariableRenameGuard; @@ -137,6 +141,9 @@ public function refactor(Node $node) : ?Node } private function shouldSkip(VariableAndCallForeach $variableAndCallForeach, string $expectedName) : bool { + if (\in_array($expectedName, self::UNREADABLE_GENERIC_NAMES, \true)) { + return \true; + } if ($this->namingConventionAnalyzer->isCallMatchingVariableName($variableAndCallForeach->getCall(), $variableAndCallForeach->getVariableName(), $expectedName)) { return \true; } diff --git a/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php b/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php index 1108e9dcd..42c513df0 100644 --- a/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/ClassMethod/Php4ConstructorRector.php @@ -100,7 +100,7 @@ public function refactorWithScope(Node $node, Scope $scope) // process parent call references first $this->processClassMethodStatementsForParentConstructorCalls($psr4ConstructorMethod, $scope); // does it already have a __construct method? - if (!$classReflection->hasConstructor()) { + if (!$classReflection->hasNativeMethod(MethodName::CONSTRUCT)) { $psr4ConstructorMethod->name = new Identifier(MethodName::CONSTRUCT); } $classMethodStmts = $psr4ConstructorMethod->stmts; diff --git a/vendor/rector/rector/rules/Php74/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php b/vendor/rector/rector/rules/Php74/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php index f39dee4f6..1b3cd8a4d 100644 --- a/vendor/rector/rector/rules/Php74/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/FuncCall/ArraySpreadInsteadOfArrayMergeRector.php @@ -96,6 +96,9 @@ public function provideMinPhpVersion() : int } private function refactorArray(FuncCall $funcCall) : ?Array_ { + if ($funcCall->isFirstClassCallable()) { + return null; + } $array = new Array_(); foreach ($funcCall->args as $arg) { if (!$arg instanceof Arg) { @@ -135,10 +138,8 @@ private function isArrayKeyTypeAllowed(ArrayType $arrayType) : bool if ($arrayType->getKeyType()->isInteger()->yes()) { return \true; } - if (!$this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::ARRAY_SPREAD_STRING_KEYS)) { - return \false; - } - return $arrayType->getKeyType()->isString()->yes(); + // php 8.1+ allow mixed key: int, string, and null + return $this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::ARRAY_SPREAD_STRING_KEYS); } private function resolveValue(Expr $expr) : Expr { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php index 0e6bd3681..c8a4ca7a4 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php @@ -22,20 +22,22 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; +use PHPStan\Analyser\Scope; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\BooleanType; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\Node\Value\ValueResolver; -use Rector\Core\Rector\AbstractRector; +use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; +use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\BoolReturnTypeFromStrictScalarReturnsRector\BoolReturnTypeFromStrictScalarReturnsRectorTest */ -final class BoolReturnTypeFromStrictScalarReturnsRector extends AbstractRector implements MinPhpVersionInterface +final class BoolReturnTypeFromStrictScalarReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface { /** * @readonly @@ -57,12 +59,18 @@ final class BoolReturnTypeFromStrictScalarReturnsRector extends AbstractRector i * @var \Rector\Core\PhpParser\Node\BetterNodeFinder */ private $betterNodeFinder; - public function __construct(ReturnAnalyzer $returnAnalyzer, ReflectionProvider $reflectionProvider, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder) + /** + * @readonly + * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard + */ + private $classMethodReturnTypeOverrideGuard; + public function __construct(ReturnAnalyzer $returnAnalyzer, ReflectionProvider $reflectionProvider, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) { $this->returnAnalyzer = $returnAnalyzer; $this->reflectionProvider = $reflectionProvider; $this->valueResolver = $valueResolver; $this->betterNodeFinder = $betterNodeFinder; + $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; } public function getRuleDefinition() : RuleDefinition { @@ -104,9 +112,9 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_|Closure $node */ - public function refactor(Node $node) : ?Node + public function refactorWithScope(Node $node, Scope $scope) : ?Node { - if ($node->returnType instanceof Node) { + if ($this->shouldSkip($node, $scope)) { return null; } $returns = $this->betterNodeFinder->findInstancesOfInFunctionLikeScoped($node, Return_::class); @@ -120,6 +128,16 @@ public function provideMinPhpVersion() : int { return PhpVersionFeature::SCALAR_TYPES; } + /** + * @param ClassMethod|Function_|Closure $node + */ + private function shouldSkip(Node $node, Scope $scope) : bool + { + if ($node->returnType instanceof Node) { + return \true; + } + return $node instanceof ClassMethod && $this->classMethodReturnTypeOverrideGuard->shouldSkipClassMethod($node, $scope); + } /** * @param Return_[] $returns * @param \PhpParser\Node\Stmt\ClassMethod|\PhpParser\Node\Stmt\Function_|\PhpParser\Node\Expr\Closure $functionLike diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php index f518cd943..d353d04c8 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/NumericReturnTypeFromStrictScalarReturnsRector.php @@ -23,18 +23,29 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; +use PHPStan\Analyser\Scope; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; -use Rector\Core\Rector\AbstractRector; +use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\TypeDeclaration\Rector\ClassMethod\NumericReturnTypeFromStrictScalarReturnsRector\NumericReturnTypeFromStrictScalarReturnsRectorTest */ -final class NumericReturnTypeFromStrictScalarReturnsRector extends AbstractRector implements MinPhpVersionInterface +final class NumericReturnTypeFromStrictScalarReturnsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard + */ + private $classMethodReturnTypeOverrideGuard; + public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) + { + $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change numeric return type based on strict returns type operations', [new CodeSample(<<<'CODE_SAMPLE' @@ -67,7 +78,7 @@ public function getNodeTypes() : array /** * @param ClassMethod|Function_|Closure $node */ - public function refactor(Node $node) : ?Node + public function refactorWithScope(Node $node, Scope $scope) : ?Node { if ($node->returnType instanceof Node) { return null; @@ -75,6 +86,9 @@ public function refactor(Node $node) : ?Node if ($node->stmts === null) { return null; } + if ($node instanceof ClassMethod && $this->classMethodReturnTypeOverrideGuard->shouldSkipClassMethod($node, $scope)) { + return null; + } $return = $this->matchRootReturnWithExpr($node); if (!$return instanceof Return_) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php index bb5469f53..50eaf1a2a 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddReturnTypeDeclarationFromYieldsRector.php @@ -17,9 +17,10 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use PhpParser\NodeTraverser; +use PHPStan\Analyser\Scope; use PHPStan\Type\MixedType; use PHPStan\Type\Type; -use Rector\Core\Rector\AbstractRector; +use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; @@ -27,13 +28,14 @@ use Rector\StaticTypeMapper\StaticTypeMapper; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedGenericObjectType; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; +use Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\TypeDeclaration\Rector\FunctionLike\AddReturnTypeDeclarationFromYieldsRector\AddReturnTypeDeclarationFromYieldsRectorTest */ -final class AddReturnTypeDeclarationFromYieldsRector extends AbstractRector implements MinPhpVersionInterface +final class AddReturnTypeDeclarationFromYieldsRector extends AbstractScopeAwareRector implements MinPhpVersionInterface { /** * @readonly @@ -50,11 +52,17 @@ final class AddReturnTypeDeclarationFromYieldsRector extends AbstractRector impl * @var \Rector\StaticTypeMapper\StaticTypeMapper */ private $staticTypeMapper; - public function __construct(TypeFactory $typeFactory, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, StaticTypeMapper $staticTypeMapper) + /** + * @readonly + * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard + */ + private $classMethodReturnTypeOverrideGuard; + public function __construct(TypeFactory $typeFactory, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, StaticTypeMapper $staticTypeMapper, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) { $this->typeFactory = $typeFactory; $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; $this->staticTypeMapper = $staticTypeMapper; + $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; } public function getRuleDefinition() : RuleDefinition { @@ -91,7 +99,7 @@ public function getNodeTypes() : array /** * @param Function_|ClassMethod|Closure $node */ - public function refactor(Node $node) : ?Node + public function refactorWithScope(Node $node, Scope $scope) : ?Node { $yieldNodes = $this->findCurrentScopeYieldNodes($node); if ($yieldNodes === []) { @@ -101,6 +109,9 @@ public function refactor(Node $node) : ?Node if ($node->returnType instanceof Node && $this->isNames($node->returnType, ['Iterator', 'Generator', 'Traversable'])) { return null; } + if ($node instanceof ClassMethod && $this->classMethodReturnTypeOverrideGuard->shouldSkipClassMethod($node, $scope)) { + return null; + } $yieldType = $this->resolveYieldType($yieldNodes, $node); $returnTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($yieldType, TypeKind::RETURN); if (!$returnTypeNode instanceof Node) { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php index f06906dde..d26e7b3b4 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/StmtsAwareInterface/DeclareStrictTypesRector.php @@ -44,6 +44,10 @@ function someFunction() public function beforeTraverse(array $nodes) : ?array { parent::beforeTraverse($nodes); + $filePath = $this->file->getFilePath(); + if ($this->skipper->shouldSkipElementAndFilePath(self::class, $filePath)) { + return null; + } $newStmts = $this->file->getNewStmts(); if ($newStmts === []) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php index 70ed54dc4..610db5089 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeNormalizer.php @@ -11,18 +11,12 @@ use PHPStan\Type\TypeTraverser; use PHPStan\Type\UnionType; use Rector\Core\Util\Reflection\PrivatesAccessor; -use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; use Rector\TypeDeclaration\ValueObject\NestedArrayType; /** * @see \Rector\Tests\TypeDeclaration\TypeNormalizerTest */ final class TypeNormalizer { - /** - * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Type\TypeFactory - */ - private $typeFactory; /** * @readonly * @var \Rector\Core\Util\Reflection\PrivatesAccessor @@ -32,9 +26,8 @@ final class TypeNormalizer * @var NestedArrayType[] */ private $collectedNestedArrayTypes = []; - public function __construct(TypeFactory $typeFactory, PrivatesAccessor $privatesAccessor) + public function __construct(PrivatesAccessor $privatesAccessor) { - $this->typeFactory = $typeFactory; $this->privatesAccessor = $privatesAccessor; } /** @@ -80,16 +73,6 @@ public function normalizeArrayTypeAndArrayNever(Type $type) : Type $this->privatesAccessor->setPrivateProperty($traversedType, 'itemType', new MixedType()); return $traversedType; } - if ($traversedType instanceof UnionType) { - $traversedTypeTypes = $traversedType->getTypes(); - $countTraversedTypes = \count($traversedTypeTypes); - $collectedTypes = $this->getCollectedTypes($traversedTypeTypes); - $countCollectedTypes = \count($collectedTypes); - // re-create new union types - if ($countTraversedTypes !== $countCollectedTypes && $countTraversedTypes > 2) { - return $this->typeFactory->createMixedPassedOrUnionType($collectedTypes); - } - } if ($traversedType instanceof NeverType) { return new MixedType(); } @@ -100,22 +83,6 @@ private function isConstantArrayNever(Type $type) : bool { return $type instanceof ConstantArrayType && $type->getKeyType() instanceof NeverType && $type->getItemType() instanceof NeverType; } - /** - * @param Type[] $traversedTypeTypes - * @return Type[] - */ - private function getCollectedTypes(array $traversedTypeTypes) : array - { - $collectedTypes = []; - foreach ($traversedTypeTypes as $traversedTypeType) { - // basically an empty array - not useful at all - if ($this->isArrayNeverType($traversedTypeType)) { - continue; - } - $collectedTypes[] = $traversedTypeType; - } - return $collectedTypes; - } private function collectNestedArrayTypeFromUnionType(UnionType $unionType, int $arrayNesting) : void { foreach ($unionType->getTypes() as $unionedType) { @@ -147,11 +114,4 @@ private function createUnionedTypesFromArrayTypes(array $collectedNestedArrayTyp } return $unionedTypes[0]; } - private function isArrayNeverType(Type $type) : bool - { - if (!$type instanceof ArrayType) { - return \false; - } - return $type->getKeyType() instanceof NeverType && $type->getItemType() instanceof NeverType; - } } diff --git a/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php b/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php index 5a893c22d..7dc916a27 100644 --- a/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php +++ b/vendor/rector/rector/src/Application/ChangedNodeScopeRefresher.php @@ -50,7 +50,6 @@ public function refresh(Node $node, string $filePath, ?MutatingScope $mutatingSc if (!$this->scopeAnalyzer->isRefreshable($node)) { return; } - $mutatingScope = $mutatingScope instanceof MutatingScope ? $mutatingScope : $this->scopeAnalyzer->resolveScope($node, $filePath); if (!$mutatingScope instanceof MutatingScope) { $errorMessage = \sprintf('Node "%s" with is missing scope required for scope refresh', \get_class($node)); throw new ShouldNotHappenException($errorMessage); diff --git a/vendor/rector/rector/src/Application/VersionResolver.php b/vendor/rector/rector/src/Application/VersionResolver.php index 28675c654..7a9038b56 100644 --- a/vendor/rector/rector/src/Application/VersionResolver.php +++ b/vendor/rector/rector/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = '0.18.5'; + public const PACKAGE_VERSION = '0.18.6'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-10-05 08:18:12'; + public const RELEASE_DATE = '2023-10-24 16:57:04'; /** * @var int */ diff --git a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php index 0e1d1286d..082e59c60 100644 --- a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php +++ b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php @@ -252,7 +252,7 @@ public function create() : RectorConfig $rectorConfig->collector(ParentClassCollector::class); $rectorConfig->singleton(Application::class, static function (Container $container) : Application { $application = $container->make(ConsoleApplication::class); - $commandNamesToHide = ['list', 'completion', 'help']; + $commandNamesToHide = ['list', 'completion', 'help', 'worker']; foreach ($commandNamesToHide as $commandNameToHide) { $commandToHide = $application->get($commandNameToHide); $commandToHide->setHidden(); diff --git a/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php index 660a6e9dc..c03b86dc3 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/ExprAnalyzer.php @@ -8,6 +8,8 @@ use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\ConstFetch; +use PhpParser\Node\Expr\UnaryMinus; +use PhpParser\Node\Expr\UnaryPlus; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Identifier; use PhpParser\Node\Name; @@ -44,14 +46,18 @@ public function isNonTypedFromParam(Expr $expr) : bool } public function isDynamicExpr(Expr $expr) : bool { - if (!$expr instanceof Array_) { - if ($expr instanceof Scalar) { - // string interpolation is true, otherwise false - return $expr instanceof Encapsed; - } - return !$this->isAllowedConstFetchOrClassConstFetch($expr); + // Unwrap UnaryPlus and UnaryMinus + if ($expr instanceof UnaryPlus || $expr instanceof UnaryMinus) { + $expr = $expr->expr; + } + if ($expr instanceof Array_) { + return $this->isDynamicArray($expr); + } + if ($expr instanceof Scalar) { + // string interpolation is true, otherwise false + return $expr instanceof Encapsed; } - return $this->isDynamicArray($expr); + return !$this->isAllowedConstFetchOrClassConstFetch($expr); } public function isDynamicArray(Array_ $array) : bool { diff --git a/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php index 185f309d5..4abcdf8af 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/ScopeAnalyzer.php @@ -9,25 +9,12 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Name; use PhpParser\Node\Param; -use PhpParser\Node\Stmt; -use PHPStan\Analyser\Scope; -use Rector\NodeTypeResolver\Node\AttributeKey; -use Rector\NodeTypeResolver\PHPStan\Scope\ScopeFactory; final class ScopeAnalyzer { - /** - * @readonly - * @var \Rector\NodeTypeResolver\PHPStan\Scope\ScopeFactory - */ - private $scopeFactory; /** * @var array> */ private const NON_REFRESHABLE_NODES = [Name::class, Identifier::class, Param::class, Arg::class, Variable::class]; - public function __construct(ScopeFactory $scopeFactory) - { - $this->scopeFactory = $scopeFactory; - } public function isRefreshable(Node $node) : bool { foreach (self::NON_REFRESHABLE_NODES as $noScopeNode) { @@ -37,19 +24,4 @@ public function isRefreshable(Node $node) : bool } return \true; } - public function resolveScope(Node $node, string $filePath) : ?Scope - { - // on File level - if ($node instanceof Stmt && $node->getAttribute(AttributeKey::STATEMENT_DEPTH) === 0) { - return $this->scopeFactory->createFromFile($filePath); - } - /** - * Node and parent Node doesn't has Scope, and Node Start token pos is < 0, - * it means the node and parent node just re-printed, the Scope need to be resolved from file - */ - if ($node->getStartTokenPos() < 0) { - return $this->scopeFactory->createFromFile($filePath); - } - return null; - } } diff --git a/vendor/rector/rector/src/PhpParser/AstResolver.php b/vendor/rector/rector/src/PhpParser/AstResolver.php index 6d844a579..51204899b 100644 --- a/vendor/rector/rector/src/PhpParser/AstResolver.php +++ b/vendor/rector/rector/src/PhpParser/AstResolver.php @@ -26,6 +26,7 @@ use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\TypeWithClassName; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Reflection\MethodReflectionResolver; use Rector\Core\ValueObject\MethodName; use Rector\NodeNameResolver\NodeNameResolver; @@ -72,14 +73,14 @@ final class AstResolver private $nodeTypeResolver; /** * @readonly - * @var \Rector\Core\PhpParser\ClassLikeAstResolver + * @var \Rector\Core\Reflection\MethodReflectionResolver */ - private $classLikeAstResolver; + private $methodReflectionResolver; /** * @readonly - * @var \Rector\Core\Reflection\MethodReflectionResolver + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder */ - private $methodReflectionResolver; + private $betterNodeFinder; /** * Parsing files is very heavy performance, so this will help to leverage it * The value can be also null, when no statements could be parsed from the file. @@ -87,7 +88,7 @@ final class AstResolver * @var array */ private $parsedFileNodes = []; - public function __construct(SmartPhpParser $smartPhpParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, \Rector\Core\PhpParser\ClassLikeAstResolver $classLikeAstResolver, MethodReflectionResolver $methodReflectionResolver) + public function __construct(SmartPhpParser $smartPhpParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, NodeTypeResolver $nodeTypeResolver, MethodReflectionResolver $methodReflectionResolver, BetterNodeFinder $betterNodeFinder) { $this->smartPhpParser = $smartPhpParser; $this->nodeScopeAndMetadataDecorator = $nodeScopeAndMetadataDecorator; @@ -95,8 +96,8 @@ public function __construct(SmartPhpParser $smartPhpParser, NodeScopeAndMetadata $this->nodeNameResolver = $nodeNameResolver; $this->reflectionProvider = $reflectionProvider; $this->nodeTypeResolver = $nodeTypeResolver; - $this->classLikeAstResolver = $classLikeAstResolver; $this->methodReflectionResolver = $methodReflectionResolver; + $this->betterNodeFinder = $betterNodeFinder; } /** * @api downgrade @@ -114,14 +115,7 @@ public function resolveClassMethodFromMethodReflection(MethodReflection $methodR { $classReflection = $methodReflection->getDeclaringClass(); $fileName = $classReflection->getFileName(); - // probably native PHP method → un-parseable - if ($fileName === null) { - return null; - } $nodes = $this->parseFileNameToDecoratedNodes($fileName); - if ($nodes === []) { - return null; - } $classLikeName = $classReflection->getName(); $methodName = $methodReflection->getName(); $classMethod = null; @@ -156,13 +150,7 @@ public function resolveClassMethodOrFunctionFromCall($call, Scope $scope) public function resolveFunctionFromFunctionReflection(FunctionReflection $functionReflection) : ?Function_ { $fileName = $functionReflection->getFileName(); - if ($fileName === null) { - return null; - } $nodes = $this->parseFileNameToDecoratedNodes($fileName); - if ($nodes === []) { - return null; - } $functionName = $functionReflection->getName(); $functionNode = null; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($functionName, &$functionNode) : ?int { @@ -213,7 +201,20 @@ public function resolveClassMethodFromCall($call) : ?ClassMethod */ public function resolveClassFromClassReflection(ClassReflection $classReflection) { - return $this->classLikeAstResolver->resolveClassFromClassReflection($classReflection, $this); + if ($classReflection->isBuiltin()) { + return null; + } + $fileName = $classReflection->getFileName(); + $stmts = $this->parseFileNameToDecoratedNodes($fileName); + $className = $classReflection->getName(); + /** @var Class_|Trait_|Interface_|Enum_|null $classLike */ + $classLike = $this->betterNodeFinder->findFirst($stmts, function (Node $node) use($className) : bool { + if (!$node instanceof ClassLike) { + return \false; + } + return $this->nodeNameResolver->isName($node, $className); + }); + return $classLike; } /** * @return Trait_[] @@ -225,13 +226,7 @@ public function parseClassReflectionTraits(ClassReflection $classReflection) : a $traits = []; foreach ($classLikes as $classLike) { $fileName = $classLike->getFileName(); - if ($fileName === null) { - continue; - } $nodes = $this->parseFileNameToDecoratedNodes($fileName); - if ($nodes === []) { - continue; - } $traitName = $classLike->getName(); $traitNode = null; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, function (Node $node) use($traitName, &$traitNode) : ?int { @@ -258,9 +253,6 @@ public function resolvePropertyFromPropertyReflection(PhpPropertyReflection $php { $classReflection = $phpPropertyReflection->getDeclaringClass(); $fileName = $classReflection->getFileName(); - if ($fileName === null) { - return null; - } $nodes = $this->parseFileNameToDecoratedNodes($fileName); if ($nodes === []) { return null; @@ -293,8 +285,12 @@ public function resolvePropertyFromPropertyReflection(PhpPropertyReflection $php /** * @return Stmt[] */ - public function parseFileNameToDecoratedNodes(string $fileName) : array + public function parseFileNameToDecoratedNodes(?string $fileName) : array { + // probably native PHP → un-parseable + if ($fileName === null) { + return []; + } if (isset($this->parsedFileNodes[$fileName])) { return $this->parsedFileNodes[$fileName]; } diff --git a/vendor/rector/rector/src/PhpParser/ClassLikeAstResolver.php b/vendor/rector/rector/src/PhpParser/ClassLikeAstResolver.php deleted file mode 100644 index 7f7ebf030..000000000 --- a/vendor/rector/rector/src/PhpParser/ClassLikeAstResolver.php +++ /dev/null @@ -1,62 +0,0 @@ -betterNodeFinder = $betterNodeFinder; - $this->nodeNameResolver = $nodeNameResolver; - } - /** - * @return \PhpParser\Node\Stmt\Trait_|\PhpParser\Node\Stmt\Class_|\PhpParser\Node\Stmt\Interface_|\PhpParser\Node\Stmt\Enum_|null - */ - public function resolveClassFromClassReflection(ClassReflection $classReflection, \Rector\Core\PhpParser\AstResolver $astResolver) - { - if ($classReflection->isBuiltin()) { - return null; - } - $fileName = $classReflection->getFileName(); - // probably internal class - if ($fileName === null) { - return null; - } - $stmts = $astResolver->parseFileNameToDecoratedNodes($fileName); - if ($stmts === []) { - return null; - } - $className = $classReflection->getName(); - /** @var Class_|Trait_|Interface_|Enum_|null $classLike */ - $classLike = $this->betterNodeFinder->findFirst($stmts, function (Node $node) use($className) : bool { - if (!$node instanceof ClassLike) { - return \false; - } - return $this->nodeNameResolver->isName($node, $className); - }); - return $classLike; - } -} diff --git a/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php b/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php index 9cdf7c5a4..1b46699d3 100644 --- a/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php +++ b/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php @@ -317,6 +317,16 @@ public function createReturnBooleanAnd(array $newNodes) : ?Expr } return $this->createBooleanAndFromNodes($newNodes); } + public function createReprintedExpr(Expr $expr) : Expr + { + // reset original node, to allow the printer to re-use the expr + $expr->setAttribute(AttributeKey::ORIGINAL_NODE, null); + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($expr, static function (Node $node) : Node { + $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + return $node; + }); + return $expr; + } /** * @param string|int|null $key * @param mixed $item @@ -401,14 +411,4 @@ private function createMethodCaller($exprOrVariableName) } return $exprOrVariableName; } - public function createReprintedExpr(Expr $expr) : Expr - { - // reset original node, to allow the printer to re-use the expr - $expr->setAttribute(AttributeKey::ORIGINAL_NODE, null); - $this->simpleCallableNodeTraverser->traverseNodesWithCallable($expr, static function (Node $node) : Node { - $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); - return $node; - }); - return $expr; - } } diff --git a/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php b/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php index ead89e531..1c47cab3a 100644 --- a/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php +++ b/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php @@ -11,6 +11,7 @@ * This service verify if the Node: * * - already applied same Rector rule before current Rector rule on last previous Rector rule. + * - Just added as new Stmt * - just re-printed but token start still >= 0 * - has above node skipped traverse children on current rule */ @@ -25,11 +26,18 @@ public function hasRectified(string $rectorClass, Node $node) : bool if ($this->hasConsecutiveCreatedByRule($rectorClass, $node, $originalNode)) { return \true; } + if ($this->isJustAddedAsNewStmt($node, $originalNode)) { + return \true; + } if ($this->isJustReprintedOverlappedTokenStart($node, $originalNode)) { return \true; } return $node->getAttribute(AttributeKey::SKIPPED_BY_RECTOR_RULE) === $rectorClass; } + private function isJustAddedAsNewStmt(Node $node, ?Node $originalNode) : bool + { + return !$originalNode instanceof Node && $node instanceof Stmt && \array_keys($node->getAttributes()) === [AttributeKey::SCOPE]; + } /** * @param class-string $rectorClass */ @@ -39,7 +47,7 @@ private function hasConsecutiveCreatedByRule(string $rectorClass, Node $node, ?N /** @var class-string[] $createdByRule */ $createdByRule = $createdByRuleNode->getAttribute(AttributeKey::CREATED_BY_RULE) ?? []; if ($createdByRule === []) { - return !$originalNode instanceof Node && $node instanceof Stmt && \count($node->getAttributes()) <= 1; + return \false; } return \end($createdByRule) === $rectorClass; } @@ -55,6 +63,12 @@ private function isJustReprintedOverlappedTokenStart(Node $node, ?Node $original * - Parent Node's original node is null */ $startTokenPos = $node->getStartTokenPos(); - return $startTokenPos >= 0; + if ($startTokenPos >= 0) { + return \true; + } + if ($node instanceof Stmt) { + return \array_keys($node->getAttributes()) === [AttributeKey::STMT_KEY]; + } + return $node->getAttributes() === []; } } diff --git a/vendor/rector/rector/src/Rector/AbstractRector.php b/vendor/rector/rector/src/Rector/AbstractRector.php index a6c7cc737..8bc6ff574 100644 --- a/vendor/rector/rector/src/Rector/AbstractRector.php +++ b/vendor/rector/rector/src/Rector/AbstractRector.php @@ -85,7 +85,7 @@ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInter /** * @var \Rector\Skipper\Skipper\Skipper */ - private $skipper; + protected $skipper; /** * @var \Rector\Core\Provider\CurrentFileProvider */ @@ -242,7 +242,7 @@ protected function getType(Node $node) : Type } /** * @param Node|Node[] $nodes - * @param callable(Node $node): (Node|null|int) $callable + * @param callable(Node): (int|Node|null|Node[]) $callable */ protected function traverseNodesWithCallable($nodes, callable $callable) : void { diff --git a/vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php b/vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php index e722420be..ad22e80c7 100644 --- a/vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php +++ b/vendor/rector/rector/src/Rector/AbstractScopeAwareRector.php @@ -9,18 +9,9 @@ use PHPStan\Analyser\Scope; use Rector\Core\Contract\Rector\ScopeAwareRectorInterface; use Rector\Core\Exception\ShouldNotHappenException; -use Rector\Core\NodeAnalyzer\ScopeAnalyzer; use Rector\NodeTypeResolver\Node\AttributeKey; abstract class AbstractScopeAwareRector extends \Rector\Core\Rector\AbstractRector implements ScopeAwareRectorInterface { - /** - * @var \Rector\Core\NodeAnalyzer\ScopeAnalyzer - */ - private $scopeAnalyzer; - public function autowireAbstractScopeAwareRector(ScopeAnalyzer $scopeAnalyzer) : void - { - $this->scopeAnalyzer = $scopeAnalyzer; - } /** * Process Node of matched type with its PHPStan scope * @return Node|Node[]|null|NodeTraverser::* @@ -29,9 +20,6 @@ public function refactor(Node $node) { /** @var MutatingScope|null $currentScope */ $currentScope = $node->getAttribute(AttributeKey::SCOPE); - if (!$currentScope instanceof MutatingScope) { - $currentScope = $this->scopeAnalyzer->resolveScope($node, $this->file->getFilePath()); - } if (!$currentScope instanceof Scope) { $errorMessage = \sprintf('Scope not available on "%s" node, but is required by a refactorWithScope() method of "%s" rule. Fix scope refresh on changed nodes first', \get_class($node), static::class); throw new ShouldNotHappenException($errorMessage); diff --git a/vendor/rector/rector/src/ValueObject/PhpVersion.php b/vendor/rector/rector/src/ValueObject/PhpVersion.php index 28d54b321..68b531b34 100644 --- a/vendor/rector/rector/src/ValueObject/PhpVersion.php +++ b/vendor/rector/rector/src/ValueObject/PhpVersion.php @@ -60,6 +60,10 @@ final class PhpVersion * @var int */ public const PHP_82 = 80200; + /** + * @var int + */ + public const PHP_83 = 80300; /** * @var int */ diff --git a/vendor/rector/rector/src/constants.php b/vendor/rector/rector/src/constants.php deleted file mode 100644 index 1fccac15f..000000000 --- a/vendor/rector/rector/src/constants.php +++ /dev/null @@ -1,13 +0,0 @@ - $baseDir . '/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php', 'Rector\\CodeQuality\\Rector\\Identical\\StrlenZeroToIdenticalEmptyStringRector' => $baseDir . '/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php', 'Rector\\CodeQuality\\Rector\\If_\\CombineIfRector' => $baseDir . '/rules/CodeQuality/Rector/If_/CombineIfRector.php', + 'Rector\\CodeQuality\\Rector\\If_\\CompleteMissingIfElseBracketRector' => $baseDir . '/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php', 'Rector\\CodeQuality\\Rector\\If_\\ConsecutiveNullCompareReturnsToNullCoalesceQueueRector' => $baseDir . '/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php', 'Rector\\CodeQuality\\Rector\\If_\\ExplicitBoolCompareRector' => $baseDir . '/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php', 'Rector\\CodeQuality\\Rector\\If_\\ShortenElseIfRector' => $baseDir . '/rules/CodeQuality/Rector/If_/ShortenElseIfRector.php', @@ -1236,7 +1237,6 @@ 'Rector\\Core\\PHPStan\\NodeVisitor\\UnreachableStatementNodeVisitor' => $baseDir . '/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php', 'Rector\\Core\\PHPStan\\NodeVisitor\\WrappedNodeRestoringNodeVisitor' => $baseDir . '/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php', 'Rector\\Core\\PhpParser\\AstResolver' => $baseDir . '/src/PhpParser/AstResolver.php', - 'Rector\\Core\\PhpParser\\ClassLikeAstResolver' => $baseDir . '/src/PhpParser/ClassLikeAstResolver.php', 'Rector\\Core\\PhpParser\\Comparing\\NodeComparator' => $baseDir . '/src/PhpParser/Comparing/NodeComparator.php', 'Rector\\Core\\PhpParser\\NodeFinder\\LocalMethodCallFinder' => $baseDir . '/src/PhpParser/NodeFinder/LocalMethodCallFinder.php', 'Rector\\Core\\PhpParser\\NodeFinder\\PropertyFetchFinder' => $baseDir . '/src/PhpParser/NodeFinder/PropertyFetchFinder.php', @@ -1322,6 +1322,7 @@ 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPromotedPropertyRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessParamTagRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnExprInConstructRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnTagRector' => $baseDir . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php', 'Rector\\DeadCode\\Rector\\Concat\\RemoveConcatAutocastRector' => $baseDir . '/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php', 'Rector\\DeadCode\\Rector\\ConstFetch\\RemovePhpVersionIdCheckRector' => $baseDir . '/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php', @@ -1473,6 +1474,7 @@ 'Rector\\DowngradePhp81\\Rector\\ClassConst\\DowngradeFinalizePublicClassConstantRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/ClassConst/DowngradeFinalizePublicClassConstantRector.php', 'Rector\\DowngradePhp81\\Rector\\FuncCall\\DowngradeArrayIsListRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeArrayIsListRector.php', 'Rector\\DowngradePhp81\\Rector\\FuncCall\\DowngradeFirstClassCallableSyntaxRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeFirstClassCallableSyntaxRector.php', + 'Rector\\DowngradePhp81\\Rector\\FuncCall\\DowngradeHashAlgorithmXxHashRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php', 'Rector\\DowngradePhp81\\Rector\\FunctionLike\\DowngradeNeverTypeDeclarationRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNeverTypeDeclarationRector.php', 'Rector\\DowngradePhp81\\Rector\\FunctionLike\\DowngradeNewInInitializerRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNewInInitializerRector.php', 'Rector\\DowngradePhp81\\Rector\\FunctionLike\\DowngradePureIntersectionTypeRector' => $vendorDir . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradePureIntersectionTypeRector.php', @@ -1631,7 +1633,6 @@ 'Rector\\PHPStanStaticTypeMapper\\DoctrineTypeAnalyzer' => $baseDir . '/packages/PHPStanStaticTypeMapper/DoctrineTypeAnalyzer.php', 'Rector\\PHPStanStaticTypeMapper\\Enum\\TypeKind' => $baseDir . '/packages/PHPStanStaticTypeMapper/Enum/TypeKind.php', 'Rector\\PHPStanStaticTypeMapper\\PHPStanStaticTypeMapper' => $baseDir . '/packages/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php', - 'Rector\\PHPStanStaticTypeMapper\\TypeAnalyzer\\BoolUnionTypeAnalyzer' => $baseDir . '/packages/PHPStanStaticTypeMapper/TypeAnalyzer/BoolUnionTypeAnalyzer.php', 'Rector\\PHPStanStaticTypeMapper\\TypeAnalyzer\\UnionTypeAnalyzer' => $baseDir . '/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeAnalyzer.php', 'Rector\\PHPStanStaticTypeMapper\\TypeAnalyzer\\UnionTypeCommonTypeNarrower' => $baseDir . '/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeCommonTypeNarrower.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\AccessoryLiteralStringTypeMapper' => $baseDir . '/packages/PHPStanStaticTypeMapper/TypeMapper/AccessoryLiteralStringTypeMapper.php', @@ -1688,6 +1689,7 @@ 'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareToSpecificMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertComparisonToSpecificMethodRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEmptyNullableObjectToAssertInstanceofRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEqualsToSameRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertFalseStrposToContainsRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertFalseStrposToContainsRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertInstanceOfComparisonRector' => $vendorDir . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertInstanceOfComparisonRector.php', @@ -2053,6 +2055,7 @@ 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\LoadValidatorMetadataToAnnotationRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\MakeCommandLazyRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Closure\\StringExtensionToConfigBuilderRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\AssertSameResponseCodeWithDebugContentsRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\LiteralGetToRequestClassConstantRector' => $vendorDir . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php', 'Rector\\Symfony\\Configs\\Rector\\ClassMethod\\AddRouteAnnotationRector' => $vendorDir . '/rector/rector-symfony/rules/Configs/Rector/ClassMethod/AddRouteAnnotationRector.php', 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceArgsToServiceNamedArgRector' => $vendorDir . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceArgsToServiceNamedArgRector.php', diff --git a/vendor/rector/rector/vendor/composer/autoload_files.php b/vendor/rector/rector/vendor/composer/autoload_files.php index 144d82469..df13d1c31 100644 --- a/vendor/rector/rector/vendor/composer/autoload_files.php +++ b/vendor/rector/rector/vendor/composer/autoload_files.php @@ -8,6 +8,5 @@ return array( 'ad155f8f1cf0d418fe49e248db8c661b' => $vendorDir . '/react/promise/src/functions_include.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', - '4508688f3cab21375725e8d11ca194a2' => $baseDir . '/src/constants.php', '30bca7fff093e8069bed7c55247e2bf8' => $baseDir . '/src/functions/node_helper.php', ); diff --git a/vendor/rector/rector/vendor/composer/autoload_real.php b/vendor/rector/rector/vendor/composer/autoload_real.php index 515139b73..840fd57aa 100644 --- a/vendor/rector/rector/vendor/composer/autoload_real.php +++ b/vendor/rector/rector/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit46a0b0ac2ea1371bb06be09a20f71c2b +class ComposerAutoloaderInit18ad0e678efbbb500e116f7c54cccdd4 { private static $loader; @@ -22,17 +22,17 @@ public static function getLoader() return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit46a0b0ac2ea1371bb06be09a20f71c2b', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInit18ad0e678efbbb500e116f7c54cccdd4', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit46a0b0ac2ea1371bb06be09a20f71c2b', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInit18ad0e678efbbb500e116f7c54cccdd4', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInit18ad0e678efbbb500e116f7c54cccdd4::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInit18ad0e678efbbb500e116f7c54cccdd4::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/rector/rector/vendor/composer/autoload_static.php b/vendor/rector/rector/vendor/composer/autoload_static.php index bc8eebd97..73e9aeefb 100644 --- a/vendor/rector/rector/vendor/composer/autoload_static.php +++ b/vendor/rector/rector/vendor/composer/autoload_static.php @@ -4,12 +4,11 @@ namespace Composer\Autoload; -class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b +class ComposerStaticInit18ad0e678efbbb500e116f7c54cccdd4 { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', - '4508688f3cab21375725e8d11ca194a2' => __DIR__ . '/../..' . '/src/constants.php', '30bca7fff093e8069bed7c55247e2bf8' => __DIR__ . '/../..' . '/src/functions/node_helper.php', ); @@ -1284,6 +1283,7 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b 'Rector\\CodeQuality\\Rector\\Identical\\SimplifyConditionsRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php', 'Rector\\CodeQuality\\Rector\\Identical\\StrlenZeroToIdenticalEmptyStringRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php', 'Rector\\CodeQuality\\Rector\\If_\\CombineIfRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/If_/CombineIfRector.php', + 'Rector\\CodeQuality\\Rector\\If_\\CompleteMissingIfElseBracketRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/If_/CompleteMissingIfElseBracketRector.php', 'Rector\\CodeQuality\\Rector\\If_\\ConsecutiveNullCompareReturnsToNullCoalesceQueueRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php', 'Rector\\CodeQuality\\Rector\\If_\\ExplicitBoolCompareRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php', 'Rector\\CodeQuality\\Rector\\If_\\ShortenElseIfRector' => __DIR__ . '/../..' . '/rules/CodeQuality/Rector/If_/ShortenElseIfRector.php', @@ -1455,7 +1455,6 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b 'Rector\\Core\\PHPStan\\NodeVisitor\\UnreachableStatementNodeVisitor' => __DIR__ . '/../..' . '/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php', 'Rector\\Core\\PHPStan\\NodeVisitor\\WrappedNodeRestoringNodeVisitor' => __DIR__ . '/../..' . '/src/PHPStan/NodeVisitor/WrappedNodeRestoringNodeVisitor.php', 'Rector\\Core\\PhpParser\\AstResolver' => __DIR__ . '/../..' . '/src/PhpParser/AstResolver.php', - 'Rector\\Core\\PhpParser\\ClassLikeAstResolver' => __DIR__ . '/../..' . '/src/PhpParser/ClassLikeAstResolver.php', 'Rector\\Core\\PhpParser\\Comparing\\NodeComparator' => __DIR__ . '/../..' . '/src/PhpParser/Comparing/NodeComparator.php', 'Rector\\Core\\PhpParser\\NodeFinder\\LocalMethodCallFinder' => __DIR__ . '/../..' . '/src/PhpParser/NodeFinder/LocalMethodCallFinder.php', 'Rector\\Core\\PhpParser\\NodeFinder\\PropertyFetchFinder' => __DIR__ . '/../..' . '/src/PhpParser/NodeFinder/PropertyFetchFinder.php', @@ -1541,6 +1540,7 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPrivateMethodRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUnusedPromotedPropertyRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessParamTagRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php', + 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnExprInConstructRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnExprInConstructRector.php', 'Rector\\DeadCode\\Rector\\ClassMethod\\RemoveUselessReturnTagRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php', 'Rector\\DeadCode\\Rector\\Concat\\RemoveConcatAutocastRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/Concat/RemoveConcatAutocastRector.php', 'Rector\\DeadCode\\Rector\\ConstFetch\\RemovePhpVersionIdCheckRector' => __DIR__ . '/../..' . '/rules/DeadCode/Rector/ConstFetch/RemovePhpVersionIdCheckRector.php', @@ -1692,6 +1692,7 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b 'Rector\\DowngradePhp81\\Rector\\ClassConst\\DowngradeFinalizePublicClassConstantRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/ClassConst/DowngradeFinalizePublicClassConstantRector.php', 'Rector\\DowngradePhp81\\Rector\\FuncCall\\DowngradeArrayIsListRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeArrayIsListRector.php', 'Rector\\DowngradePhp81\\Rector\\FuncCall\\DowngradeFirstClassCallableSyntaxRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeFirstClassCallableSyntaxRector.php', + 'Rector\\DowngradePhp81\\Rector\\FuncCall\\DowngradeHashAlgorithmXxHashRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php', 'Rector\\DowngradePhp81\\Rector\\FunctionLike\\DowngradeNeverTypeDeclarationRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNeverTypeDeclarationRector.php', 'Rector\\DowngradePhp81\\Rector\\FunctionLike\\DowngradeNewInInitializerRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNewInInitializerRector.php', 'Rector\\DowngradePhp81\\Rector\\FunctionLike\\DowngradePureIntersectionTypeRector' => __DIR__ . '/..' . '/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradePureIntersectionTypeRector.php', @@ -1850,7 +1851,6 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b 'Rector\\PHPStanStaticTypeMapper\\DoctrineTypeAnalyzer' => __DIR__ . '/../..' . '/packages/PHPStanStaticTypeMapper/DoctrineTypeAnalyzer.php', 'Rector\\PHPStanStaticTypeMapper\\Enum\\TypeKind' => __DIR__ . '/../..' . '/packages/PHPStanStaticTypeMapper/Enum/TypeKind.php', 'Rector\\PHPStanStaticTypeMapper\\PHPStanStaticTypeMapper' => __DIR__ . '/../..' . '/packages/PHPStanStaticTypeMapper/PHPStanStaticTypeMapper.php', - 'Rector\\PHPStanStaticTypeMapper\\TypeAnalyzer\\BoolUnionTypeAnalyzer' => __DIR__ . '/../..' . '/packages/PHPStanStaticTypeMapper/TypeAnalyzer/BoolUnionTypeAnalyzer.php', 'Rector\\PHPStanStaticTypeMapper\\TypeAnalyzer\\UnionTypeAnalyzer' => __DIR__ . '/../..' . '/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeAnalyzer.php', 'Rector\\PHPStanStaticTypeMapper\\TypeAnalyzer\\UnionTypeCommonTypeNarrower' => __DIR__ . '/../..' . '/packages/PHPStanStaticTypeMapper/TypeAnalyzer/UnionTypeCommonTypeNarrower.php', 'Rector\\PHPStanStaticTypeMapper\\TypeMapper\\AccessoryLiteralStringTypeMapper' => __DIR__ . '/../..' . '/packages/PHPStanStaticTypeMapper/TypeMapper/AccessoryLiteralStringTypeMapper.php', @@ -1907,6 +1907,7 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b 'Rector\\PHPUnit\\CodeQuality\\Rector\\Foreach_\\SimplifyForeachInstanceOfRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/Foreach_/SimplifyForeachInstanceOfRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertCompareToSpecificMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertCompareToSpecificMethodRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertComparisonToSpecificMethodRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertComparisonToSpecificMethodRector.php', + 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEmptyNullableObjectToAssertInstanceofRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertEqualsToSameRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEqualsToSameRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertFalseStrposToContainsRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertFalseStrposToContainsRector.php', 'Rector\\PHPUnit\\CodeQuality\\Rector\\MethodCall\\AssertInstanceOfComparisonRector' => __DIR__ . '/..' . '/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertInstanceOfComparisonRector.php', @@ -2272,6 +2273,7 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\LoadValidatorMetadataToAnnotationRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Class_\\MakeCommandLazyRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\Closure\\StringExtensionToConfigBuilderRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php', + 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\AssertSameResponseCodeWithDebugContentsRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php', 'Rector\\Symfony\\CodeQuality\\Rector\\MethodCall\\LiteralGetToRequestClassConstantRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/LiteralGetToRequestClassConstantRector.php', 'Rector\\Symfony\\Configs\\Rector\\ClassMethod\\AddRouteAnnotationRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/Rector/ClassMethod/AddRouteAnnotationRector.php', 'Rector\\Symfony\\Configs\\Rector\\Closure\\ServiceArgsToServiceNamedArgRector' => __DIR__ . '/..' . '/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceArgsToServiceNamedArgRector.php', @@ -2597,9 +2599,9 @@ class ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit46a0b0ac2ea1371bb06be09a20f71c2b::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInit18ad0e678efbbb500e116f7c54cccdd4::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit18ad0e678efbbb500e116f7c54cccdd4::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit18ad0e678efbbb500e116f7c54cccdd4::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/rector/rector/vendor/composer/installed.json b/vendor/rector/rector/vendor/composer/installed.json index cb89c057a..74f12d46d 100644 --- a/vendor/rector/rector/vendor/composer/installed.json +++ b/vendor/rector/rector/vendor/composer/installed.json @@ -69,17 +69,17 @@ }, { "name": "composer\/pcre", - "version": "3.1.0", - "version_normalized": "3.1.0.0", + "version": "3.1.1", + "version_normalized": "3.1.1.0", "source": { "type": "git", "url": "https:\/\/github.com\/composer\/pcre.git", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2" + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/composer\/pcre\/zipball\/4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", - "reference": "4bff79ddd77851fe3cdd11616ed3f92841ba5bd2", + "url": "https:\/\/api.github.com\/repos\/composer\/pcre\/zipball\/00104306927c7a0919b4ced2aaa6782c1e61a3c9", + "reference": "00104306927c7a0919b4ced2aaa6782c1e61a3c9", "shasum": "" }, "require": { @@ -90,7 +90,7 @@ "phpstan\/phpstan-strict-rules": "^1.1", "symfony\/phpunit-bridge": "^5" }, - "time": "2022-11-17T09:50:14+00:00", + "time": "2023-10-11T07:11:09+00:00", "type": "library", "extra": { "branch-alias": { @@ -123,7 +123,7 @@ ], "support": { "issues": "https:\/\/github.com\/composer\/pcre\/issues", - "source": "https:\/\/github.com\/composer\/pcre\/tree\/3.1.0" + "source": "https:\/\/github.com\/composer\/pcre\/tree\/3.1.1" }, "funding": [ { @@ -504,8 +504,8 @@ }, { "name": "illuminate\/container", - "version": "v10.26.2", - "version_normalized": "10.26.2.0", + "version": "v10.29.0", + "version_normalized": "10.29.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/container.git", @@ -561,8 +561,8 @@ }, { "name": "illuminate\/contracts", - "version": "v10.26.2", - "version_normalized": "10.26.2.0", + "version": "v10.29.0", + "version_normalized": "10.29.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/contracts.git", @@ -1679,12 +1679,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git", - "reference": "a846e7f2380c13e6847faee90e8b955826fba3eb" + "reference": "9de7d58cb2b3438a469a609457a92dd37a310acc" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/a846e7f2380c13e6847faee90e8b955826fba3eb", - "reference": "a846e7f2380c13e6847faee90e8b955826fba3eb", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/9de7d58cb2b3438a469a609457a92dd37a310acc", + "reference": "9de7d58cb2b3438a469a609457a92dd37a310acc", "shasum": "" }, "require": { @@ -1710,7 +1710,7 @@ "tomasvotruba\/type-coverage": "^0.2", "tomasvotruba\/unused-public": "^0.3" }, - "time": "2023-09-29T13:29:14+00:00", + "time": "2023-10-22T17:44:32+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1743,12 +1743,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-downgrade-php.git", - "reference": "850b492944c51824d9cb1d729db38dd3beaef1a5" + "reference": "2d20783f344dec1895e19d2797d4c3b903b4f3cb" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-downgrade-php\/zipball\/850b492944c51824d9cb1d729db38dd3beaef1a5", - "reference": "850b492944c51824d9cb1d729db38dd3beaef1a5", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-downgrade-php\/zipball\/2d20783f344dec1895e19d2797d4c3b903b4f3cb", + "reference": "2d20783f344dec1895e19d2797d4c3b903b4f3cb", "shasum": "" }, "require": { @@ -1775,7 +1775,7 @@ "tomasvotruba\/unused-public": "^0.2", "tracy\/tracy": "^2.10" }, - "time": "2023-09-29T13:19:15+00:00", + "time": "2023-10-20T09:51:24+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1808,12 +1808,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-phpunit.git", - "reference": "383d079d9596992814487a5bdb61e512dabc5901" + "reference": "7a0a6dbc09658a097897f0365fc0e04bc7299714" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/383d079d9596992814487a5bdb61e512dabc5901", - "reference": "383d079d9596992814487a5bdb61e512dabc5901", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/7a0a6dbc09658a097897f0365fc0e04bc7299714", + "reference": "7a0a6dbc09658a097897f0365fc0e04bc7299714", "shasum": "" }, "require": { @@ -1843,7 +1843,7 @@ "tomasvotruba\/unused-public": "^0.3", "tracy\/tracy": "^2.10" }, - "time": "2023-09-30T22:27:41+00:00", + "time": "2023-10-18T18:34:53+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1879,12 +1879,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-symfony.git", - "reference": "873458ca73a73f9becd1680963a347bbcb8e5f43" + "reference": "e550008219ebc1a42afdd2259fa23978f682af2c" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/873458ca73a73f9becd1680963a347bbcb8e5f43", - "reference": "873458ca73a73f9becd1680963a347bbcb8e5f43", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/e550008219ebc1a42afdd2259fa23978f682af2c", + "reference": "e550008219ebc1a42afdd2259fa23978f682af2c", "shasum": "" }, "require": { @@ -1917,7 +1917,7 @@ "tomasvotruba\/unused-public": "^0.2", "tracy\/tracy": "^2.10" }, - "time": "2023-10-05T05:47:32+00:00", + "time": "2023-10-24T14:20:08+00:00", "default-branch": true, "type": "rector-extension", "extra": { diff --git a/vendor/rector/rector/vendor/composer/installed.php b/vendor/rector/rector/vendor/composer/installed.php index ff3f5efbe..63ae9b863 100644 --- a/vendor/rector/rector/vendor/composer/installed.php +++ b/vendor/rector/rector/vendor/composer/installed.php @@ -2,4 +2,4 @@ namespace RectorPrefix202310; -return array('root' => array('name' => 'rector/rector-src', 'pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => NULL, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('clue/ndjson-react' => array('pretty_version' => 'v1.3.0', 'version' => '1.3.0.0', 'reference' => '392dc165fce93b5bb5c637b67e59619223c931b0', 'type' => 'library', 'install_path' => __DIR__ . '/../clue/ndjson-react', 'aliases' => array(), 'dev_requirement' => \false), 'composer/pcre' => array('pretty_version' => '3.1.0', 'version' => '3.1.0.0', 'reference' => '4bff79ddd77851fe3cdd11616ed3f92841ba5bd2', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.4.0', 'version' => '3.4.0.0', 'reference' => '35e8d0af4486141bc745f23a29cc2091eb624a32', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => 'ced299686f41dce890debac69273b47ffe98a40c', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/inflector' => array('pretty_version' => '2.0.8', 'version' => '2.0.8.0', 'reference' => 'f9301a5b2fb1216b2b08f02ba04dc45423db6bff', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/inflector', 'aliases' => array(), 'dev_requirement' => \false), 'evenement/evenement' => array('pretty_version' => 'v3.0.2', 'version' => '3.0.2.0', 'reference' => '0a16b0d71ab13284339abb99d9d2bd813640efbc', 'type' => 'library', 'install_path' => __DIR__ . '/../evenement/evenement', 'aliases' => array(), 'dev_requirement' => \false), 'fidry/cpu-core-counter' => array('pretty_version' => '0.5.1', 'version' => '0.5.1.0', 'reference' => 'b58e5a3933e541dc286cc91fc4f3898bbc6f1623', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/container' => array('pretty_version' => 'v10.26.2', 'version' => '10.26.2.0', 'reference' => 'ddc26273085fad3c471b2602ad820e0097ff7939', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v10.26.2', 'version' => '10.26.2.0', 'reference' => '6c39fba7b2311e28f5c6ac7d729e3d49a2a98406', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'dev_requirement' => \false), 'nette/utils' => array('pretty_version' => 'v3.2.10', 'version' => '3.2.10.0', 'reference' => 'a4175c62652f2300c8017fb7e640f9ccb11648d2', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => \false), 'nikic/php-parser' => array('pretty_version' => 'v4.17.1', 'version' => '4.17.1.0', 'reference' => 'a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \false), 'ondram/ci-detector' => array('pretty_version' => '4.1.0', 'version' => '4.1.0.0', 'reference' => '8a4b664e916df82ff26a44709942dfd593fa6f30', 'type' => 'library', 'install_path' => __DIR__ . '/../ondram/ci-detector', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '1.24.2', 'version' => '1.24.2.0', 'reference' => 'bcad8d995980440892759db0c32acae7c8e79442', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('dev_requirement' => \false, 'replaced' => array(0 => '^1.10.35')), 'psr/container' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'dev_requirement' => \false), 'psr/container-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.1|2.0')), 'psr/log' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => \false), 'psr/log-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0|3.0')), 'psr/simple-cache' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/simple-cache', 'aliases' => array(), 'dev_requirement' => \false), 'react/cache' => array('pretty_version' => 'v1.2.0', 'version' => '1.2.0.0', 'reference' => 'd47c472b64aa5608225f47965a484b75c7817d5b', 'type' => 'library', 'install_path' => __DIR__ . '/../react/cache', 'aliases' => array(), 'dev_requirement' => \false), 'react/child-process' => array('pretty_version' => 'v0.6.5', 'version' => '0.6.5.0', 'reference' => 'e71eb1aa55f057c7a4a0d08d06b0b0a484bead43', 'type' => 'library', 'install_path' => __DIR__ . '/../react/child-process', 'aliases' => array(), 'dev_requirement' => \false), 'react/dns' => array('pretty_version' => 'v1.11.0', 'version' => '1.11.0.0', 'reference' => '3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f', 'type' => 'library', 'install_path' => __DIR__ . '/../react/dns', 'aliases' => array(), 'dev_requirement' => \false), 'react/event-loop' => array('pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '6e7e587714fff7a83dcc7025aee42ab3b265ae05', 'type' => 'library', 'install_path' => __DIR__ . '/../react/event-loop', 'aliases' => array(), 'dev_requirement' => \false), 'react/promise' => array('pretty_version' => 'v2.10.0', 'version' => '2.10.0.0', 'reference' => 'f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => \false), 'react/socket' => array('pretty_version' => 'v1.14.0', 'version' => '1.14.0.0', 'reference' => '21591111d3ea62e31f2254280ca0656bc2b1bda6', 'type' => 'library', 'install_path' => __DIR__ . '/../react/socket', 'aliases' => array(), 'dev_requirement' => \false), 'react/stream' => array('pretty_version' => 'v1.3.0', 'version' => '1.3.0.0', 'reference' => '6fbc9672905c7d5a885f2da2fc696f65840f4a66', 'type' => 'library', 'install_path' => __DIR__ . '/../react/stream', 'aliases' => array(), 'dev_requirement' => \false), 'rector/extension-installer' => array('pretty_version' => '0.11.2', 'version' => '0.11.2.0', 'reference' => '05544e9b195863b8571ae2a3b903cbec7fa062e0', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../rector/extension-installer', 'aliases' => array(), 'dev_requirement' => \false), 'rector/rector' => array('dev_requirement' => \false, 'replaced' => array(0 => 'dev-main')), 'rector/rector-doctrine' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => 'a846e7f2380c13e6847faee90e8b955826fba3eb', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-doctrine', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'rector/rector-downgrade-php' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => '850b492944c51824d9cb1d729db38dd3beaef1a5', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-downgrade-php', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'rector/rector-phpunit' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => '383d079d9596992814487a5bdb61e512dabc5901', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-phpunit', 'aliases' => array(0 => '0.11.x-dev'), 'dev_requirement' => \false), 'rector/rector-src' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => NULL, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'rector/rector-symfony' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => '873458ca73a73f9becd1680963a347bbcb8e5f43', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-symfony', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'sebastian/diff' => array('pretty_version' => '5.0.3', 'version' => '5.0.3.0', 'reference' => '912dc2fbe3e3c1e7873313cc801b100b6c68c87b', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.3.4', 'version' => '6.3.4.0', 'reference' => 'eca495f2ee845130855ddf1cf18460c38966c8b6', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/filesystem' => array('pretty_version' => 'v6.3.1', 'version' => '6.3.1.0', 'reference' => 'edd36776956f2a6fcf577edb5b05eb0e3bdc52ae', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/finder' => array('pretty_version' => 'v6.3.5', 'version' => '6.3.5.0', 'reference' => 'a1b31d88c0e998168ca7792f222cbecee47428c4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-ctype' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/polyfill-intl-grapheme' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.28.0', 'version' => '1.28.0.0', 'reference' => '42292d99c55abe617799667f454222c54c60e229', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v6.3.4', 'version' => '6.3.4.0', 'reference' => '0b5c29118f2e980d455d2e34a5659f4579847c54', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.3.0', 'version' => '3.3.0.0', 'reference' => '40da9cc13ec349d9e4966ce18b5fbcd724ab10a4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symplify/easy-parallel' => array('pretty_version' => '11.1.27', 'version' => '11.1.27.0', 'reference' => '28911142f6a0f4127271f745e2403bb84fcd2b87', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/easy-parallel', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator-contracts' => array('pretty_version' => '11.1.26', 'version' => '11.1.26.0', 'reference' => '3e66b3fec678b74a076395ec629d535fb95293b5', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/rule-doc-generator-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false))); +return array('root' => array('name' => 'rector/rector-src', 'pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => NULL, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev' => \false), 'versions' => array('clue/ndjson-react' => array('pretty_version' => 'v1.3.0', 'version' => '1.3.0.0', 'reference' => '392dc165fce93b5bb5c637b67e59619223c931b0', 'type' => 'library', 'install_path' => __DIR__ . '/../clue/ndjson-react', 'aliases' => array(), 'dev_requirement' => \false), 'composer/pcre' => array('pretty_version' => '3.1.1', 'version' => '3.1.1.0', 'reference' => '00104306927c7a0919b4ced2aaa6782c1e61a3c9', 'type' => 'library', 'install_path' => __DIR__ . '/./pcre', 'aliases' => array(), 'dev_requirement' => \false), 'composer/semver' => array('pretty_version' => '3.4.0', 'version' => '3.4.0.0', 'reference' => '35e8d0af4486141bc745f23a29cc2091eb624a32', 'type' => 'library', 'install_path' => __DIR__ . '/./semver', 'aliases' => array(), 'dev_requirement' => \false), 'composer/xdebug-handler' => array('pretty_version' => '3.0.3', 'version' => '3.0.3.0', 'reference' => 'ced299686f41dce890debac69273b47ffe98a40c', 'type' => 'library', 'install_path' => __DIR__ . '/./xdebug-handler', 'aliases' => array(), 'dev_requirement' => \false), 'doctrine/inflector' => array('pretty_version' => '2.0.8', 'version' => '2.0.8.0', 'reference' => 'f9301a5b2fb1216b2b08f02ba04dc45423db6bff', 'type' => 'library', 'install_path' => __DIR__ . '/../doctrine/inflector', 'aliases' => array(), 'dev_requirement' => \false), 'evenement/evenement' => array('pretty_version' => 'v3.0.2', 'version' => '3.0.2.0', 'reference' => '0a16b0d71ab13284339abb99d9d2bd813640efbc', 'type' => 'library', 'install_path' => __DIR__ . '/../evenement/evenement', 'aliases' => array(), 'dev_requirement' => \false), 'fidry/cpu-core-counter' => array('pretty_version' => '0.5.1', 'version' => '0.5.1.0', 'reference' => 'b58e5a3933e541dc286cc91fc4f3898bbc6f1623', 'type' => 'library', 'install_path' => __DIR__ . '/../fidry/cpu-core-counter', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/container' => array('pretty_version' => 'v10.29.0', 'version' => '10.29.0.0', 'reference' => 'ddc26273085fad3c471b2602ad820e0097ff7939', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v10.29.0', 'version' => '10.29.0.0', 'reference' => '6c39fba7b2311e28f5c6ac7d729e3d49a2a98406', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/contracts', 'aliases' => array(), 'dev_requirement' => \false), 'nette/utils' => array('pretty_version' => 'v3.2.10', 'version' => '3.2.10.0', 'reference' => 'a4175c62652f2300c8017fb7e640f9ccb11648d2', 'type' => 'library', 'install_path' => __DIR__ . '/../nette/utils', 'aliases' => array(), 'dev_requirement' => \false), 'nikic/php-parser' => array('pretty_version' => 'v4.17.1', 'version' => '4.17.1.0', 'reference' => 'a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d', 'type' => 'library', 'install_path' => __DIR__ . '/../nikic/php-parser', 'aliases' => array(), 'dev_requirement' => \false), 'ondram/ci-detector' => array('pretty_version' => '4.1.0', 'version' => '4.1.0.0', 'reference' => '8a4b664e916df82ff26a44709942dfd593fa6f30', 'type' => 'library', 'install_path' => __DIR__ . '/../ondram/ci-detector', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpdoc-parser' => array('pretty_version' => '1.24.2', 'version' => '1.24.2.0', 'reference' => 'bcad8d995980440892759db0c32acae7c8e79442', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('dev_requirement' => \false, 'replaced' => array(0 => '^1.10.35')), 'psr/container' => array('pretty_version' => '2.0.2', 'version' => '2.0.2.0', 'reference' => 'c71ecc56dfe541dbd90c5360474fbc405f8d5963', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/container', 'aliases' => array(), 'dev_requirement' => \false), 'psr/container-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.1|2.0')), 'psr/log' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/log', 'aliases' => array(), 'dev_requirement' => \false), 'psr/log-implementation' => array('dev_requirement' => \false, 'provided' => array(0 => '1.0|2.0|3.0')), 'psr/simple-cache' => array('pretty_version' => '3.0.0', 'version' => '3.0.0.0', 'reference' => '764e0b3939f5ca87cb904f570ef9be2d78a07865', 'type' => 'library', 'install_path' => __DIR__ . '/../psr/simple-cache', 'aliases' => array(), 'dev_requirement' => \false), 'react/cache' => array('pretty_version' => 'v1.2.0', 'version' => '1.2.0.0', 'reference' => 'd47c472b64aa5608225f47965a484b75c7817d5b', 'type' => 'library', 'install_path' => __DIR__ . '/../react/cache', 'aliases' => array(), 'dev_requirement' => \false), 'react/child-process' => array('pretty_version' => 'v0.6.5', 'version' => '0.6.5.0', 'reference' => 'e71eb1aa55f057c7a4a0d08d06b0b0a484bead43', 'type' => 'library', 'install_path' => __DIR__ . '/../react/child-process', 'aliases' => array(), 'dev_requirement' => \false), 'react/dns' => array('pretty_version' => 'v1.11.0', 'version' => '1.11.0.0', 'reference' => '3be0fc8f1eb37d6875cd6f0c6c7d0be81435de9f', 'type' => 'library', 'install_path' => __DIR__ . '/../react/dns', 'aliases' => array(), 'dev_requirement' => \false), 'react/event-loop' => array('pretty_version' => 'v1.4.0', 'version' => '1.4.0.0', 'reference' => '6e7e587714fff7a83dcc7025aee42ab3b265ae05', 'type' => 'library', 'install_path' => __DIR__ . '/../react/event-loop', 'aliases' => array(), 'dev_requirement' => \false), 'react/promise' => array('pretty_version' => 'v2.10.0', 'version' => '2.10.0.0', 'reference' => 'f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38', 'type' => 'library', 'install_path' => __DIR__ . '/../react/promise', 'aliases' => array(), 'dev_requirement' => \false), 'react/socket' => array('pretty_version' => 'v1.14.0', 'version' => '1.14.0.0', 'reference' => '21591111d3ea62e31f2254280ca0656bc2b1bda6', 'type' => 'library', 'install_path' => __DIR__ . '/../react/socket', 'aliases' => array(), 'dev_requirement' => \false), 'react/stream' => array('pretty_version' => 'v1.3.0', 'version' => '1.3.0.0', 'reference' => '6fbc9672905c7d5a885f2da2fc696f65840f4a66', 'type' => 'library', 'install_path' => __DIR__ . '/../react/stream', 'aliases' => array(), 'dev_requirement' => \false), 'rector/extension-installer' => array('pretty_version' => '0.11.2', 'version' => '0.11.2.0', 'reference' => '05544e9b195863b8571ae2a3b903cbec7fa062e0', 'type' => 'composer-plugin', 'install_path' => __DIR__ . '/../rector/extension-installer', 'aliases' => array(), 'dev_requirement' => \false), 'rector/rector' => array('dev_requirement' => \false, 'replaced' => array(0 => 'dev-main')), 'rector/rector-doctrine' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => '9de7d58cb2b3438a469a609457a92dd37a310acc', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-doctrine', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'rector/rector-downgrade-php' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => '2d20783f344dec1895e19d2797d4c3b903b4f3cb', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-downgrade-php', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'rector/rector-phpunit' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => '7a0a6dbc09658a097897f0365fc0e04bc7299714', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-phpunit', 'aliases' => array(0 => '0.11.x-dev'), 'dev_requirement' => \false), 'rector/rector-src' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => NULL, 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), 'dev_requirement' => \false), 'rector/rector-symfony' => array('pretty_version' => 'dev-main', 'version' => 'dev-main', 'reference' => 'e550008219ebc1a42afdd2259fa23978f682af2c', 'type' => 'rector-extension', 'install_path' => __DIR__ . '/../rector/rector-symfony', 'aliases' => array(0 => '9999999-dev'), 'dev_requirement' => \false), 'sebastian/diff' => array('pretty_version' => '5.0.3', 'version' => '5.0.3.0', 'reference' => '912dc2fbe3e3c1e7873313cc801b100b6c68c87b', 'type' => 'library', 'install_path' => __DIR__ . '/../sebastian/diff', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/console' => array('pretty_version' => 'v6.3.4', 'version' => '6.3.4.0', 'reference' => 'eca495f2ee845130855ddf1cf18460c38966c8b6', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/console', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/deprecation-contracts' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/filesystem' => array('pretty_version' => 'v6.3.1', 'version' => '6.3.1.0', 'reference' => 'edd36776956f2a6fcf577edb5b05eb0e3bdc52ae', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/filesystem', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/finder' => array('pretty_version' => 'v6.3.5', 'version' => '6.3.5.0', 'reference' => 'a1b31d88c0e998168ca7792f222cbecee47428c4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/finder', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/polyfill-ctype' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/polyfill-intl-grapheme' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symfony/polyfill-mbstring' => array('pretty_version' => 'v1.28.0', 'version' => '1.28.0.0', 'reference' => '42292d99c55abe617799667f454222c54c60e229', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/polyfill-mbstring', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/process' => array('pretty_version' => 'v6.3.4', 'version' => '6.3.4.0', 'reference' => '0b5c29118f2e980d455d2e34a5659f4579847c54', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/process', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/service-contracts' => array('pretty_version' => 'v3.3.0', 'version' => '3.3.0.0', 'reference' => '40da9cc13ec349d9e4966ce18b5fbcd724ab10a4', 'type' => 'library', 'install_path' => __DIR__ . '/../symfony/service-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'symfony/string' => array('dev_requirement' => \false, 'replaced' => array(0 => '*')), 'symplify/easy-parallel' => array('pretty_version' => '11.1.27', 'version' => '11.1.27.0', 'reference' => '28911142f6a0f4127271f745e2403bb84fcd2b87', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/easy-parallel', 'aliases' => array(), 'dev_requirement' => \false), 'symplify/rule-doc-generator-contracts' => array('pretty_version' => '11.1.26', 'version' => '11.1.26.0', 'reference' => '3e66b3fec678b74a076395ec629d535fb95293b5', 'type' => 'library', 'install_path' => __DIR__ . '/../symplify/rule-doc-generator-contracts', 'aliases' => array(), 'dev_requirement' => \false), 'webmozart/assert' => array('pretty_version' => '1.11.0', 'version' => '1.11.0.0', 'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991', 'type' => 'library', 'install_path' => __DIR__ . '/../webmozart/assert', 'aliases' => array(), 'dev_requirement' => \false))); diff --git a/vendor/rector/rector/vendor/composer/pcre/src/Preg.php b/vendor/rector/rector/vendor/composer/pcre/src/Preg.php index c10f66ef9..fc5a94d4b 100644 --- a/vendor/rector/rector/vendor/composer/pcre/src/Preg.php +++ b/vendor/rector/rector/vendor/composer/pcre/src/Preg.php @@ -112,7 +112,7 @@ public static function matchAllStrictGroups(string $pattern, string $subject, ?a * @param int-mask $flags PREG_UNMATCHED_AS_NULL and PREG_MATCH_OFFSET are always set, no other flags are supported * @return 0|positive-int * - * @phpstan-param array}>> $matches + * @param-out array}>> $matches */ public static function matchAllWithOffsets(string $pattern, string $subject, ?array &$matches, int $flags = 0, int $offset = 0) : int { diff --git a/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php b/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php index 38a8265c1..5b80c77dc 100644 --- a/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php +++ b/vendor/rector/rector/vendor/composer/xdebug-handler/src/XdebugHandler.php @@ -237,7 +237,7 @@ private function doRestart(array $command) : void $cmd = '"' . $cmd . '"'; } } - $process = \proc_open(\is_array($cmd) ? \implode(' ', $cmd) : $cmd, [], $pipes); + $process = \proc_open(\is_array($cmd) ? \implode(' ', \array_map('escapeshellarg', $cmd)) : $cmd, [], $pipes); if (\is_resource($process)) { $exitCode = \proc_close($process); } diff --git a/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php b/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php index 7863dfd35..868650fec 100644 --- a/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php +++ b/vendor/rector/rector/vendor/rector/extension-installer/src/GeneratedConfig.php @@ -9,7 +9,7 @@ */ final class GeneratedConfig { - public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main a846e7f'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main 850b492'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 383d079'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 873458c')); + public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main 9de7d58'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main 2d20783'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 7a0a6db'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main e550008')); private function __construct() { } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php index efab10ec8..d49f4c115 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/config/set/downgrade-php81.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace RectorPrefix202310; +use Rector\DowngradePhp81\Rector\FuncCall\DowngradeHashAlgorithmXxHashRector; use Rector\DowngradePhp81\Rector\LNumber\DowngradeOctalNumberRector; use Rector\DowngradePhp81\Rector\MethodCall\DowngradeIsEnumRector; use Rector\Config\RectorConfig; @@ -22,7 +23,7 @@ use Rector\Renaming\ValueObject\MethodCallRename; return static function (RectorConfig $rectorConfig) : void { $rectorConfig->phpVersion(PhpVersion::PHP_80); - $rectorConfig->rules([DowngradeFinalizePublicClassConstantRector::class, DowngradeFirstClassCallableSyntaxRector::class, DowngradeNeverTypeDeclarationRector::class, DowngradePureIntersectionTypeRector::class, DowngradeNewInInitializerRector::class, DowngradePhp81ResourceReturnToObjectRector::class, DowngradeReadonlyPropertyRector::class, DowngradeArraySpreadStringKeyRector::class, DowngradeArrayIsListRector::class, DowngradeSetAccessibleReflectionPropertyRector::class, DowngradeIsEnumRector::class, DowngradeOctalNumberRector::class]); + $rectorConfig->rules([DowngradeFinalizePublicClassConstantRector::class, DowngradeFirstClassCallableSyntaxRector::class, DowngradeNeverTypeDeclarationRector::class, DowngradePureIntersectionTypeRector::class, DowngradeNewInInitializerRector::class, DowngradePhp81ResourceReturnToObjectRector::class, DowngradeReadonlyPropertyRector::class, DowngradeArraySpreadStringKeyRector::class, DowngradeArrayIsListRector::class, DowngradeSetAccessibleReflectionPropertyRector::class, DowngradeIsEnumRector::class, DowngradeOctalNumberRector::class, DowngradeHashAlgorithmXxHashRector::class]); // @see https://php.watch/versions/8.1/internal-method-return-types#reflection $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [new MethodCallRename('ReflectionFunction', 'hasTentativeReturnType', 'hasReturnType'), new MethodCallRename('ReflectionFunction', 'getTentativeReturnType', 'getReturnType'), new MethodCallRename('ReflectionMethod', 'hasTentativeReturnType', 'hasReturnType'), new MethodCallRename('ReflectionMethod', 'getTentativeReturnType', 'getReturnType')]); $rectorConfig->ruleWithConfiguration(RenameFunctionRector::class, [ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeProcOpenArrayCommandArgRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeProcOpenArrayCommandArgRector.php index 4d7910897..d7ed9d17f 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeProcOpenArrayCommandArgRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeProcOpenArrayCommandArgRector.php @@ -19,10 +19,10 @@ final class DowngradeProcOpenArrayCommandArgRector extends AbstractRector public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change array command argument on proc_open to implode spaced string', [new CodeSample(<<<'CODE_SAMPLE' -return proc_open($command, $descriptorspec, $pipes); +return proc_open($command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); CODE_SAMPLE , <<<'CODE_SAMPLE' -return proc_open(is_array($command) ? implode(' ', $command) : $command, $descriptorspec, $pipes); +return proc_open(is_array($command) ? implode(' ', array_map('escapeshellarg', $command)) : $command, $descriptorspec, $pipes, null, null, ['suppress_errors' => true]); CODE_SAMPLE )]); } @@ -50,7 +50,8 @@ public function refactor(Node $node) : ?FuncCall return null; } $isArrayFuncCall = $this->nodeFactory->createFuncCall('is_array', [new Arg($firstArg->value)]); - $implodeFuncCall = $this->nodeFactory->createFuncCall('implode', [new String_(' '), $firstArg->value]); + $value = $this->nodeFactory->createFuncCall('array_map', [new Arg(new String_('escapeshellarg')), new Arg($firstArg->value)]); + $implodeFuncCall = $this->nodeFactory->createFuncCall('implode', [new String_(' '), $value]); $firstArg->value = new Ternary($isArrayFuncCall, $implodeFuncCall, $firstArg->value); return $node; } diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php new file mode 100644 index 000000000..99611b93b --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FuncCall/DowngradeHashAlgorithmXxHashRector.php @@ -0,0 +1,131 @@ + \MHASH_XXH32, 'xxh64' => \MHASH_XXH64, 'xxh3' => \MHASH_XXH3, 'xxh128' => \MHASH_XXH128]; + private const REPLACEMENT_ALGORITHM = 'md5'; + /** + * @var int + */ + private $argNamedKey; + public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) + { + $this->argsAnalyzer = $argsAnalyzer; + $this->valueResolver = $valueResolver; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Downgrade hash algorithm xxh32, xxh64, xxh3 or xxh128 by default to md5. You can configure the algorithm to downgrade.', [new CodeSample(<<<'CODE_SAMPLE' +class SomeClass +{ + public function run() + { + return hash('xxh128', 'some-data-to-hash'); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +class SomeClass +{ + public function run() + { + return hash('md5', 'some-data-to-hash'); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [FuncCall::class]; + } + /** + * @param FuncCall $node + */ + public function refactor(Node $node) : ?Node + { + if ($this->shouldSkip($node)) { + return null; + } + $this->argNamedKey = 0; + $algorithm = $this->getHashAlgorithm($node->getArgs()); + if ($algorithm === null || !\array_key_exists($algorithm, self::HASH_ALGORITHMS_TO_DOWNGRADE)) { + return null; + } + $args = $node->getArgs(); + if (!isset($args[$this->argNamedKey])) { + return null; + } + $arg = $args[$this->argNamedKey]; + $arg->value = new String_(self::REPLACEMENT_ALGORITHM); + return $node; + } + private function shouldSkip(FuncCall $funcCall) : bool + { + if ($funcCall->isFirstClassCallable()) { + return \true; + } + return !$this->nodeNameResolver->isName($funcCall, 'hash'); + } + /** + * @param Arg[] $args + */ + private function getHashAlgorithm(array $args) : ?string + { + $arg = null; + if ($this->argsAnalyzer->hasNamedArg($args)) { + foreach ($args as $key => $arg) { + if ((($nullsafeVariable1 = $arg->name) ? $nullsafeVariable1->name : null) !== 'algo') { + continue; + } + $this->argNamedKey = $key; + break; + } + } else { + $arg = $args[$this->argNamedKey]; + } + $algorithmNode = ($nullsafeVariable2 = $arg) ? $nullsafeVariable2->value : null; + switch (\true) { + case $algorithmNode instanceof String_: + return $this->valueResolver->getValue($algorithmNode); + case $algorithmNode instanceof ConstFetch: + return $this->mapConstantToString($this->valueResolver->getValue($algorithmNode)); + default: + return null; + } + } + private function mapConstantToString(string $constant) : string + { + $mappedConstant = \array_search(\constant($constant), self::HASH_ALGORITHMS_TO_DOWNGRADE, \true); + return $mappedConstant !== \false ? $mappedConstant : $constant; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php index d5f047022..e9bd29239 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit-code-quality.php @@ -13,6 +13,7 @@ use Rector\PHPUnit\CodeQuality\Rector\Foreach_\SimplifyForeachInstanceOfRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\AssertCompareToSpecificMethodRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\AssertComparisonToSpecificMethodRector; +use Rector\PHPUnit\CodeQuality\Rector\MethodCall\AssertEmptyNullableObjectToAssertInstanceofRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\AssertEqualsToSameRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\AssertFalseStrposToContainsRector; use Rector\PHPUnit\CodeQuality\Rector\MethodCall\AssertInstanceOfComparisonRector; @@ -37,7 +38,7 @@ YieldDataProviderRector::class, RemoveEmptyTestMethodRector::class, ReplaceTestAnnotationWithPrefixedFunctionRector::class, - // sepcific asserts + // specific asserts AssertCompareToSpecificMethodRector::class, AssertComparisonToSpecificMethodRector::class, AssertNotOperatorRector::class, @@ -51,6 +52,7 @@ SimplifyForeachInstanceOfRector::class, UseSpecificWillMethodRector::class, UseSpecificWithMethodRector::class, + AssertEmptyNullableObjectToAssertInstanceofRector::class, /** * Improve direct testing of your code, without mock creep. Make it simple, clear and easy to maintain: * diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit100.php b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit100.php index cab5ef8c8..2d30fdfe1 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit100.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/config/sets/phpunit100.php @@ -17,6 +17,7 @@ $rectorConfig->ruleWithConfiguration(RenameMethodRector::class, [ // https://github.com/sebastianbergmann/phpunit/issues/4087 new MethodCallRename('PHPUnit\\Framework\\Assert', 'assertRegExp', 'assertMatchesRegularExpression'), + new MethodCallRename('PHPUnit\\Framework\\MockObject\\Rule\\InvocationOrder', 'getInvocationCount', 'numberOfInvocations'), // https://github.com/sebastianbergmann/phpunit/issues/4090 new MethodCallRename('PHPUnit\\Framework\\Assert', 'assertNotRegExp', 'assertDoesNotMatchRegularExpression'), // https://github.com/sebastianbergmann/phpunit/issues/4078 diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php new file mode 100644 index 000000000..f39a59e66 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertEmptyNullableObjectToAssertInstanceofRector.php @@ -0,0 +1,97 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change assertNotEmpty() on an object to more clear assertInstanceof()', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +class SomeClass extends TestCase +{ + public function test() + { + $someObject = new stdClass(); + + $this->assertNotEmpty($someObject); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +class SomeClass extends TestCase +{ + public function test() + { + $someObject = new stdClass(); + + $this->assertInstanceof(stdClass::class, $someObject); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + if (!$this->isNames($node->name, ['assertNotEmpty', 'assertEmpty'])) { + return null; + } + $firstArg = $node->getArgs()[0]; + $firstArgType = $this->getType($firstArg->value); + if (!$firstArgType instanceof UnionType) { + return null; + } + $pureType = TypeCombinator::removeNull($firstArgType); + if (!$pureType instanceof ObjectType) { + return null; + } + $methodName = $this->isName($node->name, 'assertEmpty') ? 'assertNotInstanceOf' : 'assertInstanceOf'; + $node->name = new Identifier($methodName); + $fullyQualified = new FullyQualified($pureType->getClassName()); + $node->args[0] = new Arg(new ClassConstFetch($fullyQualified, 'class')); + $node->args[1] = $firstArg; + return $node; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Rector/StmtsAwareInterface/WithConsecutiveRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Rector/StmtsAwareInterface/WithConsecutiveRector.php index 46a9d7383..c601d0dbc 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Rector/StmtsAwareInterface/WithConsecutiveRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Rector/StmtsAwareInterface/WithConsecutiveRector.php @@ -14,11 +14,15 @@ use PhpParser\Node\Identifier; use PhpParser\Node\MatchArm; use PhpParser\Node\Scalar\LNumber; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Expression; +use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Return_; +use PhpParser\NodeTraverser; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -38,14 +42,20 @@ final class WithConsecutiveRector extends AbstractRector implements MinPhpVersio * @var \Rector\Core\PhpParser\Node\BetterNodeFinder */ private $betterNodeFinder; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder) + /** + * @readonly + * @var \Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser + */ + private $simpleCallableNodeTraverser; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder, SimpleCallableNodeTraverser $simpleCallableNodeTraverser) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->betterNodeFinder = $betterNodeFinder; + $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; } public function getRuleDefinition() : RuleDefinition { - return new RuleDefinition('Refactor "withConsecutive()" to ', [new CodeSample(<<<'CODE_SAMPLE' + return new RuleDefinition('Refactor deprecated withConsecutive() to willReturnCallback() structure', [new CodeSample(<<<'CODE_SAMPLE' use PHPUnit\Framework\TestCase; final class SomeTest extends TestCase @@ -98,16 +108,7 @@ public function refactor(Node $node) if (!$this->testsNodeAnalyzer->isInTestClass($node)) { return null; } - if (!$node->expr instanceof MethodCall) { - return null; - } - /** @var MethodCall|null $withConsecutiveMethodCall */ - $withConsecutiveMethodCall = $this->betterNodeFinder->findFirst($node->expr, function (Node $node) : bool { - if (!$node instanceof MethodCall) { - return \false; - } - return $this->isName($node->name, 'withConsecutive'); - }); + $withConsecutiveMethodCall = $this->findWithConsecutiveMethodCall($node); if (!$withConsecutiveMethodCall instanceof MethodCall) { return null; } @@ -125,15 +126,38 @@ public function provideMinPhpVersion() : int { return PhpVersionFeature::MATCH_EXPRESSION; } + /** + * @template T of Node + * @param Node|Node[] $node + * @param class-string $type + * @return T[] + */ + public function findInstancesOfScoped($node, string $type) : array + { + /** @var T[] $foundNodes */ + $foundNodes = []; + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($node, static function (Node $subNode) use($type, &$foundNodes) : ?int { + if ($subNode instanceof Class_ || $subNode instanceof Function_ || $subNode instanceof Closure) { + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if ($subNode instanceof $type) { + $foundNodes[] = $subNode; + return null; + } + return null; + }); + return $foundNodes; + } private function createClosure(MethodCall $expectsMethodCall) : Closure { $closure = new Closure(); $matcherVariable = new Variable('matcher'); $closure->uses[] = new ClosureUse($matcherVariable); - $match = new Match_(new MethodCall($matcherVariable, new Identifier('numberOfInvocations'))); - foreach ($expectsMethodCall->getArgs() as $key => $arg) { - $match->arms[] = new MatchArm([new LNumber($key + 1)], $arg->value); + $usedVariables = $this->resolveUniqueUsedVariables($expectsMethodCall); + foreach ($usedVariables as $usedVariable) { + $closure->uses[] = new ClosureUse($usedVariable); } + $match = $this->createMatch($matcherVariable, $expectsMethodCall); $closure->stmts[] = new Return_($match); return $closure; } @@ -163,4 +187,44 @@ private function matchAndRefactorExpectsMethodCall(Expression $expression) : ?Me }); return $exactlyMethodCall; } + private function findWithConsecutiveMethodCall(Expression $expression) : ?MethodCall + { + if (!$expression->expr instanceof MethodCall) { + return null; + } + /** @var MethodCall|null $withConsecutiveMethodCall */ + $withConsecutiveMethodCall = $this->betterNodeFinder->findFirst($expression->expr, function (Node $node) : bool { + if (!$node instanceof MethodCall) { + return \false; + } + return $this->isName($node->name, 'withConsecutive'); + }); + return $withConsecutiveMethodCall; + } + private function createMatch(Variable $matcherVariable, MethodCall $expectsMethodCall) : Match_ + { + $numberOfInvocationsMethodCall = new MethodCall($matcherVariable, new Identifier('numberOfInvocations')); + $matchArms = []; + foreach ($expectsMethodCall->getArgs() as $key => $arg) { + $matchArms[] = new MatchArm([new LNumber($key + 1)], $arg->value); + } + return new Match_($numberOfInvocationsMethodCall, $matchArms); + } + /** + * @return Variable[] + */ + private function resolveUniqueUsedVariables(MethodCall $expectsMethodCall) : array + { + /** @var Variable[] $usedVariables */ + $usedVariables = $this->findInstancesOfScoped($expectsMethodCall->getArgs(), Variable::class); + $uniqueUsedVariables = []; + foreach ($usedVariables as $usedVariable) { + if ($this->isName($usedVariable, 'this')) { + continue; + } + $usedVariableName = $this->getName($usedVariable); + $uniqueUsedVariables[$usedVariableName] = $usedVariable; + } + return $uniqueUsedVariables; + } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony-code-quality.php b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony-code-quality.php index e76cf77d5..a3e0c5d03 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony-code-quality.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/config/sets/symfony/symfony-code-quality.php @@ -12,6 +12,7 @@ use Rector\Symfony\CodeQuality\Rector\ClassMethod\ParamTypeFromRouteRequiredRegexRector; use Rector\Symfony\CodeQuality\Rector\ClassMethod\RemoveUnusedRequestParamRector; use Rector\Symfony\CodeQuality\Rector\ClassMethod\ResponseReturnTypeControllerActionRector; +use Rector\Symfony\CodeQuality\Rector\MethodCall\AssertSameResponseCodeWithDebugContentsRector; use Rector\Symfony\CodeQuality\Rector\MethodCall\LiteralGetToRequestClassConstantRector; return static function (RectorConfig $rectorConfig) : void { $rectorConfig->rules([ @@ -25,5 +26,7 @@ ParamTypeFromRouteRequiredRegexRector::class, ActionSuffixRemoverRector::class, LoadValidatorMetadataToAnnotationRector::class, + // tests + AssertSameResponseCodeWithDebugContentsRector::class, ]); }; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php index cd33d4a77..68b3934a1 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ActionSuffixRemoverRector.php @@ -60,6 +60,9 @@ public function refactor(Node $node) : ?Node if (!$this->controllerMethodAnalyzer->isAction($node)) { return null; } + if ($node->name->toString() === 'getAction') { + return null; + } $this->removeSuffix($node, 'Action'); return $node; } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php new file mode 100644 index 000000000..a0f5078e5 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/MethodCall/AssertSameResponseCodeWithDebugContentsRector.php @@ -0,0 +1,115 @@ +testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Make assertSame(200, $response->getStatusCode()) in tests comparing response code to include response contents for faster feedback', [new CodeSample(<<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +class SomeClass extends TestCase +{ + public function run() + { + /** @var \Symfony\Component\HttpFoundation\Response $response */ + $response = $this->processResult(); + + $this->assertSame(200, $response->getStatusCode()); + } +} +CODE_SAMPLE +, <<<'CODE_SAMPLE' +use PHPUnit\Framework\TestCase; + +class SomeClass extends TestCase +{ + public function run() + { + /** @var \Symfony\Component\HttpFoundation\Response $response */ + $response = $this->processResult(); + + $this->assertSame(200, $response->getStatusCode(), $response->getContents()); + } +} +CODE_SAMPLE +)]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isInTestClass($node)) { + return null; + } + if (!$this->isName($node->name, 'assertSame')) { + return null; + } + // there cannot be any custom message + $args = $node->getArgs(); + if (\count($args) !== 2) { + return null; + } + $firstArg = $args[0]; + $comparedValueType = $this->getType($firstArg->value); + // must be number + if (!$comparedValueType instanceof ConstantIntegerType) { + return null; + } + $responseExpr = $this->matchResponseExpr($args[1]->value); + if (!$responseExpr instanceof Expr) { + return null; + } + $getContentsMethodCall = new MethodCall($responseExpr, 'getContents'); + $node->args[2] = new Arg($getContentsMethodCall); + return $node; + } + /** + * We look for $response->getStatusCode() + * $client->getResponse()->getStatusCode() + * + * etc. + */ + private function matchResponseExpr(Expr $expr) : ?Expr + { + if (!$expr instanceof MethodCall) { + return null; + } + // must be status method call + if (!$this->isName($expr->name, 'getStatusCode')) { + return null; + } + return $expr->var; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/RouteCollectionBuilderToRoutingConfiguratorRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/RouteCollectionBuilderToRoutingConfiguratorRector.php index aa25a2889..6fcbb4315 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/RouteCollectionBuilderToRoutingConfiguratorRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/RouteCollectionBuilderToRoutingConfiguratorRector.php @@ -9,7 +9,9 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; use PhpParser\Node\Name\FullyQualified; +use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use PHPStan\Type\ObjectType; use Rector\Core\Exception\NotImplementedYetException; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -61,17 +63,21 @@ protected function configureRouting(RoutingConfigurator $routes): void */ public function getNodeTypes() : array { - return [ClassMethod::class]; + return [Class_::class]; } /** - * @param ClassMethod $node + * @param Node\Stmt\Class_ $node */ public function refactor(Node $node) : ?Node { - if (!$this->isName($node, 'configureRoutes')) { + if (!$this->isObjectType($node, new ObjectType('Symfony\\Component\\HttpKernel\\Kernel'))) { return null; } - $firstParam = $node->params[0]; + $configureRoutesClassMethod = $node->getMethod('configureRoutes'); + if (!$configureRoutesClassMethod instanceof ClassMethod) { + return null; + } + $firstParam = $configureRoutesClassMethod->params[0]; if ($firstParam->type === null) { return null; } @@ -79,9 +85,9 @@ public function refactor(Node $node) : ?Node return null; } $firstParam->type = new FullyQualified('Symfony\\Component\\Routing\\Loader\\Configurator\\RoutingConfigurator'); - $node->name = new Identifier('configureRouting'); - $node->returnType = new Identifier('void'); - $this->traverseNodesWithCallable((array) $node->stmts, function (Node $node) : ?MethodCall { + $configureRoutesClassMethod->name = new Identifier('configureRouting'); + $configureRoutesClassMethod->returnType = new Identifier('void'); + $this->traverseNodesWithCallable((array) $configureRoutesClassMethod->stmts, function (Node $node) : ?MethodCall { if (!$node instanceof MethodCall) { return null; } diff --git a/vendor/rector/rector/vendor/symfony/console/Terminal.php b/vendor/rector/rector/vendor/symfony/console/Terminal.php index 3825e0846..c74021305 100644 --- a/vendor/rector/rector/vendor/symfony/console/Terminal.php +++ b/vendor/rector/rector/vendor/symfony/console/Terminal.php @@ -193,7 +193,7 @@ private static function readFromProcess($command) : ?string } $descriptorspec = [1 => ['pipe', 'w'], 2 => ['pipe', 'w']]; $cp = \function_exists('sapi_windows_cp_set') ? \sapi_windows_cp_get() : 0; - $process = \proc_open(\is_array($command) ? \implode(' ', $command) : $command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]); + $process = \proc_open(\is_array($command) ? \implode(' ', \array_map('escapeshellarg', $command)) : $command, $descriptorspec, $pipes, null, null, ['suppress_errors' => \true]); if (!\is_resource($process)) { return null; }