From d8df14289dcd69d75f8920afa04a2ed7f73f819f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 29 Sep 2023 20:04:14 +0200 Subject: [PATCH] Bump rector/rector from 0.18.3 to 0.18.4 (#128) Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Markus Staab --- composer.json | 2 +- composer.lock | 14 +- pages/target-chooser.php | 2 +- vendor/composer/installed.json | 14 +- vendor/composer/installed.php | 10 +- vendor/rector/rector/README.md | 4 +- vendor/rector/rector/bin/rector.php | 4 +- vendor/rector/rector/config/config.php | 1 + .../rector/rector/config/set/coding-style.php | 3 +- .../rector/config/set/type-declaration.php | 3 +- .../PhpDocInfo/PhpDocInfo.php | 5 +- .../PhpDocInfo/PhpDocInfoFactory.php | 13 +- .../BetterPhpDocParser/PhpDocNodeMapper.php | 29 ++- .../DoctrineAnnotationDecorator.php | 16 +- .../StaticDoctrineAnnotationParser.php | 25 +-- .../ArrayParser.php | 17 +- .../PlainValueParser.php | 26 +-- .../Caching/Detector/ChangedFilesDetector.php | 1 + .../rector/packages/Config/RectorConfig.php | 54 ++++-- .../NodeTypeResolver/Node/AttributeKey.php | 2 +- .../NodeTypeResolver/NodeTypeResolver.php | 81 ++++++-- .../NodeAnalyzer/DocBlockClassRenamer.php | 4 +- .../ClassRenamePhpDocNodeVisitor.php | 44 +++-- .../NameImportingPhpDocNodeVisitor.php | 3 + .../Application/ParallelFileProcessor.php | 23 +-- .../Command/WorkerCommandLineFactory.php | 22 ++- .../packages/Parallel/ValueObject/Bridge.php | 4 + .../ValueObject/{Name.php => BridgeItem.php} | 2 +- .../FileSystem/FnMatchPathNormalizer.php | 1 + .../packages/Skipper/RealpathMatcher.php | 2 + .../Testing/Fixture/FixtureSplitter.php | 21 +- .../PHPUnit/AbstractRectorTestCase.php | 57 +++--- .../ClassMethodParamVendorLockResolver.php | 2 - .../ClassMethodReturnTypeOverrideGuard.php | 31 +-- .../InlineArrayReturnAssignRector.php | 9 +- ...seIdenticalOverEqualWithSameTypeRector.php | 25 +-- ...hItemsAssignToEmptyArrayToAssignRector.php | 9 +- .../Foreach_/ForeachToInArrayRector.php | 9 +- .../UnusedForeachValueToArrayKeysRector.php | 9 +- .../FuncCall/IntvalToTypeCastRector.php | 10 + .../Rector/FuncCall/SetTypeToCastRector.php | 10 + .../SimplifyUselessVariableRector.php | 9 +- ...lipTypeControlToUseExclusiveTypeRector.php | 9 +- .../Identical/GetClassToInstanceOfRector.php | 9 +- .../Identical/SimplifyArraySearchRector.php | 9 +- .../SimplifyBoolIdenticalTrueRector.php | 10 + .../Identical/SimplifyConditionsRector.php | 9 +- ...StrlenZeroToIdenticalEmptyStringRector.php | 10 + .../Rector/If_/CombineIfRector.php | 9 +- ...ompareReturnsToNullCoalesceQueueRector.php | 9 +- .../Rector/If_/ExplicitBoolCompareRector.php | 9 +- .../If_/SimplifyIfElseToTernaryRector.php | 9 +- .../If_/SimplifyIfNotNullReturnRector.php | 9 +- .../If_/SimplifyIfNullableReturnRector.php | 20 +- .../Rector/If_/SimplifyIfReturnBoolRector.php | 9 +- .../AbsolutizeRequireAndIncludePathRector.php | 16 +- ...OnPropertyObjectToPropertyExistsRector.php | 9 +- .../Rector/Switch_/SwitchTrueToIfRector.php | 10 + ...istsTernaryThenValueToCoalescingRector.php | 10 + .../UnnecessaryTernaryExpressionRector.php | 9 +- .../ClassNameImport/ShortNameResolver.php | 7 +- .../DataProviderArrayItemsNewlinedRector.php | 9 +- .../FuncGetArgsToVariadicParamRector.php | 10 + .../AddArrayDefaultToArrayPropertyRector.php | 23 ++- .../CallUserFuncArrayToVariadicRector.php | 9 +- .../Switch_/BinarySwitchToIfElseRector.php | 65 +------ .../ControllerClassMethodManipulator.php | 14 +- .../Assign/RemoveDoubleAssignRector.php | 9 +- .../RemoveUnusedVariableAssignRector.php | 9 +- .../Rector/BooleanAnd/RemoveAndTrueRector.php | 10 + .../Rector/Cast/RecastingRemovalRector.php | 2 - .../ClassLike/RemoveAnnotationRector.php | 9 +- .../RemoveEmptyClassMethodRector.php | 25 ++- ...moveUnusedPrivateMethodParameterRector.php | 16 +- .../RemoveUnusedPrivateMethodRector.php | 9 +- .../RemoveUnusedPromotedPropertyRector.php | 9 +- .../RemoveUselessParamTagRector.php | 9 +- .../RemoveUselessReturnTagRector.php | 9 +- .../Expression/RemoveDeadStmtRector.php | 9 +- .../For_/RemoveDeadIfForeachForRector.php | 9 +- .../Foreach_/RemoveUnusedForeachKeyRector.php | 10 + .../If_/RemoveAlwaysTrueIfConditionRector.php | 9 +- .../RemoveNonExistingVarAnnotationRector.php | 23 ++- .../RemoveDeadZeroAndOneOperationRector.php | 14 ++ .../RemoveUnusedPrivatePropertyRector.php | 9 +- .../Property/RemoveUselessVarTagRector.php | 9 +- ...naryToBooleanOrFalseToBooleanAndRector.php | 10 + .../PreparedValueToEarlyReturnRector.php | 9 +- .../ReturnEarlyIfVariableRector.php | 9 +- .../rules/Naming/Matcher/ForeachMatcher.php | 3 +- .../Matcher/VariableAndCallAssignMatcher.php | 2 +- ...iableToMatchMethodCallReturnTypeRector.php | 9 +- .../RenameVariableToMatchNewTypeRector.php | 9 +- ...ValueVariableToMatchExprVariableRector.php | 9 +- .../Switch_/ContinueToBreakInSwitchRector.php | 10 + .../Break_/RemoveZeroBreakContinueRector.php | 10 + .../Php70/Rector/If_/IfToSpaceshipRector.php | 9 +- .../Ternary/TernaryToNullCoalescingRector.php | 10 + .../Ternary/TernaryToSpaceshipRector.php | 10 + .../Php71/NodeAnalyzer/CountableAnalyzer.php | 1 - .../FuncCall/ArrayKeyFirstLastRector.php | 15 +- .../FuncCall/JsonThrowOnErrorRector.php | 17 ++ .../MoneyFormatToNumberFormatRector.php | 9 +- .../ExportToReflectionFunctionRector.php | 10 + .../PropertyPromotionDocBlockMerger.php | 1 - .../RemoveUnusedVariableInCatchRector.php | 9 +- ...AddParamBasedOnParentClassMethodRector.php | 9 +- .../Class_/AnnotationToAttributeRector.php | 9 +- ...ertyAssignToConstructorPromotionRector.php | 9 +- .../Class_/StringableForToStringRector.php | 9 +- .../Rector/FunctionLike/MixedTypeRector.php | 9 +- .../Rector/Identical/StrEndsWithRector.php | 9 +- .../Rector/NotIdentical/StrContainsRector.php | 10 + .../NestedAnnotationToAttributeRector.php | 9 +- .../Switch_/ChangeSwitchToMatchRector.php | 2 + .../Enum/NameNullToStrictNullFunctionMap.php | 12 ++ .../NullToStrictStringFuncCallArgRector.php | 16 +- .../Property/ReadOnlyPropertyRector.php | 9 +- .../Guard/ParentPropertyLookupGuard.php | 2 - ...eClassesWithoutChildrenCollectorRector.php | 108 +++++++++++ .../ClassMethod/ArgumentRemoverRector.php | 10 + .../Renaming/NodeManipulator/ClassRenamer.php | 2 +- .../ClassMethod/RenameAnnotationRector.php | 9 +- .../Rector/String_/RenameStringRector.php | 10 + .../Empty_/DisallowedEmptyRuleFixerRector.php | 10 +- .../AttributeKeyToClassConstFetchRector.php | 10 + .../String_/StringToClassConstantRector.php | 10 + .../Collector/ParentClassCollector.php | 31 +++ .../AddArrowFunctionReturnTypeRector.php | 2 +- ...amTypeBasedOnPHPUnitDataProviderRector.php | 16 +- ...eturnTypeFromStrictScalarReturnsRector.php | 16 +- .../ParamTypeByMethodCallTypeRector.php | 9 +- .../ParamTypeByParentCallTypeRector.php | 9 +- .../ClassMethod/ReturnNeverTypeRector.php | 9 +- .../ReturnTypeFromReturnNewRector.php | 18 +- .../ReturnTypeFromStrictNewArrayRector.php | 16 +- ...eturnTypeFromStrictTypedPropertyRector.php | 12 +- .../StrictStringParamConcatRector.php | 9 +- .../ReturnTypeFromStrictTernaryRector.php | 9 +- ...mptyOnNullableObjectToInstanceOfRector.php | 2 +- .../AddParamTypeSplFixedArrayRector.php | 9 +- ...ParamTypeFromStrictTypedPropertyRector.php | 9 +- .../AddPropertyTypeDeclarationRector.php | 2 +- .../TypedPropertyFromAssignsRector.php | 18 +- ...omStrictConstructorReadonlyClassRector.php | 123 +----------- ...pedPropertyFromStrictConstructorRector.php | 9 +- ...FromStrictGetterMethodReturnTypeRector.php | 9 +- .../WhileNullableToInstanceofRector.php | 9 +- .../TypeAnalyzer/NullableTypeAnalyzer.php | 2 +- .../TrustedClassMethodPropertyTypeInferer.php | 2 +- .../Application/ApplicationFileProcessor.php | 6 +- .../Collector/CollectorNodeVisitor.php | 66 +++++++ .../Collector/CollectorProcessor.php | 38 ++++ .../rector/src/Application/FileProcessor.php | 43 +++-- .../src/Application/VersionResolver.php | 4 +- .../Autoloading/BootstrapFilesIncluder.php | 1 + .../Configuration/ConfigurationFactory.php | 6 +- .../src/Configuration/CurrentNodeProvider.php | 21 -- .../rector/src/Configuration/Option.php | 5 + .../src/Console/Command/ProcessCommand.php | 15 +- .../src/Console/Command/WorkerCommand.php | 16 ++ .../Rector/CollectorRectorInterface.php | 14 ++ .../Rector/ConfigurableRectorInterface.php | 2 +- .../Laravel/ContainerMemento.php | 18 ++ .../LazyContainerFactory.php | 28 ++- .../NodeAnalyzer/PropertyFetchAnalyzer.php | 3 + .../NodeDecorator/PropertyTypeDecorator.php | 3 +- .../rector/src/PhpParser/Node/NodeFactory.php | 4 +- .../NodeTraverser/RectorNodeTraverser.php | 31 ++- .../src/ProcessAnalyzer/RectifiedAnalyzer.php | 2 +- .../src/Rector/AbstractCollectorRector.php | 32 ++++ .../rector/src/Rector/AbstractRector.php | 46 +++-- .../rector/src/ValueObject/Configuration.php | 59 +++++- .../src/ValueObject/Error/SystemError.php | 6 +- .../src/ValueObject/FileProcessResult.php | 13 +- .../src/ValueObject/Reporting/FileDiff.php | 8 +- vendor/rector/rector/vendor/autoload.php | 2 +- .../vendor/composer/autoload_classmap.php | 12 +- .../rector/vendor/composer/autoload_real.php | 10 +- .../vendor/composer/autoload_static.php | 20 +- .../rector/vendor/composer/installed.json | 81 ++++---- .../rector/vendor/composer/installed.php | 2 +- .../phpdoc-parser/phpstan-baseline.neon | 5 - .../phpdoc-parser/src/Parser/TypeParser.php | 26 +-- .../vendor/phpstan/phpstan/phpstan.phar | Bin 22050170 -> 22069692 bytes .../vendor/phpstan/phpstan/phpstan.phar.asc | 26 +-- .../src/GeneratedConfig.php | 2 +- .../rector/rector-doctrine/composer.json | 3 +- .../config/sets/doctrine-bundle-210.php | 10 + .../vendor/rector/rector-doctrine/rector.php | 3 +- ...ntSubscriberInterfaceToAttributeRector.php | 179 ++++++++++++++++++ ...terNullabilityInSyncWithPropertyRector.php | 9 +- ...TimeDefaultInEntityToConstructorRector.php | 17 +- ...rectDefaultTypesOnEntityPropertyRector.php | 17 ++ ...octrineCollectionDocTypeInEntityRector.php | 9 +- ...ateTimePropertyDateTimeInterfaceRector.php | 11 +- .../Property/OrderByKeyToClassConstRector.php | 12 +- .../TypedPropertyFromColumnTypeRector.php | 14 +- ...edPropertyFromDoctrineCollectionRector.php | 9 +- ...edPropertyFromToManyRelationTypeRector.php | 11 +- ...pedPropertyFromToOneRelationTypeRector.php | 11 +- .../src/Set/DoctrineSetList.php | 4 + .../rector/rector-downgrade-php/composer.json | 4 +- ...radeJsonDecodeNullAssociativeArgRector.php | 9 +- ...gradePregUnmatchedAsNullConstantRector.php | 9 +- .../Array_/DowngradeArraySpreadRector.php | 9 +- ...ArrowFunctionToAnonymousFunctionRector.php | 9 +- ...wngradeContravariantArgumentTypeRector.php | 9 +- .../DowngradeCovariantReturnTypeRector.php | 9 +- ...DowngradeProcOpenArrayCommandArgRector.php | 7 +- .../DowngradeStripTagsCallWithArrayRector.php | 10 + ...ngradeFreadFwriteFalsyToNegationRector.php | 10 + .../Property/DowngradeTypedPropertyRector.php | 9 +- .../DowngradeAttributeToAnnotationRector.php | 9 +- .../DowngradePropertyPromotionRector.php | 16 +- ...DowngradeEnumToConstantListClassRector.php | 9 +- .../Expression/DowngradeThrowExprRector.php | 13 +- ...gradeArrayFilterNullableCallbackRector.php | 9 +- ...gradeArbitraryExpressionsSupportRector.php | 9 +- .../DowngradeNewInInitializerRector.php | 9 +- .../DowngradeReadonlyPropertyRector.php | 8 +- .../src/NodeAnalyzer/ExprInTopStmtMatcher.php | 1 - .../rector/rector-phpunit/composer.json | 8 +- .../vendor/rector/rector-phpunit/rector.php | 2 +- ...ataProviderAnnotationToAttributeRector.php | 9 +- ...dsAnnotationWithValueToAttributeRector.php | 9 +- .../TestWithAnnotationToAttributeRector.php | 17 +- .../AnnotationWithValueToAttributeRector.php | 9 +- ...rsAnnotationWithValueToAttributeRector.php | 9 +- .../TicketAnnotationToAttributeRector.php | 13 +- ...stAnnotationWithPrefixedFunctionRector.php | 9 +- .../Class_/AddSeeTestAnnotationRector.php | 9 +- .../Rector/Class_/YieldDataProviderRector.php | 9 +- .../Rector/MethodCall/AssertRegExpRector.php | 9 +- ...rtSameTrueFalseToAssertTrueFalseRector.php | 9 +- .../Rector/Class_/AddProphecyTraitRector.php | 9 +- .../StaticDataProviderClassMethodRector.php | 9 +- ...rformAssertionToNonAssertingTestRector.php | 9 +- .../ClassMethod/ExceptionAnnotationRector.php | 9 +- ...lsParameterToSpecificMethodsTypeRector.php | 9 +- ...ficAssertContainsWithoutIdentityRector.php | 9 +- .../WithConsecutiveRector.php | 17 +- ...atParameterToSpecificMethodsTypeRector.php | 96 ++++++++++ .../rector/rector-symfony/composer.json | 2 +- .../BinaryOp/ResponseStatusCodeRector.php | 1 - .../RemoveUnusedRequestParamRector.php | 9 +- ...sponseReturnTypeControllerActionRector.php | 9 +- .../TemplateAnnotationToThisRenderRector.php | 16 +- ...oadValidatorMetadataToAnnotationRector.php | 9 +- .../Rector/Class_/MakeCommandLazyRector.php | 36 ++-- .../StringExtensionToConfigBuilderRector.php | 9 +- .../ClassMethod/AddRouteAnnotationRector.php | 9 +- .../ServiceArgsToServiceNamedArgRector.php | 13 +- ...iceSettersToSettersAutodiscoveryRector.php | 9 +- ...rviceTagsToDefaultsAutoconfigureRector.php | 9 +- .../ServicesSetNameToSetTypeRector.php | 9 +- ...MaxLengthSymfonyFormOptionToAttrRector.php | 10 + .../MethodCall/RedirectToRouteRector.php | 9 +- ...ypeOptionNameFromTypeToEntryTypeRector.php | 9 +- .../Rector/ClassMethod/GetRequestRector.php | 9 +- .../RemoveDefaultGetBlockPrefixRector.php | 10 + ...StringCollectionOptionToConstantRector.php | 9 +- .../FormTypeInstanceToClassConstRector.php | 9 +- ...ethodAnnotationToRouteAnnotationRector.php | 10 +- .../RemoveServiceFromSensioRouteRector.php | 15 +- ...SensioRouteAnnotationWithSymfonyRector.php | 77 ++++++-- .../ConstFetch/ConstraintUrlOptionRector.php | 10 + .../Rector/New_/RootNodeTreeBuilderRector.php | 10 + .../EventDispatcherParentConstructRector.php | 12 +- ...plateShortNotationToBundleSyntaxRector.php | 10 + .../MakeDispatchFirstArgumentEventRector.php | 9 +- .../WebTestCaseAssertIsSuccessfulRector.php | 9 +- .../WebTestCaseAssertResponseCodeRector.php | 9 +- ...stCaseAssertSelectorTextContainsRector.php | 9 +- ...TwigBundleFilesystemLoaderToTwigRector.php | 3 +- .../ConsoleExecuteReturnIntRector.php | 9 +- .../CommandConstantReturnCodeRector.php | 9 +- ...nitionAliasSetPrivateToSetPublicRector.php | 9 +- ...xtractorEnableMagicCallExtractorRector.php | 10 + ...orBuilderEnableAnnotationMappingRector.php | 10 + ...tyAccessorCreationBooleanToFlagsRector.php | 10 + ...wiftSetBodyToHtmlPlainMethodCallRector.php | 10 + .../FuncCall/ReplaceServiceArgumentRector.php | 10 + ...mentValueResolverToValueResolverRector.php | 3 +- ...geSubscriberInterfaceToAttributeRector.php | 25 ++- ...alableCommandInterfaceReturnTypeRector.php | 16 +- .../Return_/SimpleFunctionAndFilterRector.php | 9 +- .../Command/SetAliasesMethodCallExtractor.php | 3 +- 288 files changed, 3043 insertions(+), 903 deletions(-) rename vendor/rector/rector/packages/Parallel/ValueObject/{Name.php => BridgeItem.php} (97%) create mode 100644 vendor/rector/rector/rules/Php81/Enum/NameNullToStrictNullFunctionMap.php create mode 100644 vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenCollectorRector.php create mode 100644 vendor/rector/rector/rules/TypeDeclaration/Collector/ParentClassCollector.php create mode 100644 vendor/rector/rector/src/Application/Collector/CollectorNodeVisitor.php create mode 100644 vendor/rector/rector/src/Application/Collector/CollectorProcessor.php delete mode 100644 vendor/rector/rector/src/Configuration/CurrentNodeProvider.php create mode 100644 vendor/rector/rector/src/Contract/Rector/CollectorRectorInterface.php create mode 100644 vendor/rector/rector/src/Rector/AbstractCollectorRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-210.php create mode 100644 vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php create mode 100644 vendor/rector/rector/vendor/rector/rector-phpunit/src/Transform/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php diff --git a/composer.json b/composer.json index f10e677bb..8d2fa6f4d 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "require": { "php": ">=7.4", - "rector/rector": "0.18.3", + "rector/rector": "0.18.4", "friendsofphp/php-cs-fixer": "3.34.0", "redaxo/php-cs-fixer-config": "^1.0" }, diff --git a/composer.lock b/composer.lock index f93cbe171..cb8d6973f 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": "e8b88e44e3ba6b0e7b07738b1a3de75f", + "content-hash": "519fa5abbbcf45fc2643c6dbc0511ce4", "packages": [ { "name": "composer/pcre", @@ -534,16 +534,16 @@ }, { "name": "rector/rector", - "version": "0.18.3", + "version": "0.18.4", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "ba7988e3e028e68e07191d75b0d5473ac320c5e7" + "reference": "d99a91176b7eb7f2b6d509a6486b3661c6dfd370" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/ba7988e3e028e68e07191d75b0d5473ac320c5e7", - "reference": "ba7988e3e028e68e07191d75b0d5473ac320c5e7", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/d99a91176b7eb7f2b6d509a6486b3661c6dfd370", + "reference": "d99a91176b7eb7f2b6d509a6486b3661c6dfd370", "shasum": "" }, "require": { @@ -578,7 +578,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.3" + "source": "https://github.com/rectorphp/rector/tree/0.18.4" }, "funding": [ { @@ -586,7 +586,7 @@ "type": "github" } ], - "time": "2023-09-12T20:18:14+00:00" + "time": "2023-09-25T17:07:54+00:00" }, { "name": "redaxo/php-cs-fixer-config", diff --git a/pages/target-chooser.php b/pages/target-chooser.php index 1b05328d5..aa0b33eb1 100644 --- a/pages/target-chooser.php +++ b/pages/target-chooser.php @@ -22,7 +22,7 @@ $batches = []; if ( !is_dir($addonPath.'/.git') // the addon is versioned? - && !is_dir(rex_path::base('.git')) // the while project is versioned? + && !is_dir(rex_path::base('.git')) // the whole project is versioned? ) { $batches[] = 'unversioned sources'; } elseif ($hasGit) { diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json index 00a678fb4..86ae15500 100644 --- a/vendor/composer/installed.json +++ b/vendor/composer/installed.json @@ -552,17 +552,17 @@ }, { "name": "rector/rector", - "version": "0.18.3", - "version_normalized": "0.18.3.0", + "version": "0.18.4", + "version_normalized": "0.18.4.0", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "ba7988e3e028e68e07191d75b0d5473ac320c5e7" + "reference": "d99a91176b7eb7f2b6d509a6486b3661c6dfd370" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/ba7988e3e028e68e07191d75b0d5473ac320c5e7", - "reference": "ba7988e3e028e68e07191d75b0d5473ac320c5e7", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/d99a91176b7eb7f2b6d509a6486b3661c6dfd370", + "reference": "d99a91176b7eb7f2b6d509a6486b3661c6dfd370", "shasum": "" }, "require": { @@ -575,7 +575,7 @@ "rector/rector-phpunit": "*", "rector/rector-symfony": "*" }, - "time": "2023-09-12T20:18:14+00:00", + "time": "2023-09-25T17:07:54+00:00", "bin": [ "bin/rector" ], @@ -599,7 +599,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/0.18.3" + "source": "https://github.com/rectorphp/rector/tree/0.18.4" }, "funding": [ { diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index e536d3241..51a95e2bd 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' => '13ad0f8b7f6b5907a321acd981de10867a5aac02', + 'reference' => '5993a6580305bb6a0105f81459edb77e2f9626a6', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -13,7 +13,7 @@ '__root__' => array( 'pretty_version' => 'dev-main', 'version' => 'dev-main', - 'reference' => '13ad0f8b7f6b5907a321acd981de10867a5aac02', + 'reference' => '5993a6580305bb6a0105f81459edb77e2f9626a6', 'type' => 'library', 'install_path' => __DIR__ . '/../../', 'aliases' => array(), @@ -104,9 +104,9 @@ ), ), 'rector/rector' => array( - 'pretty_version' => '0.18.3', - 'version' => '0.18.3.0', - 'reference' => 'ba7988e3e028e68e07191d75b0d5473ac320c5e7', + 'pretty_version' => '0.18.4', + 'version' => '0.18.4.0', + 'reference' => 'd99a91176b7eb7f2b6d509a6486b3661c6dfd370', 'type' => 'library', 'install_path' => __DIR__ . '/../rector/rector', 'aliases' => array(), diff --git a/vendor/rector/rector/README.md b/vendor/rector/rector/README.md index 534ef8316..11245b5e4 100644 --- a/vendor/rector/rector/README.md +++ b/vendor/rector/rector/README.md @@ -155,7 +155,9 @@ dump_node($node, 1); ## Known Drawbacks -Rector uses [nikic/php-parser](https://github.com/nikic/PHP-Parser/), built on technology called an *abstract syntax tree* (AST). An AST doesn't know about spaces and when written to a file it produces poorly formatted code in both PHP and docblock annotations. +* Rector uses [nikic/php-parser](https://github.com/nikic/PHP-Parser/), built on technology called an *abstract syntax tree* (AST). An AST doesn't know about spaces and when written to a file it produces poorly formatted code in both PHP and docblock annotations. + +* Rector in parallel mode will work most of the times for most OS. On Windows, you may encounter issues unresolvable despite of following the [Troubleshooting Parallel](https://getrector.com/documentation/troubleshooting-parallel) guide. In such case, check if you are using Powershell 7 (pwsh). Change your terminal to command prompt (cmd) or bash for Windows. ### How to Apply Coding Standards? diff --git a/vendor/rector/rector/bin/rector.php b/vendor/rector/rector/bin/rector.php index ca687105b..b4647e352 100755 --- a/vendor/rector/rector/bin/rector.php +++ b/vendor/rector/rector/bin/rector.php @@ -87,10 +87,8 @@ public function loadIfExistsAndNotLoadedYet(string $filePath) : void if (\in_array($filePath, $this->alreadyLoadedAutoloadFiles, \true)) { return; } + /** @var string $realPath always string after file_exists() check */ $realPath = \realpath($filePath); - if (!\is_string($realPath)) { - return; - } $this->alreadyLoadedAutoloadFiles[] = $realPath; require_once $filePath; } diff --git a/vendor/rector/rector/config/config.php b/vendor/rector/rector/config/config.php index 2bb1b6401..f9c37b5ea 100644 --- a/vendor/rector/rector/config/config.php +++ b/vendor/rector/rector/config/config.php @@ -13,6 +13,7 @@ $rectorConfig->autoloadPaths([]); $rectorConfig->bootstrapFiles([]); $rectorConfig->parallel(); + $rectorConfig->disableCollectors(); // to avoid autoimporting out of the box $rectorConfig->importNames(\false, \false); $rectorConfig->removeUnusedImports(\false); diff --git a/vendor/rector/rector/config/set/coding-style.php b/vendor/rector/rector/config/set/coding-style.php index f625ae8b3..37ad7a61b 100644 --- a/vendor/rector/rector/config/set/coding-style.php +++ b/vendor/rector/rector/config/set/coding-style.php @@ -28,7 +28,6 @@ use Rector\CodingStyle\Rector\Stmt\NewlineAfterStatementRector; use Rector\CodingStyle\Rector\String_\SymplifyQuoteEscapeRector; use Rector\CodingStyle\Rector\String_\UseClassKeywordForClassNameResolutionRector; -use Rector\CodingStyle\Rector\Switch_\BinarySwitchToIfElseRector; use Rector\CodingStyle\Rector\Ternary\TernaryConditionVariableAssignmentRector; use Rector\CodingStyle\Rector\Use_\SeparateMultiUseImportsRector; use Rector\Config\RectorConfig; @@ -37,5 +36,5 @@ use Rector\Visibility\Rector\ClassMethod\ExplicitPublicClassMethodRector; return static function (RectorConfig $rectorConfig) : void { $rectorConfig->ruleWithConfiguration(FuncCallToConstFetchRector::class, ['php_sapi_name' => 'PHP_SAPI', 'pi' => 'M_PI']); - $rectorConfig->rules([SeparateMultiUseImportsRector::class, PostIncDecToPreIncDecRector::class, NewlineAfterStatementRector::class, RemoveFinalFromConstRector::class, NullableCompareToNullRector::class, BinarySwitchToIfElseRector::class, ConsistentImplodeRector::class, TernaryConditionVariableAssignmentRector::class, SymplifyQuoteEscapeRector::class, StringClassNameToClassConstantRector::class, CatchExceptionNameMatchingTypeRector::class, UseIncrementAssignRector::class, SplitDoubleAssignRector::class, EncapsedStringsToSprintfRector::class, WrapEncapsedVariableInCurlyBracesRector::class, NewlineBeforeNewAssignSetRector::class, AddArrayDefaultToArrayPropertyRector::class, MakeInheritedMethodVisibilitySameAsParentRector::class, CallUserFuncArrayToVariadicRector::class, VersionCompareFuncCallToConstantRector::class, StaticArrowFunctionRector::class, StaticClosureRector::class, CountArrayToEmptyArrayComparisonRector::class, CallUserFuncToMethodCallRector::class, FuncGetArgsToVariadicParamRector::class, StrictArraySearchRector::class, UseClassKeywordForClassNameResolutionRector::class, SplitGroupedPropertiesRector::class, SplitGroupedClassConstantsRector::class, ExplicitPublicClassMethodRector::class]); + $rectorConfig->rules([SeparateMultiUseImportsRector::class, PostIncDecToPreIncDecRector::class, NewlineAfterStatementRector::class, RemoveFinalFromConstRector::class, NullableCompareToNullRector::class, ConsistentImplodeRector::class, TernaryConditionVariableAssignmentRector::class, SymplifyQuoteEscapeRector::class, StringClassNameToClassConstantRector::class, CatchExceptionNameMatchingTypeRector::class, UseIncrementAssignRector::class, SplitDoubleAssignRector::class, EncapsedStringsToSprintfRector::class, WrapEncapsedVariableInCurlyBracesRector::class, NewlineBeforeNewAssignSetRector::class, AddArrayDefaultToArrayPropertyRector::class, MakeInheritedMethodVisibilitySameAsParentRector::class, CallUserFuncArrayToVariadicRector::class, VersionCompareFuncCallToConstantRector::class, StaticArrowFunctionRector::class, StaticClosureRector::class, CountArrayToEmptyArrayComparisonRector::class, CallUserFuncToMethodCallRector::class, FuncGetArgsToVariadicParamRector::class, StrictArraySearchRector::class, UseClassKeywordForClassNameResolutionRector::class, SplitGroupedPropertiesRector::class, SplitGroupedClassConstantsRector::class, ExplicitPublicClassMethodRector::class]); }; diff --git a/vendor/rector/rector/config/set/type-declaration.php b/vendor/rector/rector/config/set/type-declaration.php index 6d167364f..690f41886 100644 --- a/vendor/rector/rector/config/set/type-declaration.php +++ b/vendor/rector/rector/config/set/type-declaration.php @@ -36,10 +36,9 @@ use Rector\TypeDeclaration\Rector\FunctionLike\AddReturnTypeDeclarationFromYieldsRector; use Rector\TypeDeclaration\Rector\Param\ParamTypeFromStrictTypedPropertyRector; use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromAssignsRector; -use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromStrictConstructorReadonlyClassRector; use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromStrictConstructorRector; use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromStrictGetterMethodReturnTypeRector; use Rector\TypeDeclaration\Rector\Property\TypedPropertyFromStrictSetUpRector; return static function (RectorConfig $rectorConfig) : void { - $rectorConfig->rules([AddArrowFunctionReturnTypeRector::class, ParamTypeByMethodCallTypeRector::class, TypedPropertyFromAssignsRector::class, AddReturnTypeDeclarationBasedOnParentClassMethodRector::class, ReturnTypeFromStrictTypedPropertyRector::class, TypedPropertyFromStrictConstructorRector::class, TypedPropertyFromStrictConstructorReadonlyClassRector::class, ParamTypeFromStrictTypedPropertyRector::class, AddVoidReturnTypeWhereNoReturnRector::class, ReturnTypeFromStrictFluentReturnRector::class, ReturnTypeFromReturnNewRector::class, TypedPropertyFromStrictGetterMethodReturnTypeRector::class, AddMethodCallBasedStrictParamTypeRector::class, ReturnTypeFromStrictBoolReturnExprRector::class, ReturnTypeFromStrictNativeCallRector::class, ReturnTypeFromStrictNewArrayRector::class, ReturnTypeFromStrictScalarReturnExprRector::class, ReturnTypeFromStrictParamRector::class, TypedPropertyFromStrictSetUpRector::class, ParamTypeByParentCallTypeRector::class, AddParamTypeSplFixedArrayRector::class, AddParamTypeBasedOnPHPUnitDataProviderRector::class, AddParamTypeFromPropertyTypeRector::class, AddReturnTypeDeclarationFromYieldsRector::class, ReturnTypeFromReturnDirectArrayRector::class, ReturnTypeFromStrictConstantReturnRector::class, ReturnTypeFromStrictTypedCallRector::class, ReturnNeverTypeRector::class, EmptyOnNullableObjectToInstanceOfRector::class, PropertyTypeFromStrictSetterGetterRector::class, ReturnTypeFromStrictTernaryRector::class, BoolReturnTypeFromStrictScalarReturnsRector::class, NumericReturnTypeFromStrictScalarReturnsRector::class, StrictArrayParamDimFetchRector::class, ReturnUnionTypeRector::class, StrictStringParamConcatRector::class]); + $rectorConfig->rules([AddArrowFunctionReturnTypeRector::class, ParamTypeByMethodCallTypeRector::class, TypedPropertyFromAssignsRector::class, AddReturnTypeDeclarationBasedOnParentClassMethodRector::class, ReturnTypeFromStrictTypedPropertyRector::class, TypedPropertyFromStrictConstructorRector::class, ParamTypeFromStrictTypedPropertyRector::class, AddVoidReturnTypeWhereNoReturnRector::class, ReturnTypeFromStrictFluentReturnRector::class, ReturnTypeFromReturnNewRector::class, TypedPropertyFromStrictGetterMethodReturnTypeRector::class, AddMethodCallBasedStrictParamTypeRector::class, ReturnTypeFromStrictBoolReturnExprRector::class, ReturnTypeFromStrictNativeCallRector::class, ReturnTypeFromStrictNewArrayRector::class, ReturnTypeFromStrictScalarReturnExprRector::class, ReturnTypeFromStrictParamRector::class, TypedPropertyFromStrictSetUpRector::class, ParamTypeByParentCallTypeRector::class, AddParamTypeSplFixedArrayRector::class, AddParamTypeBasedOnPHPUnitDataProviderRector::class, AddParamTypeFromPropertyTypeRector::class, AddReturnTypeDeclarationFromYieldsRector::class, ReturnTypeFromReturnDirectArrayRector::class, ReturnTypeFromStrictConstantReturnRector::class, ReturnTypeFromStrictTypedCallRector::class, ReturnNeverTypeRector::class, EmptyOnNullableObjectToInstanceOfRector::class, PropertyTypeFromStrictSetterGetterRector::class, ReturnTypeFromStrictTernaryRector::class, BoolReturnTypeFromStrictScalarReturnsRector::class, NumericReturnTypeFromStrictScalarReturnsRector::class, StrictArrayParamDimFetchRector::class, ReturnUnionTypeRector::class, StrictStringParamConcatRector::class]); }; diff --git a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php index 6a86bf565..8f63a6a64 100644 --- a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php +++ b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfo.php @@ -334,7 +334,6 @@ public function getTemplateTagValueNodes() : array } /** * @deprecated Change doc block and print directly in the node instead - * @internal * Should be handled by attributes of phpdoc node - if stard_and_end is missing in one of nodes, it has been changed * * @api @@ -372,7 +371,9 @@ public function getGenericTagClassNames() : array $genericTagValueNodes = $this->phpDocNodeByTypeFinder->findByType($this->phpDocNode, GenericTagValueNode::class); $resolvedClasses = []; foreach ($genericTagValueNodes as $genericTagValueNode) { - $resolvedClasses[] = $genericTagValueNode->value; + if ($genericTagValueNode->value !== '') { + $resolvedClasses[] = $genericTagValueNode->value; + } } return $resolvedClasses; } diff --git a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php index 681240790..03aebdb67 100644 --- a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php +++ b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocInfo/PhpDocInfoFactory.php @@ -14,7 +14,6 @@ use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\BetterPhpDocParser\ValueObject\StartAndEnd; -use Rector\Core\Configuration\CurrentNodeProvider; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\StaticTypeMapper\StaticTypeMapper; final class PhpDocInfoFactory @@ -24,11 +23,6 @@ final class PhpDocInfoFactory * @var \Rector\BetterPhpDocParser\PhpDocNodeMapper */ private $phpDocNodeMapper; - /** - * @readonly - * @var \Rector\Core\Configuration\CurrentNodeProvider - */ - private $currentNodeProvider; /** * @readonly * @var \PHPStan\PhpDocParser\Lexer\Lexer @@ -58,10 +52,9 @@ final class PhpDocInfoFactory * @var array */ private $phpDocInfosByObjectId = []; - public function __construct(PhpDocNodeMapper $phpDocNodeMapper, CurrentNodeProvider $currentNodeProvider, Lexer $lexer, BetterPhpDocParser $betterPhpDocParser, StaticTypeMapper $staticTypeMapper, AnnotationNaming $annotationNaming, PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder) + public function __construct(PhpDocNodeMapper $phpDocNodeMapper, Lexer $lexer, BetterPhpDocParser $betterPhpDocParser, StaticTypeMapper $staticTypeMapper, AnnotationNaming $annotationNaming, PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder) { $this->phpDocNodeMapper = $phpDocNodeMapper; - $this->currentNodeProvider = $currentNodeProvider; $this->lexer = $lexer; $this->betterPhpDocParser = $betterPhpDocParser; $this->staticTypeMapper = $staticTypeMapper; @@ -87,8 +80,6 @@ public function createFromNode(Node $node) : ?\Rector\BetterPhpDocParser\PhpDocI if (isset($this->phpDocInfosByObjectId[$objectId])) { return $this->phpDocInfosByObjectId[$objectId]; } - /** @see \Rector\BetterPhpDocParser\PhpDocParser\DoctrineAnnotationDecorator::decorate() */ - $this->currentNodeProvider->setNode($node); $docComment = $node->getDocComment(); if (!$docComment instanceof Doc) { if ($node->getComments() === []) { @@ -112,8 +103,6 @@ public function createFromNode(Node $node) : ?\Rector\BetterPhpDocParser\PhpDocI */ public function createEmpty(Node $node) : \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo { - /** @see \Rector\BetterPhpDocParser\PhpDocParser\DoctrineAnnotationDecorator::decorate() */ - $this->currentNodeProvider->setNode($node); $phpDocNode = new PhpDocNode([]); $phpDocInfo = $this->createFromPhpDocNode($phpDocNode, new BetterTokenIterator([]), $node); // multiline by default diff --git a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocNodeMapper.php b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocNodeMapper.php index 098cbaafa..9e2a1d97a 100644 --- a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocNodeMapper.php +++ b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocNodeMapper.php @@ -22,40 +22,33 @@ final class PhpDocNodeMapper */ private $currentTokenIteratorProvider; /** + * @var BasePhpDocNodeVisitorInterface[] * @readonly - * @var \Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\ParentConnectingPhpDocNodeVisitor */ - private $parentConnectingPhpDocNodeVisitor; + private $phpDocNodeVisitors; /** * @readonly - * @var \Rector\PhpDocParser\PhpDocParser\PhpDocNodeVisitor\CloningPhpDocNodeVisitor + * @var \Rector\PhpDocParser\PhpDocParser\PhpDocNodeTraverser */ - private $cloningPhpDocNodeVisitor; - /** - * @var BasePhpDocNodeVisitorInterface[] - * @readonly - */ - private $phpDocNodeVisitors; + private $phpDocNodeTraverser; /** * @param BasePhpDocNodeVisitorInterface[] $phpDocNodeVisitors */ public function __construct(CurrentTokenIteratorProvider $currentTokenIteratorProvider, ParentConnectingPhpDocNodeVisitor $parentConnectingPhpDocNodeVisitor, CloningPhpDocNodeVisitor $cloningPhpDocNodeVisitor, array $phpDocNodeVisitors) { $this->currentTokenIteratorProvider = $currentTokenIteratorProvider; - $this->parentConnectingPhpDocNodeVisitor = $parentConnectingPhpDocNodeVisitor; - $this->cloningPhpDocNodeVisitor = $cloningPhpDocNodeVisitor; $this->phpDocNodeVisitors = $phpDocNodeVisitors; Assert::notEmpty($phpDocNodeVisitors); + $this->phpDocNodeTraverser = new PhpDocNodeTraverser(); + $this->phpDocNodeTraverser->addPhpDocNodeVisitor($parentConnectingPhpDocNodeVisitor); + $this->phpDocNodeTraverser->addPhpDocNodeVisitor($cloningPhpDocNodeVisitor); + foreach ($this->phpDocNodeVisitors as $phpDocNodeVisitor) { + $this->phpDocNodeTraverser->addPhpDocNodeVisitor($phpDocNodeVisitor); + } } public function transform(PhpDocNode $phpDocNode, BetterTokenIterator $betterTokenIterator) : void { $this->currentTokenIteratorProvider->setBetterTokenIterator($betterTokenIterator); - $phpDocNodeTraverser = new PhpDocNodeTraverser(); - $phpDocNodeTraverser->addPhpDocNodeVisitor($this->parentConnectingPhpDocNodeVisitor); - $phpDocNodeTraverser->addPhpDocNodeVisitor($this->cloningPhpDocNodeVisitor); - foreach ($this->phpDocNodeVisitors as $phpDocNodeVisitor) { - $phpDocNodeTraverser->addPhpDocNodeVisitor($phpDocNodeVisitor); - } - $phpDocNodeTraverser->traverse($phpDocNode); + $this->phpDocNodeTraverser->traverse($phpDocNode); } } diff --git a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php index b6510ec5d..e165d9e80 100644 --- a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php +++ b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/DoctrineAnnotationDecorator.php @@ -143,7 +143,7 @@ private function transformGenericTagValueNodesToDoctrineAnnotationTagValueNodes( foreach ($phpDocNode->children as $key => $phpDocChildNode) { // the @\FQN use case if ($phpDocChildNode instanceof PhpDocTextNode) { - $spacelessPhpDocTagNode = $this->resolveFqnAnnotationSpacelessPhpDocTagNode($phpDocChildNode); + $spacelessPhpDocTagNode = $this->resolveFqnAnnotationSpacelessPhpDocTagNode($phpDocChildNode, $currentPhpNode); if (!$spacelessPhpDocTagNode instanceof SpacelessPhpDocTagNode) { continue; } @@ -162,7 +162,7 @@ private function transformGenericTagValueNodesToDoctrineAnnotationTagValueNodes( if (\strpos($fullyQualifiedAnnotationClass, '\\') === \false && !\in_array($fullyQualifiedAnnotationClass, self::ALLOWED_SHORT_ANNOTATIONS, \true)) { continue; } - $spacelessPhpDocTagNode = $this->createSpacelessPhpDocTagNode($phpDocChildNode->name, $phpDocChildNode->value, $fullyQualifiedAnnotationClass); + $spacelessPhpDocTagNode = $this->createSpacelessPhpDocTagNode($phpDocChildNode->name, $phpDocChildNode->value, $fullyQualifiedAnnotationClass, $currentPhpNode); $this->attributeMirrorer->mirror($phpDocChildNode, $spacelessPhpDocTagNode); $phpDocNode->children[$key] = $spacelessPhpDocTagNode; } @@ -191,17 +191,17 @@ private function isClosedContent(string $composedContent) : bool } while ($composedTokenIterator->currentPosition() < $tokenCount - 1); return $openBracketCount === $closeBracketCount; } - private function createSpacelessPhpDocTagNode(string $tagName, GenericTagValueNode $genericTagValueNode, string $fullyQualifiedAnnotationClass) : SpacelessPhpDocTagNode + private function createSpacelessPhpDocTagNode(string $tagName, GenericTagValueNode $genericTagValueNode, string $fullyQualifiedAnnotationClass, Node $currentPhpNode) : SpacelessPhpDocTagNode { $formerStartEnd = $genericTagValueNode->getAttribute(PhpDocAttributeKey::START_AND_END); - return $this->createDoctrineSpacelessPhpDocTagNode($genericTagValueNode->value, $tagName, $fullyQualifiedAnnotationClass, $formerStartEnd); + return $this->createDoctrineSpacelessPhpDocTagNode($genericTagValueNode->value, $tagName, $fullyQualifiedAnnotationClass, $formerStartEnd, $currentPhpNode); } - private function createDoctrineSpacelessPhpDocTagNode(string $annotationContent, string $tagName, string $fullyQualifiedAnnotationClass, StartAndEnd $startAndEnd) : SpacelessPhpDocTagNode + private function createDoctrineSpacelessPhpDocTagNode(string $annotationContent, string $tagName, string $fullyQualifiedAnnotationClass, StartAndEnd $startAndEnd, Node $currentPhpNode) : SpacelessPhpDocTagNode { $nestedTokenIterator = $this->tokenIteratorFactory->create($annotationContent); // mimics doctrine behavior just in phpdoc-parser syntax :) // https://github.com/doctrine/annotations/blob/c66f06b7c83e9a2a7523351a9d5a4b55f885e574/lib/Doctrine/Common/Annotations/DocParser.php#L742 - $values = $this->staticDoctrineAnnotationParser->resolveAnnotationMethodCall($nestedTokenIterator); + $values = $this->staticDoctrineAnnotationParser->resolveAnnotationMethodCall($nestedTokenIterator, $currentPhpNode); $identifierTypeNode = new IdentifierTypeNode($tagName); $identifierTypeNode->setAttribute(PhpDocAttributeKey::RESOLVED_CLASS, $fullyQualifiedAnnotationClass); $doctrineAnnotationTagValueNode = new DoctrineAnnotationTagValueNode($identifierTypeNode, $annotationContent, $values, SilentKeyMap::CLASS_NAMES_TO_SILENT_KEYS[$fullyQualifiedAnnotationClass] ?? null); @@ -216,7 +216,7 @@ private function combineStartAndEnd(\PHPStan\PhpDocParser\Ast\Node $startPhpDocC $nextStartAndEnd = $endPhpDocChildNode->getAttribute(PhpDocAttributeKey::START_AND_END); return new StartAndEnd($currentStartAndEnd->getStart(), $nextStartAndEnd->getEnd()); } - private function resolveFqnAnnotationSpacelessPhpDocTagNode(PhpDocTextNode $phpDocTextNode) : ?SpacelessPhpDocTagNode + private function resolveFqnAnnotationSpacelessPhpDocTagNode(PhpDocTextNode $phpDocTextNode, Node $currentPhpNode) : ?SpacelessPhpDocTagNode { $match = Strings::match($phpDocTextNode->text, self::LONG_ANNOTATION_REGEX); $fullyQualifiedAnnotationClass = $match['class_name'] ?? null; @@ -226,6 +226,6 @@ private function resolveFqnAnnotationSpacelessPhpDocTagNode(PhpDocTextNode $phpD $annotationContent = $match['annotation_content'] ?? null; $tagName = '@\\' . $fullyQualifiedAnnotationClass; $formerStartEnd = $phpDocTextNode->getAttribute(PhpDocAttributeKey::START_AND_END); - return $this->createDoctrineSpacelessPhpDocTagNode($annotationContent, $tagName, $fullyQualifiedAnnotationClass, $formerStartEnd); + return $this->createDoctrineSpacelessPhpDocTagNode($annotationContent, $tagName, $fullyQualifiedAnnotationClass, $formerStartEnd, $currentPhpNode); } } diff --git a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php index 68b00aa8d..a0b3aecac 100644 --- a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php +++ b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocParser; +use PhpParser\Node; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprNode; use PHPStan\PhpDocParser\Lexer\Lexer; use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; @@ -38,7 +39,7 @@ public function __construct(PlainValueParser $plainValueParser, ArrayParser $arr * * @return ArrayItemNode[] */ - public function resolveAnnotationMethodCall(BetterTokenIterator $tokenIterator) : array + public function resolveAnnotationMethodCall(BetterTokenIterator $tokenIterator, Node $currentPhpNode) : array { if (!$tokenIterator->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { return []; @@ -48,28 +49,28 @@ public function resolveAnnotationMethodCall(BetterTokenIterator $tokenIterator) if ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { return []; } - return $this->resolveAnnotationValues($tokenIterator); + return $this->resolveAnnotationValues($tokenIterator, $currentPhpNode); } /** * @api tests * @see https://github.com/doctrine/annotations/blob/c66f06b7c83e9a2a7523351a9d5a4b55f885e574/lib/Doctrine/Common/Annotations/DocParser.php#L1215-L1224 * @return CurlyListNode|string|array|ConstExprNode|DoctrineAnnotationTagValueNode|StringNode */ - public function resolveAnnotationValue(BetterTokenIterator $tokenIterator) + public function resolveAnnotationValue(BetterTokenIterator $tokenIterator, Node $currentPhpNode) { // skips dummy tokens like newlines $tokenIterator->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); // no assign if (!$tokenIterator->isNextTokenType(Lexer::TOKEN_EQUAL)) { // 1. plain value - mimics https://github.com/doctrine/annotations/blob/0cb0cd2950a5c6cdbf22adbe2bfd5fd1ea68588f/lib/Doctrine/Common/Annotations/DocParser.php#L1234-L1282 - return $this->parseValue($tokenIterator); + return $this->parseValue($tokenIterator, $currentPhpNode); } // 2. assign key = value - mimics FieldAssignment() https://github.com/doctrine/annotations/blob/0cb0cd2950a5c6cdbf22adbe2bfd5fd1ea68588f/lib/Doctrine/Common/Annotations/DocParser.php#L1291-L1303 /** @var int $key */ - $key = $this->parseValue($tokenIterator); + $key = $this->parseValue($tokenIterator, $currentPhpNode); $tokenIterator->consumeTokenType(Lexer::TOKEN_EQUAL); // mimics https://github.com/doctrine/annotations/blob/1.13.x/lib/Doctrine/Common/Annotations/DocParser.php#L1236-L1238 - $value = $this->parseValue($tokenIterator); + $value = $this->parseValue($tokenIterator, $currentPhpNode); return [ // plain token value $key => $value, @@ -80,10 +81,10 @@ public function resolveAnnotationValue(BetterTokenIterator $tokenIterator) * * @return ArrayItemNode[] */ - private function resolveAnnotationValues(BetterTokenIterator $tokenIterator) : array + private function resolveAnnotationValues(BetterTokenIterator $tokenIterator, Node $currentPhpNode) : array { $values = []; - $resolvedValue = $this->resolveAnnotationValue($tokenIterator); + $resolvedValue = $this->resolveAnnotationValue($tokenIterator, $currentPhpNode); if (\is_array($resolvedValue)) { $values = \array_merge($values, $resolvedValue); } else { @@ -95,7 +96,7 @@ private function resolveAnnotationValues(BetterTokenIterator $tokenIterator) : a if ($tokenIterator->isNextTokenType(Lexer::TOKEN_CLOSE_PARENTHESES)) { continue; } - $nestedValues = $this->resolveAnnotationValue($tokenIterator); + $nestedValues = $this->resolveAnnotationValue($tokenIterator, $currentPhpNode); if (\is_array($nestedValues)) { $values = \array_merge($values, $nestedValues); } else { @@ -110,12 +111,12 @@ private function resolveAnnotationValues(BetterTokenIterator $tokenIterator) : a /** * @return CurlyListNode|string|array|ConstExprNode|DoctrineAnnotationTagValueNode|StringNode */ - private function parseValue(BetterTokenIterator $tokenIterator) + private function parseValue(BetterTokenIterator $tokenIterator, Node $currentPhpNode) { if ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET)) { - $items = $this->arrayParser->parseCurlyArray($tokenIterator); + $items = $this->arrayParser->parseCurlyArray($tokenIterator, $currentPhpNode); return new CurlyListNode($items); } - return $this->plainValueParser->parseValue($tokenIterator); + return $this->plainValueParser->parseValue($tokenIterator, $currentPhpNode); } } diff --git a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php index 1b6643d46..192b9dd2c 100644 --- a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php +++ b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/ArrayParser.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser; +use PhpParser\Node; use PhpParser\Node\Scalar\String_; use PHPStan\PhpDocParser\Ast\ConstExpr\ConstExprIntegerNode; use PHPStan\PhpDocParser\Lexer\Lexer; @@ -28,7 +29,7 @@ public function __construct(\Rector\BetterPhpDocParser\PhpDocParser\StaticDoctri * * @return ArrayItemNode[] */ - public function parseCurlyArray(BetterTokenIterator $tokenIterator) : array + public function parseCurlyArray(BetterTokenIterator $tokenIterator, Node $currentPhpNode) : array { $values = []; // nothing @@ -42,7 +43,7 @@ public function parseCurlyArray(BetterTokenIterator $tokenIterator) : array return []; } // first item - $values[] = $this->resolveArrayItem($tokenIterator); + $values[] = $this->resolveArrayItem($tokenIterator, $currentPhpNode); // 2nd+ item while ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_COMMA)) { // optional trailing comma @@ -51,7 +52,7 @@ public function parseCurlyArray(BetterTokenIterator $tokenIterator) : array if ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { break; } - $values[] = $this->resolveArrayItem($tokenIterator); + $values[] = $this->resolveArrayItem($tokenIterator, $currentPhpNode); if ($tokenIterator->isNextTokenType(Lexer::TOKEN_CLOSE_CURLY_BRACKET)) { break; } @@ -92,7 +93,7 @@ public function createArrayFromValues(array $values) : array * Mimics https://github.com/doctrine/annotations/blob/c66f06b7c83e9a2a7523351a9d5a4b55f885e574/lib/Doctrine/Common/Annotations/DocParser.php#L1354-L1385 * @return array */ - private function resolveArrayItem(BetterTokenIterator $tokenIterator) : array + private function resolveArrayItem(BetterTokenIterator $tokenIterator, Node $currentPhpNode) : array { // skip newlines $tokenIterator->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); @@ -117,17 +118,17 @@ private function resolveArrayItem(BetterTokenIterator $tokenIterator) : array $tokenIterator->tryConsumeTokenType(Lexer::TOKEN_COLON); if ($key === null) { if ($tokenIterator->isNextTokenType(Lexer::TOKEN_IDENTIFIER)) { - $key = $this->plainValueParser->parseValue($tokenIterator); + $key = $this->plainValueParser->parseValue($tokenIterator, $currentPhpNode); } else { $tokenIterator->tryConsumeTokenType(Lexer::TOKEN_COMMA); - $key = $this->plainValueParser->parseValue($tokenIterator); + $key = $this->plainValueParser->parseValue($tokenIterator, $currentPhpNode); } } $tokenIterator->tryConsumeTokenType(Lexer::TOKEN_EQUAL); $tokenIterator->tryConsumeTokenType(Lexer::TOKEN_COLON); - return [$key, $this->plainValueParser->parseValue($tokenIterator)]; + return [$key, $this->plainValueParser->parseValue($tokenIterator, $currentPhpNode)]; } - return [$key, $this->plainValueParser->parseValue($tokenIterator)]; + return [$key, $this->plainValueParser->parseValue($tokenIterator, $currentPhpNode)]; } /** * @return String_::KIND_SINGLE_QUOTED|String_::KIND_DOUBLE_QUOTED|null diff --git a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php index b34f97cef..5b203cd2f 100644 --- a/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php +++ b/vendor/rector/rector/packages/BetterPhpDocParser/PhpDocParser/StaticDoctrineAnnotationParser/PlainValueParser.php @@ -16,8 +16,6 @@ use Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser; use Rector\BetterPhpDocParser\ValueObject\Parser\BetterTokenIterator; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\Core\Configuration\CurrentNodeProvider; -use Rector\Core\Exception\ShouldNotHappenException; final class PlainValueParser { /** @@ -25,11 +23,6 @@ final class PlainValueParser * @var \Rector\BetterPhpDocParser\PhpDocParser\ClassAnnotationMatcher */ private $classAnnotationMatcher; - /** - * @readonly - * @var \Rector\Core\Configuration\CurrentNodeProvider - */ - private $currentNodeProvider; /** * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser */ @@ -38,10 +31,9 @@ final class PlainValueParser * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser */ private $arrayParser; - public function __construct(ClassAnnotationMatcher $classAnnotationMatcher, CurrentNodeProvider $currentNodeProvider) + public function __construct(ClassAnnotationMatcher $classAnnotationMatcher) { $this->classAnnotationMatcher = $classAnnotationMatcher; - $this->currentNodeProvider = $currentNodeProvider; } public function autowire(StaticDoctrineAnnotationParser $staticDoctrineAnnotationParser, \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser $arrayParser) : void { @@ -51,7 +43,7 @@ public function autowire(StaticDoctrineAnnotationParser $staticDoctrineAnnotatio /** * @return string|mixed[]|ConstExprNode|DoctrineAnnotationTagValueNode|StringNode */ - public function parseValue(BetterTokenIterator $tokenIterator) + public function parseValue(BetterTokenIterator $tokenIterator, Node $currentPhpNode) { $currentTokenValue = $tokenIterator->currentTokenValue(); // temporary hackaround multi-line doctrine annotations @@ -61,7 +53,7 @@ public function parseValue(BetterTokenIterator $tokenIterator) // consume the token $isOpenCurlyArray = $tokenIterator->isCurrentTokenType(Lexer::TOKEN_OPEN_CURLY_BRACKET); if ($isOpenCurlyArray) { - return $this->arrayParser->parseCurlyArray($tokenIterator); + return $this->arrayParser->parseCurlyArray($tokenIterator, $currentPhpNode); } $tokenIterator->next(); // normalize value @@ -75,7 +67,7 @@ public function parseValue(BetterTokenIterator $tokenIterator) } // nested entity!, supported in attribute since PHP 8.1 if ($tokenIterator->isCurrentTokenType(Lexer::TOKEN_OPEN_PARENTHESES)) { - return $this->parseNestedDoctrineAnnotationTagValueNode($currentTokenValue, $tokenIterator); + return $this->parseNestedDoctrineAnnotationTagValueNode($currentTokenValue, $tokenIterator, $currentPhpNode); } $start = $tokenIterator->currentPosition(); // from "quote to quote" @@ -90,16 +82,12 @@ public function parseValue(BetterTokenIterator $tokenIterator) } return $currentTokenValue; } - private function parseNestedDoctrineAnnotationTagValueNode(string $currentTokenValue, BetterTokenIterator $tokenIterator) : DoctrineAnnotationTagValueNode + private function parseNestedDoctrineAnnotationTagValueNode(string $currentTokenValue, BetterTokenIterator $tokenIterator, Node $currentPhpNode) : DoctrineAnnotationTagValueNode { // @todo $annotationShortName = $currentTokenValue; - $values = $this->staticDoctrineAnnotationParser->resolveAnnotationMethodCall($tokenIterator); - $currentNode = $this->currentNodeProvider->getNode(); - if (!$currentNode instanceof Node) { - throw new ShouldNotHappenException(); - } - $fullyQualifiedAnnotationClass = $this->classAnnotationMatcher->resolveTagFullyQualifiedName($annotationShortName, $currentNode); + $values = $this->staticDoctrineAnnotationParser->resolveAnnotationMethodCall($tokenIterator, $currentPhpNode); + $fullyQualifiedAnnotationClass = $this->classAnnotationMatcher->resolveTagFullyQualifiedName($annotationShortName, $currentPhpNode); // keep the last ")" $tokenIterator->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); if ($tokenIterator->currentTokenValue() === ')') { diff --git a/vendor/rector/rector/packages/Caching/Detector/ChangedFilesDetector.php b/vendor/rector/rector/packages/Caching/Detector/ChangedFilesDetector.php index e250f152b..d5762113e 100644 --- a/vendor/rector/rector/packages/Caching/Detector/ChangedFilesDetector.php +++ b/vendor/rector/rector/packages/Caching/Detector/ChangedFilesDetector.php @@ -85,6 +85,7 @@ public function setFirstResolvedConfigFileInfo(string $filePath) : void } private function resolvePath(string $filePath) : string { + /** @var string|false $realPath */ $realPath = \realpath($filePath); if ($realPath === \false) { return $filePath; diff --git a/vendor/rector/rector/packages/Config/RectorConfig.php b/vendor/rector/rector/packages/Config/RectorConfig.php index 90454e250..018a0bde2 100644 --- a/vendor/rector/rector/packages/Config/RectorConfig.php +++ b/vendor/rector/rector/packages/Config/RectorConfig.php @@ -4,14 +4,15 @@ namespace Rector\Config; use RectorPrefix202309\Illuminate\Container\Container; +use PHPStan\Collectors\Collector; use Rector\Caching\Contract\ValueObject\Storage\CacheStorageInterface; use Rector\Core\Configuration\Option; use Rector\Core\Configuration\Parameter\SimpleParameterProvider; +use Rector\Core\Contract\Rector\CollectorRectorInterface; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Contract\Rector\RectorInterface; use Rector\Core\DependencyInjection\Laravel\ContainerMemento; use Rector\Core\Exception\ShouldNotHappenException; -use Rector\Core\FileSystem\FilesystemTweaker; use Rector\Core\NodeAnalyzer\ScopeAnalyzer; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersion; @@ -32,6 +33,12 @@ final class RectorConfig extends Container public function paths(array $paths) : void { Assert::allString($paths); + foreach ($paths as $path) { + if (\strpos($path, '*') !== \false) { + continue; + } + Assert::fileExists($path); + } SimpleParameterProvider::setParameter(Option::PATHS, $paths); } /** @@ -51,6 +58,13 @@ public function disableParallel() : void { SimpleParameterProvider::setParameter(Option::PARALLEL, \false); } + /** + * @experimental since Rector 0.18.x + */ + public function enableCollectors() : void + { + SimpleParameterProvider::setParameter(Option::COLLECTORS, \true); + } public function parallel(int $seconds = 120, int $maxNumberOfProcess = 16, int $jobSize = 15) : void { SimpleParameterProvider::setParameter(Option::PARALLEL, \true); @@ -165,6 +179,9 @@ public function rule(string $rectorClass) : void Assert::isAOf($rectorClass, RectorInterface::class); $this->singleton($rectorClass); $this->tag($rectorClass, RectorInterface::class); + 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); @@ -175,16 +192,25 @@ public function rule(string $rectorClass) : void // for cache invalidation in case of change SimpleParameterProvider::addParameter(Option::REGISTERED_RECTOR_RULES, $rectorClass); } + /** + * @param class-string $collectorClass + */ + public function collector(string $collectorClass) : void + { + $this->singleton($collectorClass); + $this->tag($collectorClass, Collector::class); + } public function import(string $filePath) : void { - $paths = [$filePath]; if (\strpos($filePath, '*') !== \false) { - $filesystemTweaker = new FilesystemTweaker(); - $paths = $filesystemTweaker->resolveWithFnmatch($paths); - } - foreach ($paths as $path) { - $this->importFile($path); + throw new ShouldNotHappenException('Matching file paths by using glob-patterns is no longer supported. Use specific file path instead.'); } + Assert::fileExists($filePath); + $self = $this; + $callable = (require $filePath); + Assert::isCallable($callable); + /** @var callable(Container $container): void $callable */ + $callable($self); } /** * @param array> $rectorClasses @@ -290,21 +316,19 @@ public function boot() : void ContainerMemento::forgetService($this, $skippedClass); } } - private function importFile(string $filePath) : void + /** + * @experimental since Rector 0.18.x + */ + public function disableCollectors() : void { - Assert::fileExists($filePath); - $self = $this; - $callable = (require $filePath); - Assert::isCallable($callable); - /** @var callable(Container $container): void $callable */ - $callable($self); + SimpleParameterProvider::setParameter(Option::COLLECTORS, \false); } /** * @param mixed $skipRule */ private function isRuleNoLongerExists($skipRule) : bool { - return \is_string($skipRule) && \strpos($skipRule, '*') === \false && \realpath($skipRule) === \false && \substr_compare($skipRule, 'Rector', -\strlen('Rector')) === 0 && !\class_exists($skipRule); + return \is_string($skipRule) && \strpos($skipRule, '*') === \false && \substr_compare($skipRule, 'Rector', -\strlen('Rector')) === 0 && !\is_dir($skipRule) && !\is_file($skipRule) && !\class_exists($skipRule); } /** * @param string[] $values diff --git a/vendor/rector/rector/packages/NodeTypeResolver/Node/AttributeKey.php b/vendor/rector/rector/packages/NodeTypeResolver/Node/AttributeKey.php index 67e2ec8ef..25a7dcd2d 100644 --- a/vendor/rector/rector/packages/NodeTypeResolver/Node/AttributeKey.php +++ b/vendor/rector/rector/packages/NodeTypeResolver/Node/AttributeKey.php @@ -19,7 +19,7 @@ final class AttributeKey */ public const VIRTUAL_NODE = 'virtual_node'; /** - * Contains @see Scope + * @see Scope * @var string */ public const SCOPE = 'scope'; diff --git a/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php b/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php index d7c6f1453..b0cf32eb8 100644 --- a/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php +++ b/vendor/rector/rector/packages/NodeTypeResolver/NodeTypeResolver.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; +use PhpParser\Node\Expr\ArrayDimFetch; use PhpParser\Node\Expr\BinaryOp\Coalesce; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\ConstFetch; @@ -15,13 +16,17 @@ use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\NullableType; +use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Property; use PhpParser\Node\UnionType as NodeUnionType; use PHPStan\Analyser\Scope; use PHPStan\Broker\ClassAutoloadingException; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; +use PHPStan\Type\ArrayType; +use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\Constant\ConstantBooleanType; +use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\MixedType; use PHPStan\Type\NullType; use PHPStan\Type\ObjectType; @@ -227,24 +232,16 @@ public function getNativeType(Expr $expr) : Type } } $type = $scope->getNativeType($expr); + if ($expr instanceof ArrayDimFetch) { + $type = $this->resolveArrayDimFetchType($expr, $scope, $type); + } if (!$type instanceof UnionType) { if ($this->isAnonymousObjectType($type)) { return new ObjectWithoutClassType(); } return $this->accessoryNonEmptyStringTypeCorrector->correct($type); } - $hasChanged = \false; - $types = $type->getTypes(); - foreach ($types as $key => $childType) { - if ($this->isAnonymousObjectType($childType)) { - $types[$key] = new ObjectWithoutClassType(); - $hasChanged = \true; - } - } - if ($hasChanged) { - return $this->accessoryNonEmptyStringTypeCorrector->correct(new UnionType($types)); - } - return $this->accessoryNonEmptyStringTypeCorrector->correct($type); + return $this->resolveNativeUnionType($type); } public function isNumberType(Expr $expr) : bool { @@ -302,6 +299,66 @@ public function isMethodStaticCallOrClassMethodObjectType(Node $node, ObjectType } return $classReflection->isSubclassOf($objectType->getClassName()); } + /** + * Allow pull type from + * + * - native function + * - always defined by assignment + * + * eg: + * + * $parts = parse_url($url); + * if (!empty($parts['host'])) { } + * + * or + * + * $parts = ['host' => 'foo']; + * if (!empty($parts['host'])) { } + */ + private function resolveArrayDimFetchType(ArrayDimFetch $arrayDimFetch, Scope $scope, Type $originalNativeType) : Type + { + $nativeVariableType = $scope->getNativeType($arrayDimFetch->var); + if ($nativeVariableType instanceof MixedType || $nativeVariableType instanceof ArrayType && $nativeVariableType->getItemType() instanceof MixedType) { + return $originalNativeType; + } + $type = $scope->getType($arrayDimFetch); + if (!$arrayDimFetch->dim instanceof String_) { + return $type; + } + $variableType = $scope->getType($arrayDimFetch->var); + if (!$variableType instanceof ConstantArrayType) { + return $type; + } + $optionalKeys = $variableType->getOptionalKeys(); + foreach ($variableType->getKeyTypes() as $key => $type) { + if (!$type instanceof ConstantStringType) { + continue; + } + if ($type->getValue() !== $arrayDimFetch->dim->value) { + continue; + } + if (!\in_array($key, $optionalKeys, \true)) { + continue; + } + return $originalNativeType; + } + return $type; + } + private function resolveNativeUnionType(UnionType $unionType) : Type + { + $hasChanged = \false; + $types = $unionType->getTypes(); + foreach ($types as $key => $childType) { + if ($this->isAnonymousObjectType($childType)) { + $types[$key] = new ObjectWithoutClassType(); + $hasChanged = \true; + } + } + if ($hasChanged) { + return $this->accessoryNonEmptyStringTypeCorrector->correct(new UnionType($types)); + } + return $this->accessoryNonEmptyStringTypeCorrector->correct($unionType); + } private function isMatchObjectWithoutClassType(ObjectWithoutClassType $objectWithoutClassType, ObjectType $requiredObjectType) : bool { if ($objectWithoutClassType instanceof ObjectWithoutClassTypeWithParentTypes) { diff --git a/vendor/rector/rector/packages/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php b/vendor/rector/rector/packages/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php index 672294087..8d8e6ad37 100644 --- a/vendor/rector/rector/packages/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php +++ b/vendor/rector/rector/packages/NodeTypeResolver/PhpDoc/NodeAnalyzer/DocBlockClassRenamer.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer; +use PhpParser\Node; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; use Rector\NodeTypeResolver\PhpDocNodeVisitor\ClassRenamePhpDocNodeVisitor; use Rector\NodeTypeResolver\ValueObject\OldToNewType; @@ -21,13 +22,14 @@ public function __construct(ClassRenamePhpDocNodeVisitor $classRenamePhpDocNodeV /** * @param OldToNewType[] $oldToNewTypes */ - public function renamePhpDocType(PhpDocInfo $phpDocInfo, array $oldToNewTypes) : bool + public function renamePhpDocType(PhpDocInfo $phpDocInfo, array $oldToNewTypes, Node $currentPhpNode) : bool { if ($oldToNewTypes === []) { return \false; } $phpDocNodeTraverser = new PhpDocNodeTraverser(); $phpDocNodeTraverser->addPhpDocNodeVisitor($this->classRenamePhpDocNodeVisitor); + $this->classRenamePhpDocNodeVisitor->setCurrentPhpNode($currentPhpNode); $this->classRenamePhpDocNodeVisitor->setOldToNewTypes($oldToNewTypes); $phpDocNodeTraverser->traverse($phpDocInfo->getPhpDocNode()); return $this->classRenamePhpDocNodeVisitor->hasChanged(); diff --git a/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php b/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php index f9100f613..e1c1419cf 100644 --- a/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php +++ b/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/ClassRenamePhpDocNodeVisitor.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\NodeTypeResolver\PhpDocNodeVisitor; -use PhpParser\Node as PhpParserNode; +use PhpParser\Node as PhpNode; use PhpParser\Node\Identifier; use PhpParser\Node\Stmt\GroupUse; use PhpParser\Node\Stmt\Use_; @@ -14,7 +14,6 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; -use Rector\Core\Configuration\CurrentNodeProvider; use Rector\Core\Configuration\Option; use Rector\Core\Configuration\Parameter\SimpleParameterProvider; use Rector\Core\Exception\ShouldNotHappenException; @@ -31,11 +30,6 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor * @var \Rector\StaticTypeMapper\StaticTypeMapper */ private $staticTypeMapper; - /** - * @readonly - * @var \Rector\Core\Configuration\CurrentNodeProvider - */ - private $currentNodeProvider; /** * @readonly * @var \Rector\Naming\Naming\UseImportsResolver @@ -49,17 +43,27 @@ final class ClassRenamePhpDocNodeVisitor extends AbstractPhpDocNodeVisitor * @var bool */ private $hasChanged = \false; - public function __construct(StaticTypeMapper $staticTypeMapper, CurrentNodeProvider $currentNodeProvider, UseImportsResolver $useImportsResolver) + /** + * @var PhpNode|null + */ + private $currentPhpNode; + public function __construct(StaticTypeMapper $staticTypeMapper, UseImportsResolver $useImportsResolver) { $this->staticTypeMapper = $staticTypeMapper; - $this->currentNodeProvider = $currentNodeProvider; $this->useImportsResolver = $useImportsResolver; } + public function setCurrentPhpNode(PhpNode $phpNode) : void + { + $this->currentPhpNode = $phpNode; + } public function beforeTraverse(Node $node) : void { if ($this->oldToNewTypes === []) { throw new ShouldNotHappenException('Configure "$oldToNewClasses" first'); } + if (!$this->currentPhpNode instanceof PhpNode) { + throw new ShouldNotHappenException('Configure "$currentPhpNode" first'); + } $this->hasChanged = \false; } public function enterNode(Node $node) : ?Node @@ -67,17 +71,15 @@ public function enterNode(Node $node) : ?Node if (!$node instanceof IdentifierTypeNode) { return null; } - $phpParserNode = $this->currentNodeProvider->getNode(); - if (!$phpParserNode instanceof PhpParserNode) { - throw new ShouldNotHappenException(); - } - $virtualNode = $phpParserNode->getAttribute(AttributeKey::VIRTUAL_NODE); + /** @var \PhpParser\Node $currentPhpNode */ + $currentPhpNode = $this->currentPhpNode; + $virtualNode = $currentPhpNode->getAttribute(AttributeKey::VIRTUAL_NODE); if ($virtualNode === \true) { return null; } $identifier = clone $node; - $identifier->name = $this->resolveNamespacedName($identifier, $phpParserNode, $node->name); - $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifier, $phpParserNode); + $identifier->name = $this->resolveNamespacedName($identifier, $currentPhpNode, $node->name); + $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifier, $currentPhpNode); $shouldImport = SimpleParameterProvider::provideBoolParameter(Option::AUTO_IMPORT_NAMES); $isNoNamespacedName = \strncmp($identifier->name, '\\', \strlen('\\')) !== 0 && \substr_count($identifier->name, '\\') === 0; // tweak overlapped import + rename @@ -112,7 +114,7 @@ public function hasChanged() : bool { return $this->hasChanged; } - private function resolveNamespacedName(IdentifierTypeNode $identifierTypeNode, PhpParserNode $phpParserNode, string $name) : string + private function resolveNamespacedName(IdentifierTypeNode $identifierTypeNode, PhpNode $phpNode, string $name) : string { if (\strncmp($name, '\\', \strlen('\\')) === 0) { return $name; @@ -120,7 +122,7 @@ private function resolveNamespacedName(IdentifierTypeNode $identifierTypeNode, P if (\strpos($name, '\\') !== \false) { return $name; } - $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifierTypeNode, $phpParserNode); + $staticType = $this->staticTypeMapper->mapPHPStanPhpDocTypeNodeToPHPStanType($identifierTypeNode, $phpNode); if (!$staticType instanceof ObjectType) { return $name; } @@ -128,10 +130,10 @@ private function resolveNamespacedName(IdentifierTypeNode $identifierTypeNode, P return $name; } $uses = $this->useImportsResolver->resolve(); - $originalNode = $phpParserNode->getAttribute(AttributeKey::ORIGINAL_NODE); - $scope = $originalNode instanceof PhpParserNode ? $originalNode->getAttribute(AttributeKey::SCOPE) : $phpParserNode->getAttribute(AttributeKey::SCOPE); + $originalNode = $phpNode->getAttribute(AttributeKey::ORIGINAL_NODE); + $scope = $originalNode instanceof PhpNode ? $originalNode->getAttribute(AttributeKey::SCOPE) : $phpNode->getAttribute(AttributeKey::SCOPE); if (!$scope instanceof Scope) { - if (!$originalNode instanceof PhpParserNode) { + if (!$originalNode instanceof PhpNode) { return $this->resolveNamefromUse($uses, $name); } return ''; diff --git a/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php b/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php index 45e5439f5..fdba84fc9 100644 --- a/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php +++ b/vendor/rector/rector/packages/NodeTypeResolver/PhpDocNodeVisitor/NameImportingPhpDocNodeVisitor.php @@ -142,6 +142,9 @@ private function shouldImport(IdentifierTypeNode $newNode, IdentifierTypeNode $i return \false; } if (\strncmp($identifierTypeNode->name, '\\', \strlen('\\')) === 0) { + if ($fullyQualifiedObjectType->getShortName() !== $fullyQualifiedObjectType->getClassName()) { + return $fullyQualifiedObjectType->getShortName() !== \ltrim($identifierTypeNode->name, '\\'); + } return \true; } $className = $fullyQualifiedObjectType->getClassName(); diff --git a/vendor/rector/rector/packages/Parallel/Application/ParallelFileProcessor.php b/vendor/rector/rector/packages/Parallel/Application/ParallelFileProcessor.php index 28768c18c..370793504 100644 --- a/vendor/rector/rector/packages/Parallel/Application/ParallelFileProcessor.php +++ b/vendor/rector/rector/packages/Parallel/Application/ParallelFileProcessor.php @@ -13,6 +13,7 @@ use Rector\Core\Configuration\Option; use Rector\Core\Configuration\Parameter\SimpleParameterProvider; use Rector\Core\Console\Command\ProcessCommand; +use Rector\Core\ValueObject\Configuration; use Rector\Core\ValueObject\Error\SystemError; use Rector\Core\ValueObject\ProcessResult; use Rector\Core\ValueObject\Reporting\FileDiff; @@ -63,7 +64,7 @@ public function __construct(WorkerCommandLineFactory $workerCommandLineFactory) /** * @param callable(int $stepCount): void $postFileCallback Used for progress bar jump */ - public function process(Schedule $schedule, string $mainScript, callable $postFileCallback, InputInterface $input) : ProcessResult + public function process(Schedule $schedule, string $mainScript, callable $postFileCallback, InputInterface $input, Configuration $configuration) : ProcessResult { $jobs = \array_reverse($schedule->getJobs()); $streamSelectLoop = new StreamSelectLoop(); @@ -72,16 +73,16 @@ public function process(Schedule $schedule, string $mainScript, callable $postFi // initial counters /** @var FileDiff[] $fileDiffs */ $fileDiffs = []; - /** @var CollectedData[] $collectedDatas */ - $collectedDatas = []; + /** @var CollectedData[] $collectedData */ + $collectedData = []; /** @var SystemError[] $systemErrors */ $systemErrors = []; $tcpServer = new TcpServer('127.0.0.1:0', $streamSelectLoop); $this->processPool = new ProcessPool($tcpServer); - $tcpServer->on(ReactEvent::CONNECTION, function (ConnectionInterface $connection) use(&$jobs) : void { + $tcpServer->on(ReactEvent::CONNECTION, function (ConnectionInterface $connection) use(&$jobs, $configuration) : void { $inDecoder = new Decoder($connection, \true, 512, 0, 4 * 1024 * 1024); $outEncoder = new Encoder($connection); - $inDecoder->on(ReactEvent::DATA, function (array $data) use(&$jobs, $inDecoder, $outEncoder) : void { + $inDecoder->on(ReactEvent::DATA, function (array $data) use(&$jobs, $inDecoder, $outEncoder, $configuration) : void { $action = $data[ReactCommand::ACTION]; if ($action !== Action::HELLO) { return; @@ -94,7 +95,7 @@ public function process(Schedule $schedule, string $mainScript, callable $postFi return; } $jobsChunk = \array_pop($jobs); - $parallelProcess->request([ReactCommand::ACTION => Action::MAIN, Content::FILES => $jobsChunk]); + $parallelProcess->request([ReactCommand::ACTION => Action::MAIN, Content::FILES => $jobsChunk, Bridge::PREVIOUSLY_COLLECTED_DATA => $configuration->getCollectedData()]); }); }); /** @var string $serverAddress */ @@ -115,14 +116,14 @@ public function process(Schedule $schedule, string $mainScript, callable $postFi }; $timeoutInSeconds = SimpleParameterProvider::provideIntParameter(Option::PARALLEL_JOB_TIMEOUT_IN_SECONDS); $fileChunksBudgetPerProcess = []; - $processSpawner = function () use(&$systemErrors, &$fileDiffs, &$jobs, $postFileCallback, &$systemErrorsCount, &$reachedInternalErrorsCountLimit, $mainScript, $input, $serverPort, $streamSelectLoop, $timeoutInSeconds, $handleErrorCallable, &$fileChunksBudgetPerProcess, &$processSpawner) : void { + $processSpawner = function () use(&$systemErrors, &$fileDiffs, &$collectedData, &$jobs, $postFileCallback, &$systemErrorsCount, &$reachedInternalErrorsCountLimit, $mainScript, $input, $serverPort, $streamSelectLoop, $timeoutInSeconds, $handleErrorCallable, &$fileChunksBudgetPerProcess, &$processSpawner) : void { $processIdentifier = Random::generate(); $workerCommandLine = $this->workerCommandLineFactory->create($mainScript, ProcessCommand::class, 'worker', $input, $processIdentifier, $serverPort); $fileChunksBudgetPerProcess[$processIdentifier] = self::MAX_CHUNKS_PER_WORKER; $parallelProcess = new ParallelProcess($workerCommandLine, $streamSelectLoop, $timeoutInSeconds); $parallelProcess->start( // 1. callable on data - function (array $json) use($parallelProcess, &$systemErrors, &$fileDiffs, &$jobs, $postFileCallback, &$systemErrorsCount, &$collectedDatas, &$reachedInternalErrorsCountLimit, $processIdentifier, &$fileChunksBudgetPerProcess, &$processSpawner) : void { + function (array $json) use($parallelProcess, &$systemErrors, &$fileDiffs, &$jobs, $postFileCallback, &$systemErrorsCount, &$collectedData, &$reachedInternalErrorsCountLimit, $processIdentifier, &$fileChunksBudgetPerProcess, &$processSpawner) : void { // decode arrays to objects foreach ($json[Bridge::SYSTEM_ERRORS] as $jsonError) { if (\is_string($jsonError)) { @@ -134,8 +135,8 @@ function (array $json) use($parallelProcess, &$systemErrors, &$fileDiffs, &$jobs foreach ($json[Bridge::FILE_DIFFS] as $jsonFileDiff) { $fileDiffs[] = FileDiff::decode($jsonFileDiff); } - foreach ($json[Bridge::COLLECTED_DATA] as $jsonCollectedData) { - $collectedDatas[] = CollectedData::decode($jsonCollectedData); + foreach ($json[Bridge::COLLECTED_DATA] as $collectedDataItem) { + $collectedData[] = CollectedData::decode($collectedDataItem); } $postFileCallback($json[Bridge::FILES_COUNT]); $systemErrorsCount += $json[Bridge::SYSTEM_ERRORS_COUNT]; @@ -184,6 +185,6 @@ function ($exitCode, string $stdErr) use(&$systemErrors, $processIdentifier) : v if ($reachedSystemErrorsCountLimit) { $systemErrors[] = new SystemError(\sprintf('Reached system errors count limit of %d, exiting...', self::SYSTEM_ERROR_LIMIT)); } - return new ProcessResult($systemErrors, $fileDiffs, $collectedDatas); + return new ProcessResult($systemErrors, $fileDiffs, $collectedData); } } diff --git a/vendor/rector/rector/packages/Parallel/Command/WorkerCommandLineFactory.php b/vendor/rector/rector/packages/Parallel/Command/WorkerCommandLineFactory.php index 4b50b9646..251425101 100644 --- a/vendor/rector/rector/packages/Parallel/Command/WorkerCommandLineFactory.php +++ b/vendor/rector/rector/packages/Parallel/Command/WorkerCommandLineFactory.php @@ -5,6 +5,7 @@ use Rector\ChangesReporting\Output\JsonOutputFormatter; use Rector\Core\Configuration\Option; +use Rector\Core\FileSystem\FilePathHelper; use RectorPrefix202309\Symfony\Component\Console\Command\Command; use RectorPrefix202309\Symfony\Component\Console\Input\InputInterface; use RectorPrefix202309\Symplify\EasyParallel\Exception\ParallelShouldNotHappenException; @@ -15,18 +16,24 @@ */ final class WorkerCommandLineFactory { - /** - * @var string - */ - private const OPTION_DASHES = '--'; /** * @readonly * @var \Symplify\EasyParallel\Reflection\CommandFromReflectionFactory */ private $commandFromReflectionFactory; - public function __construct() + /** + * @readonly + * @var \Rector\Core\FileSystem\FilePathHelper + */ + private $filePathHelper; + /** + * @var string + */ + private const OPTION_DASHES = '--'; + public function __construct(CommandFromReflectionFactory $commandFromReflectionFactory, FilePathHelper $filePathHelper) { - $this->commandFromReflectionFactory = new CommandFromReflectionFactory(); + $this->commandFromReflectionFactory = $commandFromReflectionFactory; + $this->filePathHelper = $filePathHelper; } /** * @param class-string $mainCommandClass @@ -89,7 +96,8 @@ public function create(string $mainScript, string $mainCommandClass, string $wor * * tested in macOS and Ubuntu (github action) */ - $workerCommandArray[] = \escapeshellarg((string) $input->getOption(Option::CONFIG)); + $config = (string) $input->getOption(Option::CONFIG); + $workerCommandArray[] = \escapeshellarg($this->filePathHelper->relativePath($config)); } return \implode(' ', $workerCommandArray); } diff --git a/vendor/rector/rector/packages/Parallel/ValueObject/Bridge.php b/vendor/rector/rector/packages/Parallel/ValueObject/Bridge.php index 766adcc87..c0f07d0d1 100644 --- a/vendor/rector/rector/packages/Parallel/ValueObject/Bridge.php +++ b/vendor/rector/rector/packages/Parallel/ValueObject/Bridge.php @@ -32,4 +32,8 @@ final class Bridge * @var string */ public const COLLECTED_DATA = 'collected_data'; + /** + * @var string + */ + public const PREVIOUSLY_COLLECTED_DATA = 'previously_collected_data'; } diff --git a/vendor/rector/rector/packages/Parallel/ValueObject/Name.php b/vendor/rector/rector/packages/Parallel/ValueObject/BridgeItem.php similarity index 97% rename from vendor/rector/rector/packages/Parallel/ValueObject/Name.php rename to vendor/rector/rector/packages/Parallel/ValueObject/BridgeItem.php index a33958614..72b7fed98 100644 --- a/vendor/rector/rector/packages/Parallel/ValueObject/Name.php +++ b/vendor/rector/rector/packages/Parallel/ValueObject/BridgeItem.php @@ -7,7 +7,7 @@ * @api * Helpers constant for passing constant names around */ -final class Name +final class BridgeItem { /** * @var string diff --git a/vendor/rector/rector/packages/Skipper/FileSystem/FnMatchPathNormalizer.php b/vendor/rector/rector/packages/Skipper/FileSystem/FnMatchPathNormalizer.php index a2042c8eb..3386731ba 100644 --- a/vendor/rector/rector/packages/Skipper/FileSystem/FnMatchPathNormalizer.php +++ b/vendor/rector/rector/packages/Skipper/FileSystem/FnMatchPathNormalizer.php @@ -14,6 +14,7 @@ public function normalizeForFnmatch(string $path) : string return '*' . \trim($path, '*') . '*'; } if (\strpos($path, '..') !== \false) { + /** @var string|false $path */ $path = \realpath($path); if ($path === \false) { return ''; diff --git a/vendor/rector/rector/packages/Skipper/RealpathMatcher.php b/vendor/rector/rector/packages/Skipper/RealpathMatcher.php index 89cbae299..2a1897904 100644 --- a/vendor/rector/rector/packages/Skipper/RealpathMatcher.php +++ b/vendor/rector/rector/packages/Skipper/RealpathMatcher.php @@ -7,10 +7,12 @@ final class RealpathMatcher { public function match(string $matchingPath, string $filePath) : bool { + /** @var string|false $realPathMatchingPath */ $realPathMatchingPath = \realpath($matchingPath); if (!\is_string($realPathMatchingPath)) { return \false; } + /** @var string|false $realpathFilePath */ $realpathFilePath = \realpath($filePath); if (!\is_string($realpathFilePath)) { return \false; diff --git a/vendor/rector/rector/packages/Testing/Fixture/FixtureSplitter.php b/vendor/rector/rector/packages/Testing/Fixture/FixtureSplitter.php index 5d225c67a..cf05aee84 100644 --- a/vendor/rector/rector/packages/Testing/Fixture/FixtureSplitter.php +++ b/vendor/rector/rector/packages/Testing/Fixture/FixtureSplitter.php @@ -4,35 +4,32 @@ namespace Rector\Testing\Fixture; use RectorPrefix202309\Nette\Utils\FileSystem; -use RectorPrefix202309\Nette\Utils\Strings; /** * @api */ final class FixtureSplitter { - /** - * @api - * @var string - * @see https://regex101.com/r/zZDoyy/1 - */ - public const SPLIT_LINE_REGEX = '#\\-\\-\\-\\-\\-\\r?\\n#'; public static function containsSplit(string $fixtureFileContent) : bool { - return Strings::match($fixtureFileContent, self::SPLIT_LINE_REGEX) !== null; + return \strpos($fixtureFileContent, "-----\n") !== \false || \strpos($fixtureFileContent, "-----\r\n") !== \false; } /** - * @return array + * @return array */ public static function split(string $filePath) : array { $fixtureFileContents = FileSystem::read($filePath); - return Strings::split($fixtureFileContents, self::SPLIT_LINE_REGEX); + return self::splitFixtureFileContents($fixtureFileContents); } /** - * @return array + * @return array */ public static function splitFixtureFileContents(string $fixtureFileContents) : array { - return Strings::split($fixtureFileContents, self::SPLIT_LINE_REGEX); + $posixContents = \explode("-----\n", $fixtureFileContents); + if (isset($posixContents[1])) { + return $posixContents; + } + return \explode("-----\r\n", $fixtureFileContents); } } diff --git a/vendor/rector/rector/packages/Testing/PHPUnit/AbstractRectorTestCase.php b/vendor/rector/rector/packages/Testing/PHPUnit/AbstractRectorTestCase.php index 4e305dc0d..d5f840fb3 100644 --- a/vendor/rector/rector/packages/Testing/PHPUnit/AbstractRectorTestCase.php +++ b/vendor/rector/rector/packages/Testing/PHPUnit/AbstractRectorTestCase.php @@ -7,6 +7,7 @@ use Iterator; use RectorPrefix202309\Nette\Utils\FileSystem; use RectorPrefix202309\Nette\Utils\Strings; +use PHPStan\Collectors\Collector; use PHPUnit\Framework\ExpectationFailedException; use Rector\Core\Application\ApplicationFileProcessor; use Rector\Core\Autoloading\AdditionalAutoloader; @@ -15,10 +16,11 @@ use Rector\Core\Configuration\Option; use Rector\Core\Configuration\Parameter\SimpleParameterProvider; use Rector\Core\Contract\DependencyInjection\ResetableInterface; +use Rector\Core\Contract\Rector\CollectorRectorInterface; use Rector\Core\Contract\Rector\RectorInterface; +use Rector\Core\DependencyInjection\Laravel\ContainerMemento; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\PhpParser\NodeTraverser\RectorNodeTraverser; -use Rector\Core\Provider\CurrentFileProvider; use Rector\Core\Rector\AbstractRector; use Rector\Core\Util\Reflection\PrivatesAccessor; use Rector\NodeTypeResolver\Reflection\BetterReflection\SourceLocatorProvider\DynamicSourceLocatorProvider; @@ -44,10 +46,6 @@ abstract class AbstractRectorTestCase extends \Rector\Testing\PHPUnit\AbstractLa * @var array */ private static $cacheByRuleAndConfig = []; - /** - * @var \Rector\Core\Provider\CurrentFileProvider - */ - private $currentFileProvider; /** * Restore default parameters */ @@ -59,6 +57,7 @@ public static function tearDownAfterClass() : void SimpleParameterProvider::setParameter(Option::IMPORT_SHORT_CLASSES, \true); SimpleParameterProvider::setParameter(Option::INDENT_CHAR, ' '); SimpleParameterProvider::setParameter(Option::INDENT_SIZE, 4); + SimpleParameterProvider::setParameter(Option::COLLECTORS, \false); } protected function setUp() : void { @@ -77,20 +76,23 @@ protected function setUp() : void /** @var ResetableInterface $resetable */ $resetable->reset(); } - $this->forgetRectorsRules(); + $this->forgetRectorsRulesAndCollectors(); $rectorConfig->resetRuleConfigurations(); // this has to be always empty, so we can add new rules with their configuration $this->assertEmpty($rectorConfig->tagged(RectorInterface::class)); + $this->assertEmpty($rectorConfig->tagged(CollectorRectorInterface::class)); + $this->assertEmpty($rectorConfig->tagged(Collector::class)); $this->bootFromConfigFiles([$configFile]); $rectorsGenerator = $rectorConfig->tagged(RectorInterface::class); if ($rectorsGenerator instanceof RewindableGenerator) { - $phpRectors = \iterator_to_array($rectorsGenerator->getIterator()); + $rectors = \iterator_to_array($rectorsGenerator->getIterator()); } else { // no rules at all, e.g. in case of only post rector run - $phpRectors = []; + $rectors = []; } + /** @var RectorNodeTraverser $rectorNodeTraverser */ $rectorNodeTraverser = $rectorConfig->make(RectorNodeTraverser::class); - $rectorNodeTraverser->refreshPhpRectors($phpRectors); + $rectorNodeTraverser->refreshPhpRectors($rectors); // store cache self::$cacheByRuleAndConfig[$cacheKey] = \true; } @@ -102,7 +104,6 @@ protected function setUp() : void /** @var BootstrapFilesIncluder $bootstrapFilesIncluder */ $bootstrapFilesIncluder = $this->make(BootstrapFilesIncluder::class); $bootstrapFilesIncluder->includeBootstrapFiles(); - $this->currentFileProvider = $this->make(CurrentFileProvider::class); } protected function tearDown() : void { @@ -144,21 +145,15 @@ protected function doTestFile(string $fixtureFilePath) : void FileSystem::write($inputFilePath, $inputFileContents); $this->doTestFileMatchesExpectedContent($inputFilePath, $expectedFileContents, $fixtureFilePath); } - protected function forgetRectorsRules() : void + protected function forgetRectorsRulesAndCollectors() : void { $rectorConfig = self::getContainer(); - // 1. forget instance first, then remove tags - $rectors = $rectorConfig->tagged(RectorInterface::class); - foreach ($rectors as $rector) { - $rectorConfig->offsetUnset(\get_class($rector)); - } - // 2. remove all tagged rules + // 1. forget tagged services + ContainerMemento::forgetTag($rectorConfig, RectorInterface::class); + ContainerMemento::forgetTag($rectorConfig, Collector::class); + ContainerMemento::forgetTag($rectorConfig, CollectorRectorInterface::class); + // 2. remove after binding too, to avoid setting configuration over and over again $privatesAccessor = new PrivatesAccessor(); - $privatesAccessor->propertyClosure($rectorConfig, 'tags', static function (array $tags) : array { - unset($tags[RectorInterface::class]); - return $tags; - }); - // 3. remove after binding too, to avoid setting configuration over and over again $privatesAccessor->propertyClosure($rectorConfig, 'afterResolvingCallbacks', static function (array $afterResolvingCallbacks) : array { foreach (\array_keys($afterResolvingCallbacks) as $key) { if ($key === AbstractRector::class) { @@ -188,8 +183,10 @@ private function includePreloadFilesAndScoperAutoload() : void private function doTestFileMatchesExpectedContent(string $originalFilePath, string $expectedFileContents, string $fixtureFilePath) : void { SimpleParameterProvider::setParameter(Option::SOURCE, [$originalFilePath]); + // the original file content must be loaded first + $originalFileContent = FileSystem::read($originalFilePath); + // the file is now changed (if any rule matches) $changedContent = $this->processFilePath($originalFilePath); - $originalFileContent = $this->currentFileProvider->getFile()->getOriginalFileContent(); $fixtureFilename = \basename($fixtureFilePath); $failureMessage = \sprintf('Failed on fixture file "%s"', $fixtureFilename); try { @@ -206,9 +203,17 @@ private function processFilePath(string $filePath) : string /** @var ConfigurationFactory $configurationFactory */ $configurationFactory = $this->make(ConfigurationFactory::class); $configuration = $configurationFactory->createForTests([$filePath]); - $this->applicationFileProcessor->processFiles([$filePath], $configuration); - $currentFile = $this->currentFileProvider->getFile(); - return $currentFile->getFileContent(); + $processResult = $this->applicationFileProcessor->processFiles([$filePath], $configuration); + if ($processResult->getCollectedData() !== [] && $configuration->isCollectors()) { + // second run with collected data + $configuration->setCollectedData($processResult->getCollectedData()); + $configuration->enableSecondRun(); + $rectorNodeTraverser = $this->make(RectorNodeTraverser::class); + $rectorNodeTraverser->prepareCollectorRectorsRun($configuration); + $this->applicationFileProcessor->processFiles([$filePath], $configuration); + } + // return changed file contents + return FileSystem::read($filePath); } private function createInputFilePath(string $fixtureFilePath) : string { diff --git a/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php b/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php index 380ebaa64..f215748b1 100644 --- a/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php +++ b/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodParamVendorLockResolver.php @@ -56,8 +56,6 @@ public function isVendorLocked(ClassMethod $classMethod) : bool if ($this->hasParentInterfaceMethod($classReflection, $methodName)) { return \true; } - /** @var string $methodName */ - $methodName = $this->nodeNameResolver->getName($classMethod); return $this->hasClassMethodLockMatchingFileName($classReflection, $methodName, '/vendor/'); } private function hasTraitMethodVendorLock(ClassReflection $classReflection, string $methodName) : bool diff --git a/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php b/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php index 51529ddb9..3b91a9475 100644 --- a/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php +++ b/vendor/rector/rector/packages/VendorLocker/NodeVendorLocker/ClassMethodReturnTypeOverrideGuard.php @@ -4,9 +4,7 @@ namespace Rector\VendorLocker\NodeVendorLocker; use PhpParser\Node; -use PhpParser\Node\Expr; use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Return_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\FunctionVariantWithPhpDocs; @@ -16,7 +14,6 @@ use Rector\Core\FileSystem\FilePathHelper; use Rector\Core\NodeAnalyzer\MagicClassMethodAnalyzer; use Rector\Core\PhpParser\AstResolver; -use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Reflection\ReflectionResolver; use Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer; use Rector\NodeNameResolver\NodeNameResolver; @@ -40,11 +37,6 @@ final class ClassMethodReturnTypeOverrideGuard * @var \Rector\FamilyTree\Reflection\FamilyRelationsAnalyzer */ private $familyRelationsAnalyzer; - /** - * @readonly - * @var \Rector\Core\PhpParser\Node\BetterNodeFinder - */ - private $betterNodeFinder; /** * @readonly * @var \Rector\Core\PhpParser\AstResolver @@ -79,12 +71,11 @@ final class ClassMethodReturnTypeOverrideGuard * @var array> */ private const CHAOTIC_CLASS_METHOD_NAMES = ['PhpParser\\NodeVisitor' => ['enterNode', 'leaveNode', 'beforeTraverse', 'afterTraverse']]; - public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, FamilyRelationsAnalyzer $familyRelationsAnalyzer, BetterNodeFinder $betterNodeFinder, AstResolver $astResolver, ReflectionResolver $reflectionResolver, ReturnTypeInferer $returnTypeInferer, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, FilePathHelper $filePathHelper, MagicClassMethodAnalyzer $magicClassMethodAnalyzer) + public function __construct(NodeNameResolver $nodeNameResolver, ReflectionProvider $reflectionProvider, FamilyRelationsAnalyzer $familyRelationsAnalyzer, AstResolver $astResolver, ReflectionResolver $reflectionResolver, ReturnTypeInferer $returnTypeInferer, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, FilePathHelper $filePathHelper, MagicClassMethodAnalyzer $magicClassMethodAnalyzer) { $this->nodeNameResolver = $nodeNameResolver; $this->reflectionProvider = $reflectionProvider; $this->familyRelationsAnalyzer = $familyRelationsAnalyzer; - $this->betterNodeFinder = $betterNodeFinder; $this->astResolver = $astResolver; $this->reflectionResolver = $reflectionResolver; $this->returnTypeInferer = $returnTypeInferer; @@ -125,10 +116,7 @@ public function shouldSkipClassMethod(ClassMethod $classMethod, Scope $scope) : if ($classMethod->returnType instanceof Node) { return \true; } - if ($this->shouldSkipHasChildHasReturnType($childrenClassReflections, $classMethod)) { - return \true; - } - return $this->hasClassMethodExprReturn($classMethod); + return $this->shouldSkipHasChildHasReturnType($childrenClassReflections, $classMethod); } private function isReturnTypeChangeAllowed(ClassMethod $classMethod, Scope $scope) : bool { @@ -176,6 +164,9 @@ private function isReturnTypeChangeAllowed(ClassMethod $classMethod, Scope $scop private function shouldSkipHasChildHasReturnType(array $childrenClassReflections, ClassMethod $classMethod) : bool { $returnType = $this->returnTypeInferer->inferFunctionLike($classMethod); + if (!$returnType->isVoid()->yes()) { + return \true; + } $methodName = $this->nodeNameResolver->getName($classMethod); foreach ($childrenClassReflections as $childClassReflection) { if (!$childClassReflection->hasNativeMethod($methodName)) { @@ -190,9 +181,6 @@ private function shouldSkipHasChildHasReturnType(array $childrenClassReflections return \true; } $childReturnType = $this->returnTypeInferer->inferFunctionLike($method); - if (!$returnType->isVoid()->yes()) { - continue; - } if ($childReturnType->isVoid()->yes()) { continue; } @@ -218,13 +206,4 @@ private function shouldSkipChaoticClassMethods(ClassMethod $classMethod) : bool } return \false; } - private function hasClassMethodExprReturn(ClassMethod $classMethod) : bool - { - return (bool) $this->betterNodeFinder->findFirst((array) $classMethod->stmts, static function (Node $node) : bool { - if (!$node instanceof Return_) { - return \false; - } - return $node->expr instanceof Expr; - }); - } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php index 43fca3ebd..d50732d1a 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/ClassMethod/InlineArrayReturnAssignRector.php @@ -15,6 +15,7 @@ use Rector\CodeQuality\NodeAnalyzer\VariableDimFetchAssignResolver; use Rector\CodeQuality\ValueObject\KeyAndExpr; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\Node\AttributeKey; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -29,9 +30,15 @@ final class InlineArrayReturnAssignRector extends AbstractRector * @var \Rector\CodeQuality\NodeAnalyzer\VariableDimFetchAssignResolver */ private $variableDimFetchAssignResolver; - public function __construct(VariableDimFetchAssignResolver $variableDimFetchAssignResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(VariableDimFetchAssignResolver $variableDimFetchAssignResolver, ValueResolver $valueResolver) { $this->variableDimFetchAssignResolver = $variableDimFetchAssignResolver; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php index eb91abd66..2f95d98a2 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Equal/UseIdenticalOverEqualWithSameTypeRector.php @@ -4,14 +4,12 @@ namespace Rector\CodeQuality\Rector\Equal; use PhpParser\Node; -use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\Equal; use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\BinaryOp\NotEqual; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; -use Rector\Core\NodeAnalyzer\ExprAnalyzer; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,15 +18,6 @@ */ final class UseIdenticalOverEqualWithSameTypeRector extends AbstractRector { - /** - * @readonly - * @var \Rector\Core\NodeAnalyzer\ExprAnalyzer - */ - private $exprAnalyzer; - public function __construct(ExprAnalyzer $exprAnalyzer) - { - $this->exprAnalyzer = $exprAnalyzer; - } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Use ===/!== over ==/!=, it values have the same type', [new CodeSample(<<<'CODE_SAMPLE' @@ -65,7 +54,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - $leftStaticType = $this->getType($node->left); + $leftStaticType = $this->nodeTypeResolver->getNativeType($node->left); // objects can be different by content if ($leftStaticType instanceof ObjectType) { return null; @@ -73,7 +62,7 @@ public function refactor(Node $node) : ?Node if ($leftStaticType instanceof MixedType) { return null; } - $rightStaticType = $this->getType($node->right); + $rightStaticType = $this->nodeTypeResolver->getNativeType($node->right); if ($rightStaticType instanceof MixedType) { return null; } @@ -81,19 +70,9 @@ public function refactor(Node $node) : ?Node if (!$leftStaticType->equals($rightStaticType)) { return null; } - if ($this->areNonTypedFromParam($node->left, $node->right)) { - return null; - } if ($node instanceof Equal) { return new Identical($node->left, $node->right); } return new NotIdentical($node->left, $node->right); } - private function areNonTypedFromParam(Expr $left, Expr $right) : bool - { - if ($this->exprAnalyzer->isNonTypedFromParam($left)) { - return \true; - } - return $this->exprAnalyzer->isNonTypedFromParam($right); - } } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php index c7a357437..a5513e4ac 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachItemsAssignToEmptyArrayToAssignRector.php @@ -14,6 +14,7 @@ use PhpParser\NodeTraverser; use Rector\CodeQuality\NodeAnalyzer\ForeachAnalyzer; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -27,9 +28,15 @@ final class ForeachItemsAssignToEmptyArrayToAssignRector extends AbstractRector * @var \Rector\CodeQuality\NodeAnalyzer\ForeachAnalyzer */ private $foreachAnalyzer; - public function __construct(ForeachAnalyzer $foreachAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ForeachAnalyzer $foreachAnalyzer, ValueResolver $valueResolver) { $this->foreachAnalyzer = $foreachAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php index c75e4ee8f..af7cbfc3c 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/ForeachToInArrayRector.php @@ -16,6 +16,7 @@ use PHPStan\Type\ObjectType; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeManipulator\BinaryOpManipulator; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Php71\ValueObject\TwoNodeMatch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -30,9 +31,15 @@ final class ForeachToInArrayRector extends AbstractRector * @var \Rector\Core\NodeManipulator\BinaryOpManipulator */ private $binaryOpManipulator; - public function __construct(BinaryOpManipulator $binaryOpManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(BinaryOpManipulator $binaryOpManipulator, ValueResolver $valueResolver) { $this->binaryOpManipulator = $binaryOpManipulator; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php index 0d9c52d0e..6353a60cf 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Foreach_/UnusedForeachValueToArrayKeysRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Foreach_; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\NodeAnalyzer\ExprUsedInNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -24,9 +25,15 @@ final class UnusedForeachValueToArrayKeysRector extends AbstractRector * @var \Rector\DeadCode\NodeAnalyzer\ExprUsedInNodeAnalyzer */ private $exprUsedInNodeAnalyzer; - public function __construct(ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ExprUsedInNodeAnalyzer $exprUsedInNodeAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->exprUsedInNodeAnalyzer = $exprUsedInNodeAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/IntvalToTypeCastRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/IntvalToTypeCastRector.php index 6204a6e46..351239e3a 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/IntvalToTypeCastRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/IntvalToTypeCastRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\Cast\Int_; use PhpParser\Node\Expr\FuncCall; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,6 +18,15 @@ */ final class IntvalToTypeCastRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change intval() to faster and readable (int) $value', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php index 69b7cdbe5..56f1545bd 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FuncCall/SetTypeToCastRector.php @@ -18,6 +18,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Stmt\Expression; use PhpParser\NodeTraverser; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -28,6 +29,11 @@ */ final class SetTypeToCastRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var array> */ @@ -36,6 +42,10 @@ final class SetTypeToCastRector extends AbstractRector * @var string */ private const IS_ARG_VALUE_ITEM_SET_TYPE = 'is_arg_value_item_set_type'; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes settype() to (type) where possible', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php index e64530a01..1ab68559b 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/FunctionLike/SimplifyUselessVariableRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; use PHPStan\Type\MixedType; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeAnalyzer\CallAnalyzer; use Rector\Core\NodeAnalyzer\VariableAnalyzer; @@ -40,11 +41,17 @@ final class SimplifyUselessVariableRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\CallAnalyzer */ private $callAnalyzer; - public function __construct(AssignAndBinaryMap $assignAndBinaryMap, VariableAnalyzer $variableAnalyzer, CallAnalyzer $callAnalyzer) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(AssignAndBinaryMap $assignAndBinaryMap, VariableAnalyzer $variableAnalyzer, CallAnalyzer $callAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->assignAndBinaryMap = $assignAndBinaryMap; $this->variableAnalyzer = $variableAnalyzer; $this->callAnalyzer = $callAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php index c51f7f41a..518e5916f 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/FlipTypeControlToUseExclusiveTypeRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Name\FullyQualified; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\StaticTypeMapper\ValueObject\Type\ShortenedObjectType; use Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer; @@ -26,9 +27,15 @@ final class FlipTypeControlToUseExclusiveTypeRector extends AbstractRector * @var \Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer */ private $nullableTypeAnalyzer; - public function __construct(NullableTypeAnalyzer $nullableTypeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(NullableTypeAnalyzer $nullableTypeAnalyzer, ValueResolver $valueResolver) { $this->nullableTypeAnalyzer = $nullableTypeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/GetClassToInstanceOfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/GetClassToInstanceOfRector.php index de4aaf62c..2ece869df 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/GetClassToInstanceOfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/GetClassToInstanceOfRector.php @@ -15,6 +15,7 @@ use PhpParser\Node\Scalar\String_; use Rector\Core\Enum\ObjectReference; use Rector\Core\NodeManipulator\BinaryOpManipulator; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Php71\ValueObject\TwoNodeMatch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -29,13 +30,19 @@ final class GetClassToInstanceOfRector extends AbstractRector * @var \Rector\Core\NodeManipulator\BinaryOpManipulator */ private $binaryOpManipulator; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var string[] */ private const NO_NAMESPACED_CLASSNAMES = ['self', 'static']; - public function __construct(BinaryOpManipulator $binaryOpManipulator) + public function __construct(BinaryOpManipulator $binaryOpManipulator, ValueResolver $valueResolver) { $this->binaryOpManipulator = $binaryOpManipulator; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php index 2b9f42079..487bb8d0e 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyArraySearchRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; use Rector\Core\NodeManipulator\BinaryOpManipulator; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Php71\ValueObject\TwoNodeMatch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -24,9 +25,15 @@ final class SimplifyArraySearchRector extends AbstractRector * @var \Rector\Core\NodeManipulator\BinaryOpManipulator */ private $binaryOpManipulator; - public function __construct(BinaryOpManipulator $binaryOpManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(BinaryOpManipulator $binaryOpManipulator, ValueResolver $valueResolver) { $this->binaryOpManipulator = $binaryOpManipulator; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php index 2fe5c9644..5e87d3efa 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyBoolIdenticalTrueRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\BooleanNot; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,6 +17,15 @@ */ final class SimplifyBoolIdenticalTrueRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Simplify bool value compare to true or false', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php index 05dd89616..9c82245e6 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/SimplifyConditionsRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Expr\BooleanNot; use Rector\Core\NodeManipulator\BinaryOpManipulator; use Rector\Core\PhpParser\Node\AssignAndBinaryMap; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Php71\ValueObject\TwoNodeMatch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -31,10 +32,16 @@ final class SimplifyConditionsRector extends AbstractRector * @var \Rector\Core\NodeManipulator\BinaryOpManipulator */ private $binaryOpManipulator; - public function __construct(AssignAndBinaryMap $assignAndBinaryMap, BinaryOpManipulator $binaryOpManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(AssignAndBinaryMap $assignAndBinaryMap, BinaryOpManipulator $binaryOpManipulator, ValueResolver $valueResolver) { $this->assignAndBinaryMap = $assignAndBinaryMap; $this->binaryOpManipulator = $binaryOpManipulator; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php index 89b899fed..1d8f99bd1 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Identical/StrlenZeroToIdenticalEmptyStringRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Scalar\String_; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,6 +17,15 @@ */ final class StrlenZeroToIdenticalEmptyStringRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes strlen comparison to 0 to direct empty string compare', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php index 1d981a60f..de6f80590 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/CombineIfRector.php @@ -10,6 +10,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use Rector\BetterPhpDocParser\Comment\CommentsMerger; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -23,9 +24,15 @@ final class CombineIfRector extends AbstractRector * @var \Rector\BetterPhpDocParser\Comment\CommentsMerger */ private $commentsMerger; - public function __construct(CommentsMerger $commentsMerger) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(CommentsMerger $commentsMerger, PhpDocInfoFactory $phpDocInfoFactory) { $this->commentsMerger = $commentsMerger; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php index 74d6ef8ec..d70ba66b4 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ConsecutiveNullCompareReturnsToNullCoalesceQueueRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\Throw_; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeManipulator\IfManipulator; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -28,9 +29,15 @@ final class ConsecutiveNullCompareReturnsToNullCoalesceQueueRector extends Abstr * @var \Rector\Core\NodeManipulator\IfManipulator */ private $ifManipulator; - public function __construct(IfManipulator $ifManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(IfManipulator $ifManipulator, ValueResolver $valueResolver) { $this->ifManipulator = $ifManipulator; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php index 7486a5548..b671b2ea1 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/ExplicitBoolCompareRector.php @@ -23,6 +23,7 @@ use PhpParser\Node\Stmt\ElseIf_; use PhpParser\Node\Stmt\If_; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\TypeAnalyzer\ArrayTypeAnalyzer; use Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer; @@ -46,10 +47,16 @@ final class ExplicitBoolCompareRector extends AbstractRector * @var \Rector\NodeTypeResolver\TypeAnalyzer\ArrayTypeAnalyzer */ private $arrayTypeAnalyzer; - public function __construct(StringTypeAnalyzer $stringTypeAnalyzer, ArrayTypeAnalyzer $arrayTypeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(StringTypeAnalyzer $stringTypeAnalyzer, ArrayTypeAnalyzer $arrayTypeAnalyzer, ValueResolver $valueResolver) { $this->stringTypeAnalyzer = $stringTypeAnalyzer; $this->arrayTypeAnalyzer = $arrayTypeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php index ccf2ac470..18a41e85c 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfElseToTernaryRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Stmt\Else_; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\Printer\BetterStandardPrinter; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -25,13 +26,19 @@ final class SimplifyIfElseToTernaryRector extends AbstractRector * @var \Rector\Core\PhpParser\Printer\BetterStandardPrinter */ private $betterStandardPrinter; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var int */ private const LINE_LENGTH_LIMIT = 120; - public function __construct(BetterStandardPrinter $betterStandardPrinter) + public function __construct(BetterStandardPrinter $betterStandardPrinter, BetterNodeFinder $betterNodeFinder) { $this->betterStandardPrinter = $betterStandardPrinter; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php index a43c751fa..0b01304ac 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNotNullReturnRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Stmt\Return_; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeManipulator\IfManipulator; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -22,9 +23,15 @@ final class SimplifyIfNotNullReturnRector extends AbstractRector * @var \Rector\Core\NodeManipulator\IfManipulator */ private $ifManipulator; - public function __construct(IfManipulator $ifManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(IfManipulator $ifManipulator, ValueResolver $valueResolver) { $this->ifManipulator = $ifManipulator; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php index 48bf823c4..21a68534a 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfNullableReturnRector.php @@ -20,6 +20,7 @@ use Rector\CodeQuality\TypeResolver\AssignVariableTypeResolver; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeManipulator\IfManipulator; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover; use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; @@ -45,11 +46,17 @@ final class SimplifyIfNullableReturnRector extends AbstractRector * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ private $varTagRemover; - public function __construct(IfManipulator $ifManipulator, AssignVariableTypeResolver $assignVariableTypeResolver, VarTagRemover $varTagRemover) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(IfManipulator $ifManipulator, AssignVariableTypeResolver $assignVariableTypeResolver, VarTagRemover $varTagRemover, ValueResolver $valueResolver) { $this->ifManipulator = $ifManipulator; $this->assignVariableTypeResolver = $assignVariableTypeResolver; $this->varTagRemover = $varTagRemover; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { @@ -58,14 +65,16 @@ class SomeClass { public function run() { - /** @var \stdClass|null $value */ - $value = $this->foo->bar(); + $value = $this->get(); if (! $value instanceof \stdClass) { return null; } return $value; } + + public function get(): ?stdClass { + } } CODE_SAMPLE , <<<'CODE_SAMPLE' @@ -73,7 +82,10 @@ class SomeClass { public function run() { - return $this->foo->bar(); + return $this->get(); + } + + public function get(): ?stdClass { } } CODE_SAMPLE diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php index 3a1eb28b3..1f7accbc5 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/If_/SimplifyIfReturnBoolRector.php @@ -14,6 +14,7 @@ use Rector\BetterPhpDocParser\Comment\CommentsMerger; use Rector\CodeQuality\NodeManipulator\ExprBoolCaster; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\PhpParser\Printer\BetterStandardPrinter; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -38,11 +39,17 @@ final class SimplifyIfReturnBoolRector extends AbstractRector * @var \Rector\Core\PhpParser\Printer\BetterStandardPrinter */ private $betterStandardPrinter; - public function __construct(CommentsMerger $commentsMerger, ExprBoolCaster $exprBoolCaster, BetterStandardPrinter $betterStandardPrinter) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(CommentsMerger $commentsMerger, ExprBoolCaster $exprBoolCaster, BetterStandardPrinter $betterStandardPrinter, ValueResolver $valueResolver) { $this->commentsMerger = $commentsMerger; $this->exprBoolCaster = $exprBoolCaster; $this->betterStandardPrinter = $betterStandardPrinter; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php index 9af4c4e72..70c8fd5cc 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Include_/AbsolutizeRequireAndIncludePathRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\Include_; use PhpParser\Node\Scalar\MagicConst\Dir; use PhpParser\Node\Scalar\String_; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,6 +20,15 @@ */ final class AbsolutizeRequireAndIncludePathRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('include/require to absolute path. This Rector might introduce backwards incompatible code, when the include/require being changed depends on the current working directory.', [new CodeSample(<<<'CODE_SAMPLE' @@ -81,11 +91,7 @@ public function refactor(Node $node) : ?Node return null; } // add preslash to string - if (\strncmp($includeValue, './', \strlen('./')) === 0) { - $node->expr->value = Strings::substring($includeValue, 1); - } else { - $node->expr->value = '/' . $includeValue; - } + $node->expr->value = \strncmp($includeValue, './', \strlen('./')) === 0 ? Strings::substring($includeValue, 1) : '/' . $includeValue; $node->expr = $this->prefixWithDirConstant($node->expr); return $node; } diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php index b0b45972a..fb90c7691 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Isset_/IssetOnPropertyObjectToPropertyExistsRector.php @@ -19,6 +19,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\TypeCombinator; use PHPStan\Type\TypeWithClassName; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -40,10 +41,16 @@ final class IssetOnPropertyObjectToPropertyExistsRector extends AbstractRector * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; - public function __construct(ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, ValueResolver $valueResolver) { $this->reflectionProvider = $reflectionProvider; $this->reflectionResolver = $reflectionResolver; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php index 9c3da12a2..3cfae2d20 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Switch_/SwitchTrueToIfRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Switch_; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,6 +19,15 @@ */ final class SwitchTrueToIfRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change switch (true) to if statements', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php index 70f81ff06..865902978 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/ArrayKeyExistsTernaryThenValueToCoalescingRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\BinaryOp\Coalesce; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,6 +20,15 @@ */ final class ArrayKeyExistsTernaryThenValueToCoalescingRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change array_key_exists() ternary to coalescing', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php index 94444da9c..2806c14c7 100644 --- a/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php +++ b/vendor/rector/rector/rules/CodeQuality/Rector/Ternary/UnnecessaryTernaryExpressionRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\Cast\Bool_; use PhpParser\Node\Expr\Ternary; use Rector\Core\PhpParser\Node\AssignAndBinaryMap; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -23,9 +24,15 @@ final class UnnecessaryTernaryExpressionRector extends AbstractRector * @var \Rector\Core\PhpParser\Node\AssignAndBinaryMap */ private $assignAndBinaryMap; - public function __construct(AssignAndBinaryMap $assignAndBinaryMap) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(AssignAndBinaryMap $assignAndBinaryMap, ValueResolver $valueResolver) { $this->assignAndBinaryMap = $assignAndBinaryMap; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php index d2e67af8a..c3e46b816 100644 --- a/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php +++ b/vendor/rector/rector/rules/CodingStyle/ClassNameImport/ShortNameResolver.php @@ -18,6 +18,7 @@ use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\CodingStyle\NodeAnalyzer\UseImportNameMatcher; use Rector\Core\PhpParser\Node\BetterNodeFinder; +use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\Core\Util\StringUtils; use Rector\Core\ValueObject\Application\File; use Rector\NodeNameResolver\NodeNameResolver; @@ -98,9 +99,9 @@ public function resolveFromFile(File $file) : array public function resolveShortClassLikeNames(File $file) : array { $newStmts = $file->getNewStmts(); - /** @var Namespace_[] $namespaces */ + /** @var Namespace_[]|FileWithoutNamespace[] $namespaces */ $namespaces = \array_filter($newStmts, static function (Stmt $stmt) : bool { - return $stmt instanceof Namespace_; + return $stmt instanceof Namespace_ || $stmt instanceof FileWithoutNamespace; }); if (\count($namespaces) !== 1) { // only handle single namespace nodes @@ -108,7 +109,7 @@ public function resolveShortClassLikeNames(File $file) : array } $namespace = \current($namespaces); /** @var ClassLike[] $classLikes */ - $classLikes = $this->betterNodeFinder->findInstanceOf($namespace, ClassLike::class); + $classLikes = $this->betterNodeFinder->findInstanceOf($namespace->stmts, ClassLike::class); $shortClassLikeNames = []; foreach ($classLikes as $classLike) { $shortClassLikeNames[] = $this->nodeNameResolver->getShortName($classLike); diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/DataProviderArrayItemsNewlinedRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/DataProviderArrayItemsNewlinedRector.php index f29ea0f10..e3376c467 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/DataProviderArrayItemsNewlinedRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/DataProviderArrayItemsNewlinedRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr\Array_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; @@ -22,9 +23,15 @@ final class DataProviderArrayItemsNewlinedRector extends AbstractRector * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ private $testsNodeAnalyzer; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php index e18d42d8d..adb15d97d 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/ClassMethod/FuncGetArgsToVariadicParamRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -25,6 +26,15 @@ */ final class FuncGetArgsToVariadicParamRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(BetterNodeFinder $betterNodeFinder) + { + $this->betterNodeFinder = $betterNodeFinder; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Refactor func_get_args() in to a variadic param', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Class_/AddArrayDefaultToArrayPropertyRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Class_/AddArrayDefaultToArrayPropertyRector.php index 4366b4829..5bd79eea4 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Class_/AddArrayDefaultToArrayPropertyRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Class_/AddArrayDefaultToArrayPropertyRector.php @@ -15,8 +15,11 @@ use PhpParser\Node\Stmt\Property; use PhpParser\Node\Stmt\PropertyProperty; use PHPStan\Type\Type; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\CodingStyle\TypeAnalyzer\IterableTypeAnalyzer; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; +use Rector\Core\PhpParser\Node\BetterNodeFinder; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Privatization\NodeManipulator\VisibilityManipulator; use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector; @@ -48,12 +51,30 @@ final class AddArrayDefaultToArrayPropertyRector extends AbstractRector * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ private $constructorAssignDetector; - public function __construct(PropertyFetchAnalyzer $propertyFetchAnalyzer, IterableTypeAnalyzer $iterableTypeAnalyzer, VisibilityManipulator $visibilityManipulator, ConstructorAssignDetector $constructorAssignDetector) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(PropertyFetchAnalyzer $propertyFetchAnalyzer, IterableTypeAnalyzer $iterableTypeAnalyzer, VisibilityManipulator $visibilityManipulator, ConstructorAssignDetector $constructorAssignDetector, PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder) { $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; $this->iterableTypeAnalyzer = $iterableTypeAnalyzer; $this->visibilityManipulator = $visibilityManipulator; $this->constructorAssignDetector = $constructorAssignDetector; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->valueResolver = $valueResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php index 410836c53..7a27185e3 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/FuncCall/CallUserFuncArrayToVariadicRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use Rector\CodingStyle\NodeFactory\ArrayCallableToMethodCallFactory; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -29,9 +30,15 @@ final class CallUserFuncArrayToVariadicRector extends AbstractRector implements * @var \Rector\CodingStyle\NodeFactory\ArrayCallableToMethodCallFactory */ private $arrayCallableToMethodCallFactory; - public function __construct(ArrayCallableToMethodCallFactory $arrayCallableToMethodCallFactory) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ArrayCallableToMethodCallFactory $arrayCallableToMethodCallFactory, ValueResolver $valueResolver) { $this->arrayCallableToMethodCallFactory = $arrayCallableToMethodCallFactory; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/CodingStyle/Rector/Switch_/BinarySwitchToIfElseRector.php b/vendor/rector/rector/rules/CodingStyle/Rector/Switch_/BinarySwitchToIfElseRector.php index 9e7c345e6..8b1b1e49a 100644 --- a/vendor/rector/rector/rules/CodingStyle/Rector/Switch_/BinarySwitchToIfElseRector.php +++ b/vendor/rector/rector/rules/CodingStyle/Rector/Switch_/BinarySwitchToIfElseRector.php @@ -4,39 +4,15 @@ namespace Rector\CodingStyle\Rector\Switch_; use PhpParser\Node; -use PhpParser\Node\Expr; -use PhpParser\Node\Expr\BinaryOp\BooleanOr; -use PhpParser\Node\Expr\BinaryOp\Equal; -use PhpParser\Node\Stmt\Case_; -use PhpParser\Node\Stmt\Else_; -use PhpParser\Node\Stmt\ElseIf_; -use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Switch_; -use Rector\Core\NodeAnalyzer\ExprAnalyzer; use Rector\Core\Rector\AbstractRector; -use Rector\Renaming\NodeManipulator\SwitchManipulator; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\CodingStyle\Rector\Switch_\BinarySwitchToIfElseRector\BinarySwitchToIfElseRectorTest + * @deprecated This rule is deprecated as prevents refactoring to match (), use PHPStan, manual handling and PHP 8.0 upgrade set instead */ final class BinarySwitchToIfElseRector extends AbstractRector { - /** - * @readonly - * @var \Rector\Renaming\NodeManipulator\SwitchManipulator - */ - private $switchManipulator; - /** - * @readonly - * @var \Rector\Core\NodeAnalyzer\ExprAnalyzer - */ - private $exprAnalyzer; - public function __construct(SwitchManipulator $switchManipulator, ExprAnalyzer $exprAnalyzer) - { - $this->switchManipulator = $switchManipulator; - $this->exprAnalyzer = $exprAnalyzer; - } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes switch with 2 options to if-else', [new CodeSample(<<<'CODE_SAMPLE' @@ -70,42 +46,7 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - if ($node->cases === [] || \count($node->cases) > 2) { - return null; - } - // avoid removal of cases if it goes to be skipped next - $cases = $node->cases; - /** @var Case_ $firstCase */ - $firstCase = \array_shift($cases); - if (!$firstCase->cond instanceof Expr) { - return null; - } - if ($this->exprAnalyzer->isDynamicExpr($firstCase->cond)) { - return null; - } - $secondCase = \array_shift($cases); - // special case with empty first case → || - $isFirstCaseEmpty = $firstCase->stmts === []; - if ($isFirstCaseEmpty && $secondCase instanceof Case_ && $secondCase->cond instanceof Expr) { - $else = new BooleanOr(new Equal($node->cond, $firstCase->cond), new Equal($node->cond, $secondCase->cond)); - $ifNode = new If_($else); - $ifNode->stmts = $this->switchManipulator->removeBreakNodes($secondCase->stmts); - return $ifNode; - } - $ifNode = new If_(new Equal($node->cond, $firstCase->cond)); - $ifNode->stmts = $this->switchManipulator->removeBreakNodes($firstCase->stmts); - // just one condition - if (!$secondCase instanceof Case_) { - return $ifNode; - } - if ($secondCase->cond instanceof Expr) { - // has condition - $equal = new Equal($node->cond, $secondCase->cond); - $ifNode->elseifs[] = new ElseIf_($equal, $this->switchManipulator->removeBreakNodes($secondCase->stmts)); - } else { - // defaults - $ifNode->else = new Else_($this->switchManipulator->removeBreakNodes($secondCase->stmts)); - } - return $ifNode; + \trigger_error(\sprintf('The "%s" rule is deprecated as prevents refactoring to match (), use PHPStan, manual handling and PHP 8.0 upgrade set instead.', self::class), \E_USER_ERROR); + return null; } } diff --git a/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php b/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php index de591e02d..40bfeeb74 100644 --- a/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php +++ b/vendor/rector/rector/rules/DeadCode/NodeManipulator/ControllerClassMethodManipulator.php @@ -26,20 +26,16 @@ public function __construct(NodeNameResolver $nodeNameResolver, PhpDocInfoFactor $this->nodeNameResolver = $nodeNameResolver; $this->phpDocInfoFactory = $phpDocInfoFactory; } - public function isControllerClassMethodWithBehaviorAnnotation(Class_ $class, ClassMethod $classMethod) : bool + public function isControllerClassMethod(Class_ $class, ClassMethod $classMethod) : bool { - if (!$this->isControllerClassMethod($class, $classMethod)) { + if (!$classMethod->isPublic()) { return \false; } - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); - return $phpDocInfo->hasByType(GenericTagValueNode::class); - } - private function isControllerClassMethod(Class_ $class, ClassMethod $classMethod) : bool - { - if (!$classMethod->isPublic()) { + if (!$this->hasParentClassController($class)) { return \false; } - return $this->hasParentClassController($class); + $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($classMethod); + return $phpDocInfo->hasByType(GenericTagValueNode::class); } private function hasParentClassController(Class_ $class) : bool { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php index 069e4e340..fe7f64f0f 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveDoubleAssignRector.php @@ -16,6 +16,7 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Namespace_; use PHPStan\Analyser\Scope; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; @@ -31,9 +32,15 @@ final class RemoveDoubleAssignRector extends AbstractScopeAwareRector * @var \Rector\DeadCode\SideEffect\SideEffectNodeDetector */ private $sideEffectNodeDetector; - public function __construct(SideEffectNodeDetector $sideEffectNodeDetector) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(SideEffectNodeDetector $sideEffectNodeDetector, BetterNodeFinder $betterNodeFinder) { $this->sideEffectNodeDetector = $sideEffectNodeDetector; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php index 737c9e231..730d41fa6 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Assign/RemoveUnusedVariableAssignRector.php @@ -17,6 +17,7 @@ use PHPStan\Analyser\Scope; use Rector\Core\NodeAnalyzer\VariableAnalyzer; use Rector\Core\Php\ReservedKeywordAnalyzer; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\DeadCode\SideEffect\SideEffectNodeDetector; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -42,11 +43,17 @@ final class RemoveUnusedVariableAssignRector extends AbstractScopeAwareRector * @var \Rector\Core\NodeAnalyzer\VariableAnalyzer */ private $variableAnalyzer; - public function __construct(ReservedKeywordAnalyzer $reservedKeywordAnalyzer, SideEffectNodeDetector $sideEffectNodeDetector, VariableAnalyzer $variableAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ReservedKeywordAnalyzer $reservedKeywordAnalyzer, SideEffectNodeDetector $sideEffectNodeDetector, VariableAnalyzer $variableAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->reservedKeywordAnalyzer = $reservedKeywordAnalyzer; $this->sideEffectNodeDetector = $sideEffectNodeDetector; $this->variableAnalyzer = $variableAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php b/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php index 46a692505..937753fc1 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/BooleanAnd/RemoveAndTrueRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -14,6 +15,15 @@ */ final class RemoveAndTrueRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove and true that has no added value', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php index f25f4d5a9..cb7cafdba 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Cast/RecastingRemovalRector.php @@ -13,7 +13,6 @@ use PhpParser\Node\Expr\Cast\Object_; use PhpParser\Node\Expr\Cast\String_; use PhpParser\Node\Expr\MethodCall; -use PhpParser\Node\Expr\PropertyFetch; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt\ClassMethod; @@ -136,7 +135,6 @@ private function shouldSkip(Expr $expr) : bool if (!$this->propertyFetchAnalyzer->isPropertyFetch($expr)) { return $this->exprAnalyzer->isNonTypedFromParam($expr); } - /** @var PropertyFetch|StaticPropertyFetch $expr */ $phpPropertyReflection = $this->reflectionResolver->resolvePropertyReflectionFromPropertyFetch($expr); if (!$phpPropertyReflection instanceof PhpPropertyReflection) { $propertyType = $expr instanceof StaticPropertyFetch ? $this->nodeTypeResolver->getType($expr->class) : $this->nodeTypeResolver->getType($expr->var); diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php index 6ea7a0e80..ad5dd95ed 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassLike/RemoveAnnotationRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; @@ -32,14 +33,20 @@ final class RemoveAnnotationRector extends AbstractRector implements Configurabl * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var string[] */ private $annotationsToRemove = []; - public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) + public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php index 59a88a878..4350514f5 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveEmptyClassMethodRector.php @@ -7,6 +7,9 @@ use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use PHPStan\PhpDocParser\Ast\PhpDoc\DeprecatedTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\NodeAnalyzer\ParamAnalyzer; use Rector\Core\NodeManipulator\ClassMethodManipulator; use Rector\Core\Rector\AbstractRector; @@ -34,11 +37,17 @@ final class RemoveEmptyClassMethodRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\ParamAnalyzer */ private $paramAnalyzer; - public function __construct(ClassMethodManipulator $classMethodManipulator, ControllerClassMethodManipulator $controllerClassMethodManipulator, ParamAnalyzer $paramAnalyzer) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(ClassMethodManipulator $classMethodManipulator, ControllerClassMethodManipulator $controllerClassMethodManipulator, ParamAnalyzer $paramAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->classMethodManipulator = $classMethodManipulator; $this->controllerClassMethodManipulator = $controllerClassMethodManipulator; $this->paramAnalyzer = $paramAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -121,12 +130,24 @@ private function shouldSkipClassMethod(Class_ $class, ClassMethod $classMethod) if ($this->paramAnalyzer->hasPropertyPromotion($classMethod->params)) { return \true; } - if ($this->controllerClassMethodManipulator->isControllerClassMethodWithBehaviorAnnotation($class, $classMethod)) { + if ($this->hasDeprecatedAnnotation($classMethod)) { + return \true; + } + if ($this->controllerClassMethodManipulator->isControllerClassMethod($class, $classMethod)) { return \true; } if ($this->nodeNameResolver->isName($classMethod, MethodName::CONSTRUCT)) { + // has parent class? return $class->extends instanceof FullyQualified; } return $this->nodeNameResolver->isName($classMethod, MethodName::INVOKE); } + private function hasDeprecatedAnnotation(ClassMethod $classMethod) : bool + { + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($classMethod); + if (!$phpDocInfo instanceof PhpDocInfo) { + return \false; + } + return $phpDocInfo->hasByType(DeprecatedTagValueNode::class); + } } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php index 2eda60869..cf6cb5233 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodParameterRector.php @@ -10,8 +10,10 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\NodeCollector\UnusedParameterResolver; use Rector\DeadCode\NodeManipulator\VariadicFunctionLikeDetector; @@ -42,12 +44,24 @@ final class RemoveUnusedPrivateMethodParameterRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(VariadicFunctionLikeDetector $variadicFunctionLikeDetector, UnusedParameterResolver $unusedParameterResolver, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(VariadicFunctionLikeDetector $variadicFunctionLikeDetector, UnusedParameterResolver $unusedParameterResolver, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder) { $this->variadicFunctionLikeDetector = $variadicFunctionLikeDetector; $this->unusedParameterResolver = $unusedParameterResolver; $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php index 2d229782b..2cdde02a7 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPrivateMethodRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\MethodName; @@ -31,10 +32,16 @@ final class RemoveUnusedPrivateMethodRector extends AbstractScopeAwareRector * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; - public function __construct(IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, ReflectionResolver $reflectionResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(IsClassMethodUsedAnalyzer $isClassMethodUsedAnalyzer, ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder) { $this->isClassMethodUsedAnalyzer = $isClassMethodUsedAnalyzer; $this->reflectionResolver = $reflectionResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php index 385ba1b03..dedc24705 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUnusedPromotedPropertyRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\TraitUse; use PHPStan\Analyser\Scope; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\NodeFinder\PropertyFetchFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\MethodName; @@ -39,11 +40,17 @@ final class RemoveUnusedPromotedPropertyRector extends AbstractScopeAwareRector * @var \Rector\DeadCode\NodeAnalyzer\PropertyWriteonlyAnalyzer */ private $propertyWriteonlyAnalyzer; - public function __construct(PropertyFetchFinder $propertyFetchFinder, VisibilityManipulator $visibilityManipulator, PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(PropertyFetchFinder $propertyFetchFinder, VisibilityManipulator $visibilityManipulator, PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->propertyFetchFinder = $propertyFetchFinder; $this->visibilityManipulator = $visibilityManipulator; $this->propertyWriteonlyAnalyzer = $propertyWriteonlyAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php index 9ac32ce99..eb35dda83 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessParamTagRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\PhpDoc\TagRemover\ParamTagRemover; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -20,9 +21,15 @@ final class RemoveUselessParamTagRector extends AbstractRector * @var \Rector\DeadCode\PhpDoc\TagRemover\ParamTagRemover */ private $paramTagRemover; - public function __construct(ParamTagRemover $paramTagRemover) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(ParamTagRemover $paramTagRemover, PhpDocInfoFactory $phpDocInfoFactory) { $this->paramTagRemover = $paramTagRemover; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php index dfb54ddbf..ff6e52452 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/ClassMethod/RemoveUselessReturnTagRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\PhpDoc\TagRemover\ReturnTagRemover; @@ -25,10 +26,16 @@ final class RemoveUselessReturnTagRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(ReturnTagRemover $returnTagRemover, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(ReturnTagRemover $returnTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->returnTagRemover = $returnTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php index 9789b0c1b..bea76652d 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Expression/RemoveDeadStmtRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\Nop; use PhpParser\NodeTraverser; use PHPStan\Reflection\Php\PhpPropertyReflection; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; @@ -37,11 +38,17 @@ final class RemoveDeadStmtRector extends AbstractRector * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; - public function __construct(LivingCodeManipulator $livingCodeManipulator, PropertyFetchAnalyzer $propertyFetchAnalyzer, ReflectionResolver $reflectionResolver) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(LivingCodeManipulator $livingCodeManipulator, PropertyFetchAnalyzer $propertyFetchAnalyzer, ReflectionResolver $reflectionResolver, PhpDocInfoFactory $phpDocInfoFactory) { $this->livingCodeManipulator = $livingCodeManipulator; $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; $this->reflectionResolver = $reflectionResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php index 122b4bf68..26c59e7a4 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/For_/RemoveDeadIfForeachForRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\Foreach_; use PhpParser\Node\Stmt\If_; use PhpParser\NodeTraverser; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\EarlyReturn\NodeTransformer\ConditionInverter; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -26,9 +27,15 @@ final class RemoveDeadIfForeachForRector extends AbstractRector * @var \Rector\EarlyReturn\NodeTransformer\ConditionInverter */ private $conditionInverter; - public function __construct(ConditionInverter $conditionInverter) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ConditionInverter $conditionInverter, BetterNodeFinder $betterNodeFinder) { $this->conditionInverter = $conditionInverter; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php index 4d5944eb0..37d66bae9 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Foreach_/RemoveUnusedForeachKeyRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Stmt\Foreach_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -14,6 +15,15 @@ */ final class RemoveUnusedForeachKeyRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(BetterNodeFinder $betterNodeFinder) + { + $this->betterNodeFinder = $betterNodeFinder; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove unused key in foreach', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php index bd193543e..f7be66c3a 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/If_/RemoveAlwaysTrueIfConditionRector.php @@ -16,6 +16,7 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Type\Constant\ConstantBooleanType; use Rector\Core\NodeAnalyzer\ExprAnalyzer; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -35,10 +36,16 @@ final class RemoveAlwaysTrueIfConditionRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\ExprAnalyzer */ private $exprAnalyzer; - public function __construct(ReflectionResolver $reflectionResolver, ExprAnalyzer $exprAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ReflectionResolver $reflectionResolver, ExprAnalyzer $exprAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->reflectionResolver = $reflectionResolver; $this->exprAnalyzer = $exprAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php index 957103248..f4f2d8d9c 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Node/RemoveNonExistingVarAnnotationRector.php @@ -21,9 +21,12 @@ use PhpParser\Node\Stmt\While_; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeManipulator\StmtsManipulator; +use Rector\Core\PhpParser\Node\BetterNodeFinder; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -44,14 +47,32 @@ final class RemoveNonExistingVarAnnotationRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var array> */ private const NODE_TYPES = [Foreach_::class, Static_::class, Echo_::class, Return_::class, Expression::class, Throw_::class, If_::class, While_::class, Switch_::class, Nop::class]; - public function __construct(StmtsManipulator $stmtsManipulator, DocBlockUpdater $docBlockUpdater) + public function __construct(StmtsManipulator $stmtsManipulator, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder) { $this->stmtsManipulator = $stmtsManipulator; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->valueResolver = $valueResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php index 8b05c4fd4..f7bb8594e 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Plus/RemoveDeadZeroAndOneOperationRector.php @@ -15,7 +15,9 @@ use PhpParser\Node\Expr\BinaryOp\Minus; use PhpParser\Node\Expr\BinaryOp\Mul; use PhpParser\Node\Expr\BinaryOp\Plus; +use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\UnaryMinus; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,6 +28,15 @@ */ final class RemoveDeadZeroAndOneOperationRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Remove operation with 1 and 0, that have no effect on the value', [new CodeSample(<<<'CODE_SAMPLE' @@ -135,6 +146,9 @@ private function processBinaryPlusAndMinus($binaryOp) : ?Expr */ private function processBinaryMulAndDiv($binaryOp) : ?Expr { + if ($binaryOp->left instanceof ClassConstFetch || $binaryOp->right instanceof ClassConstFetch) { + return null; + } if (!$this->areNumberType($binaryOp)) { return null; } diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php index 92b989233..3735eee34 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector.php @@ -13,6 +13,7 @@ use PHPStan\Analyser\Scope; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\PhpParser\NodeFinder\PropertyFetchFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\DeadCode\NodeAnalyzer\PropertyWriteonlyAnalyzer; @@ -33,10 +34,16 @@ final class RemoveUnusedPrivatePropertyRector extends AbstractScopeAwareRector * @var \Rector\DeadCode\NodeAnalyzer\PropertyWriteonlyAnalyzer */ private $propertyWriteonlyAnalyzer; - public function __construct(PropertyFetchFinder $propertyFetchFinder, PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PropertyFetchFinder $propertyFetchFinder, PropertyWriteonlyAnalyzer $propertyWriteonlyAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->propertyFetchFinder = $propertyFetchFinder; $this->propertyWriteonlyAnalyzer = $propertyWriteonlyAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php index 8a1e75e57..814fefb8d 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Property/RemoveUselessVarTagRector.php @@ -5,6 +5,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Property; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -19,9 +20,15 @@ final class RemoveUselessVarTagRector extends AbstractRector * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover */ private $varTagRemover; - public function __construct(VarTagRemover $varTagRemover) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(VarTagRemover $varTagRemover, PhpDocInfoFactory $phpDocInfoFactory) { $this->varTagRemover = $varTagRemover; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php b/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php index 0f77e07ff..0b450bd5e 100644 --- a/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php +++ b/vendor/rector/rector/rules/DeadCode/Rector/Ternary/TernaryToBooleanOrFalseToBooleanAndRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\Expr\BinaryOp\BooleanAnd; use PhpParser\Node\Expr\Ternary; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -15,6 +16,15 @@ */ final class TernaryToBooleanOrFalseToBooleanAndRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change ternary of bool : false to && bool', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php index 5ee69e7db..6838cd98a 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/Return_/PreparedValueToEarlyReturnRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\Return_; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeManipulator\IfManipulator; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\EarlyReturn\ValueObject\BareSingleAssignIf; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -27,9 +28,15 @@ final class PreparedValueToEarlyReturnRector extends AbstractRector * @var \Rector\Core\NodeManipulator\IfManipulator */ private $ifManipulator; - public function __construct(IfManipulator $ifManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(IfManipulator $ifManipulator, BetterNodeFinder $betterNodeFinder) { $this->ifManipulator = $ifManipulator; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php b/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php index f6fc7e28e..2a8deebf6 100644 --- a/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php +++ b/vendor/rector/rector/rules/EarlyReturn/Rector/StmtsAwareInterface/ReturnEarlyIfVariableRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeAnalyzer\VariableAnalyzer; use Rector\Core\Rector\AbstractRector; @@ -28,9 +29,15 @@ final class ReturnEarlyIfVariableRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\VariableAnalyzer */ private $variableAnalyzer; - public function __construct(VariableAnalyzer $variableAnalyzer) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(VariableAnalyzer $variableAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->variableAnalyzer = $variableAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php b/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php index 490a5d1c4..0e9bebc2c 100644 --- a/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php +++ b/vendor/rector/rector/rules/Naming/Matcher/ForeachMatcher.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\Naming\Matcher; +use PhpParser\Node; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\ClassMethod; @@ -33,7 +34,7 @@ public function __construct(NodeNameResolver $nodeNameResolver, \Rector\Naming\M public function match(Foreach_ $foreach, $functionLike) : ?VariableAndCallForeach { $call = $this->callMatcher->matchCall($foreach); - if ($call === null) { + if (!$call instanceof Node) { return null; } if (!$foreach->valueVar instanceof Variable) { diff --git a/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php b/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php index 436f8b3d0..625bb71c2 100644 --- a/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php +++ b/vendor/rector/rector/rules/Naming/Matcher/VariableAndCallAssignMatcher.php @@ -41,7 +41,7 @@ public function __construct(\Rector\Naming\Matcher\CallMatcher $callMatcher, Nod public function match(Assign $assign, $functionLike) : ?VariableAndCallAssign { $call = $this->callMatcher->matchCall($assign); - if ($call === null) { + if (!$call instanceof Node) { return null; } if (!$assign->var instanceof Variable) { diff --git a/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php index ff90339bf..8aa17147e 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Assign/RenameVariableToMatchMethodCallReturnTypeRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Function_; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\Naming\Guard\BreakingVariableRenameGuard; @@ -62,12 +63,17 @@ final class RenameVariableToMatchMethodCallReturnTypeRector extends AbstractRect * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var string * @see https://regex101.com/r/JG5w9j/1 */ private const OR_BETWEEN_WORDS_REGEX = '#[a-z]Or[A-Z]#'; - public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, NamingConventionAnalyzer $namingConventionAnalyzer, VarTagValueNodeRenamer $varTagValueNodeRenamer, VariableAndCallAssignMatcher $variableAndCallAssignMatcher, VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater) + public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, NamingConventionAnalyzer $namingConventionAnalyzer, VarTagValueNodeRenamer $varTagValueNodeRenamer, VariableAndCallAssignMatcher $variableAndCallAssignMatcher, VariableRenamer $variableRenamer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->breakingVariableRenameGuard = $breakingVariableRenameGuard; $this->expectedNameResolver = $expectedNameResolver; @@ -76,6 +82,7 @@ public function __construct(BreakingVariableRenameGuard $breakingVariableRenameG $this->variableAndCallAssignMatcher = $variableAndCallAssignMatcher; $this->variableRenamer = $variableRenamer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php index 40317a114..ca3e0d0c0 100644 --- a/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/ClassMethod/RenameVariableToMatchNewTypeRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\ClassMethod; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Naming\Guard\BreakingVariableRenameGuard; use Rector\Naming\Naming\ExpectedNameResolver; @@ -34,11 +35,17 @@ final class RenameVariableToMatchNewTypeRector extends AbstractRector * @var \Rector\Naming\VariableRenamer */ private $variableRenamer; - public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, VariableRenamer $variableRenamer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(BreakingVariableRenameGuard $breakingVariableRenameGuard, ExpectedNameResolver $expectedNameResolver, VariableRenamer $variableRenamer, BetterNodeFinder $betterNodeFinder) { $this->breakingVariableRenameGuard = $breakingVariableRenameGuard; $this->expectedNameResolver = $expectedNameResolver; $this->variableRenamer = $variableRenamer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php index 51d45269f..db80bf725 100644 --- a/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php +++ b/vendor/rector/rector/rules/Naming/Rector/Foreach_/RenameForeachValueVariableToMatchExprVariableRector.php @@ -9,6 +9,7 @@ use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Core\NodeManipulator\StmtsManipulator; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Naming\ExpectedNameResolver\InflectorSingularResolver; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -33,11 +34,17 @@ final class RenameForeachValueVariableToMatchExprVariableRector extends Abstract * @var \Rector\Core\NodeManipulator\StmtsManipulator */ private $stmtsManipulator; - public function __construct(InflectorSingularResolver $inflectorSingularResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer, StmtsManipulator $stmtsManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(InflectorSingularResolver $inflectorSingularResolver, PropertyFetchAnalyzer $propertyFetchAnalyzer, StmtsManipulator $stmtsManipulator, BetterNodeFinder $betterNodeFinder) { $this->inflectorSingularResolver = $inflectorSingularResolver; $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; $this->stmtsManipulator = $stmtsManipulator; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php b/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php index fa4ed3009..dfc35da2b 100644 --- a/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php +++ b/vendor/rector/rector/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\Switch_; use PHPStan\Type\Constant\ConstantIntegerType; use PHPStan\Type\ConstantType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -23,6 +24,15 @@ */ final class ContinueToBreakInSwitchRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function provideMinPhpVersion() : int { return PhpVersionFeature::CONTINUE_TO_BREAK; diff --git a/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php b/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php index f09a569fa..15ce45a9e 100644 --- a/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php +++ b/vendor/rector/rector/rules/Php54/Rector/Break_/RemoveZeroBreakContinueRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Stmt\Continue_; use PHPStan\Type\Constant\ConstantIntegerType; use PHPStan\Type\ConstantType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -23,6 +24,15 @@ */ final class RemoveZeroBreakContinueRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function provideMinPhpVersion() : int { return PhpVersionFeature::NO_ZERO_BREAK; diff --git a/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php b/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php index 4a7fdfb3c..3e05d2038 100644 --- a/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/If_/IfToSpaceshipRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Php70\Enum\BattleshipCompareOrder; @@ -33,9 +34,15 @@ final class IfToSpaceshipRector extends AbstractRector implements MinPhpVersionI * @var \Rector\Php70\NodeAnalyzer\BattleshipTernaryAnalyzer */ private $battleshipTernaryAnalyzer; - public function __construct(BattleshipTernaryAnalyzer $battleshipTernaryAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(BattleshipTernaryAnalyzer $battleshipTernaryAnalyzer, ValueResolver $valueResolver) { $this->battleshipTernaryAnalyzer = $battleshipTernaryAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php index c1751649f..366fcc4a6 100644 --- a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToNullCoalescingRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\BinaryOp\NotIdentical; use PhpParser\Node\Expr\Isset_; use PhpParser\Node\Expr\Ternary; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -20,6 +21,15 @@ */ final class TernaryToNullCoalescingRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes unneeded null check to ?? operator', [new CodeSample('$value === null ? 10 : $value;', '$value ?? 10;'), new CodeSample('isset($value) ? $value : 10;', '$value ?? 10;')]); diff --git a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php index 49cecad2b..fcdce7f36 100644 --- a/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php +++ b/vendor/rector/rector/rules/Php70/Rector/Ternary/TernaryToSpaceshipRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\BinaryOp\Smaller; use PhpParser\Node\Expr\BinaryOp\Spaceship; use PhpParser\Node\Expr\Ternary; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -20,6 +21,15 @@ */ final class TernaryToSpaceshipRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Use <=> spaceship instead of ternary with same effect', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Php71/NodeAnalyzer/CountableAnalyzer.php b/vendor/rector/rector/rules/Php71/NodeAnalyzer/CountableAnalyzer.php index ce900da72..f7a529c7e 100644 --- a/vendor/rector/rector/rules/Php71/NodeAnalyzer/CountableAnalyzer.php +++ b/vendor/rector/rector/rules/Php71/NodeAnalyzer/CountableAnalyzer.php @@ -79,7 +79,6 @@ public function isCastableArrayType(Expr $expr, ArrayType $arrayType, Scope $sco if ($arrayType instanceof ConstantArrayType) { return \false; } - /** @var StaticPropertyFetch|PropertyFetch $expr */ $callerObjectType = $expr instanceof StaticPropertyFetch ? $this->nodeTypeResolver->getType($expr->class) : $this->nodeTypeResolver->getType($expr->var); $propertyName = $this->nodeNameResolver->getName($expr->name); if (!\is_string($propertyName)) { diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php index 361d59a84..abd81de26 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/ArrayKeyFirstLastRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\Expression; use PHPStan\Reflection\ReflectionProvider; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -30,6 +31,11 @@ final class ArrayKeyFirstLastRector extends AbstractRector implements MinPhpVers * @var \PHPStan\Reflection\ReflectionProvider */ private $reflectionProvider; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var string */ @@ -42,9 +48,10 @@ final class ArrayKeyFirstLastRector extends AbstractRector implements MinPhpVers * @var array */ private const PREVIOUS_TO_NEW_FUNCTIONS = ['reset' => self::ARRAY_KEY_FIRST, 'end' => self::ARRAY_KEY_LAST]; - public function __construct(ReflectionProvider $reflectionProvider) + public function __construct(ReflectionProvider $reflectionProvider, BetterNodeFinder $betterNodeFinder) { $this->reflectionProvider = $reflectionProvider; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { @@ -110,7 +117,7 @@ private function processArrayKeyFirstLast(StmtsAwareInterface $stmtsAware, bool if (!$keyFuncCall instanceof FuncCall) { continue; } - if ($this->hasPrevCallNext($stmtsAware, $key + 2, $totalKeys, $keyFuncCall)) { + if ($this->hasInternalPointerChangeNext($stmtsAware, $key + 1, $totalKeys, $keyFuncCall)) { continue; } $newName = self::PREVIOUS_TO_NEW_FUNCTIONS[$this->getName($stmt->expr)]; @@ -143,7 +150,7 @@ private function resolveKeyFuncCall(Stmt $nextStmt, FuncCall $resetOrEndFuncCall return $this->nodeComparator->areNodesEqual($resetOrEndFuncCall->getArgs()[0], $subNode->getArgs()[0]); }); } - private function hasPrevCallNext(StmtsAwareInterface $stmtsAware, int $nextKey, int $totalKeys, FuncCall $funcCall) : bool + private function hasInternalPointerChangeNext(StmtsAwareInterface $stmtsAware, int $nextKey, int $totalKeys, FuncCall $funcCall) : bool { for ($key = $nextKey; $key <= $totalKeys; ++$key) { if (!isset($stmtsAware->stmts[$key])) { @@ -153,7 +160,7 @@ private function hasPrevCallNext(StmtsAwareInterface $stmtsAware, int $nextKey, if (!$subNode instanceof FuncCall) { return \false; } - if (!$this->isName($subNode, 'prev')) { + if (!$this->isNames($subNode, ['prev', 'next'])) { return \false; } if ($subNode->isFirstClassCallable()) { diff --git a/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php b/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php index e25d51cc3..4aed2b430 100644 --- a/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php +++ b/vendor/rector/rector/rules/Php73/Rector/FuncCall/JsonThrowOnErrorRector.php @@ -11,6 +11,8 @@ use PhpParser\Node\Name; use PhpParser\Node\Scalar\LNumber; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\BetterNodeFinder; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -23,10 +25,25 @@ */ final class JsonThrowOnErrorRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var bool */ private $hasChanged = \false; + public function __construct(ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder) + { + $this->valueResolver = $valueResolver; + $this->betterNodeFinder = $betterNodeFinder; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Adds JSON_THROW_ON_ERROR to json_encode() and json_decode() to throw JsonException on error', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php b/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php index 5675f9648..b4886e36b 100644 --- a/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/FuncCall/MoneyFormatToNumberFormatRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use Rector\Core\NodeAnalyzer\ArgsAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -29,9 +30,15 @@ final class MoneyFormatToNumberFormatRector extends AbstractRector implements Mi * @var \Rector\Core\NodeAnalyzer\ArgsAnalyzer */ private $argsAnalyzer; - public function __construct(ArgsAnalyzer $argsAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) { $this->argsAnalyzer = $argsAnalyzer; + $this->valueResolver = $valueResolver; } public function provideMinPhpVersion() : int { diff --git a/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php b/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php index 640f88b60..e4c791190 100644 --- a/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php +++ b/vendor/rector/rector/rules/Php74/Rector/StaticCall/ExportToReflectionFunctionRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -22,6 +23,15 @@ */ final class ExportToReflectionFunctionRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function provideMinPhpVersion() : int { return PhpVersionFeature::EXPORT_TO_REFLECTION_FUNCTION; diff --git a/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php b/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php index 3f82ff6b3..c1bd70390 100644 --- a/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php +++ b/vendor/rector/rector/rules/Php80/DocBlock/PropertyPromotionDocBlockMerger.php @@ -77,7 +77,6 @@ public function mergePropertyAndParamDocBlocks(Property $property, Param $param, public function decorateParamWithPropertyPhpDocInfo(ClassMethod $classMethod, Property $property, Param $param, string $paramName) : void { $propertyPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); - $propertyPhpDocInfo->markAsChanged(); $param->setAttribute(AttributeKey::PHP_DOC_INFO, $propertyPhpDocInfo); // make sure the docblock is useful if ($param->type === null) { diff --git a/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php b/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php index ee4c3b6d6..ef72a90dd 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Catch_/RemoveUnusedVariableInCatchRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\TryCatch; 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\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -25,9 +26,15 @@ final class RemoveUnusedVariableInCatchRector extends AbstractRector implements * @var \Rector\Core\NodeManipulator\StmtsManipulator */ private $stmtsManipulator; - public function __construct(StmtsManipulator $stmtsManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(StmtsManipulator $stmtsManipulator, BetterNodeFinder $betterNodeFinder) { $this->stmtsManipulator = $stmtsManipulator; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php index 2c59f20b6..2dc33f3e1 100644 --- a/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/ClassMethod/AddParamBasedOnParentClassMethodRector.php @@ -19,6 +19,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\MethodReflection; use Rector\Core\PhpParser\AstResolver; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\Printer\BetterStandardPrinter; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; @@ -49,11 +50,17 @@ final class AddParamBasedOnParentClassMethodRector extends AbstractRector implem * @var \Rector\Core\PhpParser\Printer\BetterStandardPrinter */ private $betterStandardPrinter; - public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, AstResolver $astResolver, BetterStandardPrinter $betterStandardPrinter) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, AstResolver $astResolver, BetterStandardPrinter $betterStandardPrinter, BetterNodeFinder $betterNodeFinder) { $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; $this->astResolver = $astResolver; $this->betterStandardPrinter = $betterStandardPrinter; + $this->betterNodeFinder = $betterNodeFinder; } public function provideMinPhpVersion() : int { diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php b/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php index 8f210737c..f3286a761 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/AnnotationToAttributeRector.php @@ -19,6 +19,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; @@ -81,11 +82,16 @@ final class AnnotationToAttributeRector extends AbstractRector implements Config * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var AnnotationToAttribute[] */ private $annotationsToAttributes = []; - public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, AttrGroupsFactory $attrGroupsFactory, PhpDocTagRemover $phpDocTagRemover, AttributeGroupNamedArgumentManipulator $attributeGroupNamedArgumentManipulator, UseImportsResolver $useImportsResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, DocBlockUpdater $docBlockUpdater) + public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, AttrGroupsFactory $attrGroupsFactory, PhpDocTagRemover $phpDocTagRemover, AttributeGroupNamedArgumentManipulator $attributeGroupNamedArgumentManipulator, UseImportsResolver $useImportsResolver, PhpAttributeAnalyzer $phpAttributeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->attrGroupsFactory = $attrGroupsFactory; @@ -94,6 +100,7 @@ public function __construct(PhpAttributeGroupFactory $phpAttributeGroupFactory, $this->useImportsResolver = $useImportsResolver; $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php b/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php index ee90857ea..13d360106 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/ClassPropertyAssignToConstructorPromotionRector.php @@ -17,6 +17,7 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Type\MixedType; use PHPStan\Type\TypeCombinator; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\NodeAnalyzer\ParamAnalyzer; use Rector\Core\Rector\AbstractRector; @@ -81,6 +82,11 @@ final class ClassPropertyAssignToConstructorPromotionRector extends AbstractRect * @var \Rector\Naming\PropertyRenamer\PropertyPromotionRenamer */ private $propertyPromotionRenamer; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @api * @var string @@ -96,7 +102,7 @@ final class ClassPropertyAssignToConstructorPromotionRector extends AbstractRect * @var bool */ private $inlinePublic = \false; - public function __construct(PromotedPropertyCandidateResolver $promotedPropertyCandidateResolver, VariableRenamer $variableRenamer, ParamAnalyzer $paramAnalyzer, PropertyPromotionDocBlockMerger $propertyPromotionDocBlockMerger, MakePropertyPromotionGuard $makePropertyPromotionGuard, TypeComparator $typeComparator, ReflectionResolver $reflectionResolver, PropertyPromotionRenamer $propertyPromotionRenamer) + public function __construct(PromotedPropertyCandidateResolver $promotedPropertyCandidateResolver, VariableRenamer $variableRenamer, ParamAnalyzer $paramAnalyzer, PropertyPromotionDocBlockMerger $propertyPromotionDocBlockMerger, MakePropertyPromotionGuard $makePropertyPromotionGuard, TypeComparator $typeComparator, ReflectionResolver $reflectionResolver, PropertyPromotionRenamer $propertyPromotionRenamer, PhpDocInfoFactory $phpDocInfoFactory) { $this->promotedPropertyCandidateResolver = $promotedPropertyCandidateResolver; $this->variableRenamer = $variableRenamer; @@ -106,6 +112,7 @@ public function __construct(PromotedPropertyCandidateResolver $promotedPropertyC $this->typeComparator = $typeComparator; $this->reflectionResolver = $reflectionResolver; $this->propertyPromotionRenamer = $propertyPromotionRenamer; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php b/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php index 9173cab35..dd011b10b 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Class_/StringableForToStringRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use Rector\Core\NodeAnalyzer\ClassAnalyzer; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; use Rector\Core\ValueObject\PhpVersionFeature; @@ -43,15 +44,21 @@ final class StringableForToStringRector extends AbstractRector implements MinPhp * @var \Rector\Core\NodeAnalyzer\ClassAnalyzer */ private $classAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var string */ private const STRINGABLE = 'Stringable'; - public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer) + public function __construct(FamilyRelationsAnalyzer $familyRelationsAnalyzer, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->familyRelationsAnalyzer = $familyRelationsAnalyzer; $this->returnTypeInferer = $returnTypeInferer; $this->classAnalyzer = $classAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function provideMinPhpVersion() : int { diff --git a/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php b/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php index d30f9b979..6292cf803 100644 --- a/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/FunctionLike/MixedTypeRector.php @@ -13,6 +13,7 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Type\MixedType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\PhpVersionFeature; @@ -42,15 +43,21 @@ final class MixedTypeRector extends AbstractRector implements MinPhpVersionInter * @var \Rector\DeadCode\PhpDoc\TagRemover\ParamTagRemover */ private $paramTagRemover; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var bool */ private $hasChanged = \false; - public function __construct(ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, ParamTagRemover $paramTagRemover) + public function __construct(ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, ParamTagRemover $paramTagRemover, PhpDocInfoFactory $phpDocInfoFactory) { $this->reflectionResolver = $reflectionResolver; $this->classChildAnalyzer = $classChildAnalyzer; $this->paramTagRemover = $paramTagRemover; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php b/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php index 54380f054..cea4eb3de 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Identical/StrEndsWithRector.php @@ -17,6 +17,7 @@ use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Scalar\String_; use Rector\Core\NodeAnalyzer\BinaryOpAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\FuncCallAndExpr; use Rector\Core\ValueObject\PhpVersionFeature; @@ -35,9 +36,15 @@ final class StrEndsWithRector extends AbstractRector implements MinPhpVersionInt * @var \Rector\Core\NodeAnalyzer\BinaryOpAnalyzer */ private $binaryOpAnalyzer; - public function __construct(BinaryOpAnalyzer $binaryOpAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(BinaryOpAnalyzer $binaryOpAnalyzer, ValueResolver $valueResolver) { $this->binaryOpAnalyzer = $binaryOpAnalyzer; + $this->valueResolver = $valueResolver; } public function provideMinPhpVersion() : int { diff --git a/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php b/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php index 963570870..4fc36b3b6 100644 --- a/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/NotIdentical/StrContainsRector.php @@ -14,6 +14,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Name; use PhpParser\Node\Scalar\LNumber; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\VersionBonding\Contract\MinPhpVersionInterface; @@ -26,10 +27,19 @@ */ final class StrContainsRector extends AbstractRector implements MinPhpVersionInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var string[] */ private const OLD_STR_NAMES = ['strpos', 'strstr']; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function provideMinPhpVersion() : int { return PhpVersionFeature::STR_CONTAINS; diff --git a/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php b/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php index 6a592ab95..118c9d984 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Property/NestedAnnotationToAttributeRector.php @@ -11,6 +11,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\BetterPhpDocParser\ValueObject\PhpDocAttributeKey; use Rector\Comments\NodeDocBlock\DocBlockUpdater; @@ -61,17 +62,23 @@ final class NestedAnnotationToAttributeRector extends AbstractRector implements * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var NestedAnnotationToAttribute[] */ private $nestedAnnotationsToAttributes = []; - public function __construct(UseImportsResolver $useImportsResolver, PhpDocTagRemover $phpDocTagRemover, NestedAttrGroupsFactory $nestedAttrGroupsFactory, UseNodesToAddCollector $useNodesToAddCollector, DocBlockUpdater $docBlockUpdater) + public function __construct(UseImportsResolver $useImportsResolver, PhpDocTagRemover $phpDocTagRemover, NestedAttrGroupsFactory $nestedAttrGroupsFactory, UseNodesToAddCollector $useNodesToAddCollector, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->useImportsResolver = $useImportsResolver; $this->phpDocTagRemover = $phpDocTagRemover; $this->nestedAttrGroupsFactory = $nestedAttrGroupsFactory; $this->useNodesToAddCollector = $useNodesToAddCollector; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php b/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php index 97fc3e50a..83f4efe2a 100644 --- a/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php +++ b/vendor/rector/rector/rules/Php80/Rector/Switch_/ChangeSwitchToMatchRector.php @@ -117,6 +117,7 @@ public function refactor(Node $node) : ?Node } $assign = new Assign($assignVar, $match); $node->stmts[$key] = new Expression($assign); + $this->mirrorComments($node->stmts[$key], $stmt); $hasChanged = \true; continue; } @@ -124,6 +125,7 @@ public function refactor(Node $node) : ?Node continue; } $node->stmts[$key] = $isReturn ? new Return_($match) : new Expression($match); + $this->mirrorComments($node->stmts[$key], $stmt); $hasChanged = \true; } if ($hasChanged) { diff --git a/vendor/rector/rector/rules/Php81/Enum/NameNullToStrictNullFunctionMap.php b/vendor/rector/rector/rules/Php81/Enum/NameNullToStrictNullFunctionMap.php new file mode 100644 index 000000000..acffcbdb8 --- /dev/null +++ b/vendor/rector/rector/rules/Php81/Enum/NameNullToStrictNullFunctionMap.php @@ -0,0 +1,12 @@ + + */ + public const FUNCTION_TO_PARAM_NAMES = ['preg_split' => ['subject'], 'preg_match' => ['subject'], 'preg_match_all' => ['subject'], 'preg_filter' => ['replacement', 'subject'], 'preg_replace' => ['replacement', 'subject'], 'preg_replace_callback' => ['subject'], 'preg_replace_callback_array' => ['subject'], 'explode' => ['string'], 'strlen' => ['string'], 'str_contains' => ['haystack', 'needle'], 'strtotime' => ['datetime'], 'str_replace' => ['subject'], 'substr_replace' => ['string', 'replace'], 'str_ireplace' => ['search', 'replace', 'subject'], 'substr' => ['string'], 'str_starts_with' => ['haystack', 'needle'], 'strtoupper' => ['string'], 'strtolower' => ['string'], 'strpos' => ['haystack', 'needle'], 'stripos' => ['haystack', 'needle'], 'json_decode' => ['json'], 'urlencode' => ['string'], 'urldecode' => ['string'], 'rawurlencode' => ['string'], 'rawurldecode' => ['string'], 'base64_encode' => ['string'], 'base64_decode' => ['string'], 'utf8_encode' => ['string'], 'utf8_decode' => ['string'], 'bin2hex' => ['string'], 'hex2bin' => ['string'], 'hexdec' => ['hex_string'], 'octdec' => ['octal_string'], 'base_convert' => ['num'], 'htmlspecialchars' => ['string'], 'htmlspecialchars_decode' => ['string'], 'html_entity_decode' => ['string'], 'htmlentities' => ['string'], 'addslashes' => ['string'], 'addcslashes' => ['string', 'characters'], 'stripslashes' => ['string'], 'stripcslashes' => ['string'], 'quotemeta' => ['string'], 'quoted_printable_decode' => ['string'], 'quoted_printable_encode' => ['string'], 'escapeshellarg' => ['arg'], 'curl_escape' => ['string'], 'curl_unescape' => ['string'], 'convert_uuencode' => ['string'], 'setcookie' => ['value', 'path', 'domain'], 'setrawcookie' => ['value', 'path', 'domain'], 'zlib_encode' => ['data'], 'gzdeflate' => ['data'], 'gzencode' => ['data'], 'gzcompress' => ['data'], 'gzwrite' => ['data'], 'gzputs' => ['data'], 'deflate_add' => ['data'], 'inflate_add' => ['data'], 'unpack' => ['format', 'string'], 'iconv_mime_encode' => ['field_name', 'field_value'], 'iconv_mime_decode' => ['string'], 'iconv' => ['from_encoding', 'to_encoding', 'string'], 'sodium_bin2hex' => ['string'], 'sodium_hex2bin' => ['string', 'ignore'], 'sodium_bin2base64' => ['string'], 'sodium_base642bin' => ['string', 'ignore'], 'mb_detect_encoding' => ['string'], 'mb_encode_mimeheader' => ['string'], 'mb_decode_mimeheader' => ['string'], 'mb_encode_numericentity' => ['string'], 'mb_decode_numericentity' => ['string'], 'transliterator_transliterate' => ['string'], 'mysqli_real_escape_string' => ['string'], 'mysqli_escape_string' => ['string'], 'pg_escape_bytea' => ['string'], 'pg_escape_literal' => ['string'], 'pg_escape_string' => ['string'], 'pg_unescape_bytea' => ['string'], 'ucfirst' => ['string'], 'lcfirst' => ['string'], 'ucwords' => ['string'], 'trim' => ['string'], 'ltrim' => ['string'], 'rtrim' => ['string'], 'chop' => ['string'], 'str_rot13' => ['string'], 'str_shuffle' => ['string'], 'substr_count' => ['haystack', 'needle'], 'strcoll' => ['string1', 'string2'], 'str_split' => ['string'], 'chunk_split' => ['string'], 'wordwrap' => ['string'], 'strrev' => ['string'], 'str_repeat' => ['string'], 'str_pad' => ['string'], 'nl2br' => ['string'], 'strip_tags' => ['string'], 'hebrev' => ['string'], 'iconv_substr' => ['string'], 'mb_strtoupper' => ['string'], 'mb_strtolower' => ['string'], 'mb_convert_case' => ['string'], 'mb_convert_kana' => ['string'], 'mb_convert_encoding' => ['string'], 'mb_scrub' => ['string'], 'mb_substr' => ['string'], 'mb_substr_count' => ['haystack', 'needle'], 'mb_str_split' => ['string'], 'mb_split' => ['pattern', 'string'], 'sodium_pad' => ['string'], 'grapheme_substr' => ['string'], 'strrpos' => ['haystack', 'needle'], 'strripos' => ['haystack', 'needle'], 'iconv_strpos' => ['haystack', 'needle'], 'iconv_strrpos' => ['haystack', 'needle'], 'mb_strpos' => ['haystack', 'needle'], 'mb_strrpos' => ['haystack', 'needle'], 'mb_stripos' => ['haystack', 'needle'], 'mb_strripos' => ['haystack', 'needle'], 'grapheme_extract' => ['haystack'], 'grapheme_strpos' => ['haystack', 'needle'], 'grapheme_strrpos' => ['haystack', 'needle'], 'grapheme_stripos' => ['haystack', 'needle'], 'grapheme_strripos' => ['haystack', 'needle'], 'strcmp' => ['string1', 'string2'], 'strncmp' => ['string1', 'string2'], 'strcasecmp' => ['string1', 'string2'], 'strncasecmp' => ['string1', 'string2'], 'strnatcmp' => ['string1', 'string2'], 'strnatcasecmp' => ['string1', 'string2'], 'substr_compare' => ['haystack', 'needle'], 'str_ends_with' => ['haystack', 'needle'], 'collator_compare' => ['string1', 'string2'], 'collator_get_sort_key' => ['string'], 'metaphone' => ['string'], 'soundex' => ['string'], 'levenshtein' => ['string1', 'string2'], 'similar_text' => ['string1', 'string2'], 'sodium_compare' => ['string1', 'string2'], 'sodium_memcmp' => ['string1', 'string2'], 'strstr' => ['haystack', 'needle'], 'strchr' => ['haystack', 'needle'], 'stristr' => ['haystack', 'needle'], 'strrchr' => ['haystack', 'needle'], 'strpbrk' => ['string', 'characters'], 'strspn' => ['string', 'characters'], 'strcspn' => ['string', 'characters'], 'strtr' => ['string'], 'strtok' => ['string'], 'str_word_count' => ['string'], 'count_chars' => ['string'], 'iconv_strlen' => ['string'], 'mb_strlen' => ['string'], 'mb_strstr' => ['haystack', 'needle'], 'mb_strrchr' => ['haystack', 'needle'], 'mb_stristr' => ['haystack', 'needle'], 'mb_strrichr' => ['haystack', 'needle'], 'mb_strcut' => ['string'], 'mb_strwidth' => ['string'], 'mb_strimwidth' => ['string', 'trim_marker'], 'grapheme_strlen' => ['string'], 'grapheme_strstr' => ['haystack', 'needle'], 'grapheme_stristr' => ['haystack', 'needle'], 'preg_quote' => ['str'], 'mb_ereg' => ['pattern', 'string'], 'mb_eregi' => ['pattern', 'string'], 'mb_ereg_replace' => ['pattern', 'replacement', 'string'], 'mb_eregi_replace' => ['pattern', 'replacement', 'string'], 'mb_ereg_replace_callback' => ['pattern', 'string'], 'mb_ereg_match' => ['pattern', 'string'], 'mb_ereg_search_init' => ['string'], 'normalizer_normalize' => ['string'], 'normalizer_is_normalized' => ['string'], 'normalizer_get_raw_decomposition' => ['string'], 'numfmt_parse' => ['string'], 'hash' => ['algo', 'data'], 'hash_hmac' => ['algo', 'data', 'key'], 'hash_update' => ['data'], 'hash_pbkdf2' => ['algo', 'password', 'salt'], 'crc32' => ['string'], 'md5' => ['string'], 'sha1' => ['string'], 'crypt' => ['string', 'salt'], 'basename' => ['path'], 'dirname' => ['path'], 'pathinfo' => ['path'], 'sscanf' => ['string'], 'fwrite' => ['data'], 'fputs' => ['data'], 'output_add_rewrite_var' => ['name', 'value'], 'parse_url' => ['url'], 'parse_str' => ['string'], 'mb_parse_str' => ['string'], 'parse_ini_string' => ['ini_string'], 'locale_accept_from_http' => ['header'], 'msgfmt_parse' => ['string'], 'msgfmt_parse_message' => ['locale', 'pattern', 'message'], 'str_getcsv' => ['string'], 'fgetcsv' => ['escape'], 'fputcsv' => ['escape'], 'password_hash' => ['password'], 'password_verify' => ['password', 'hash'], 'bcadd' => ['num1', 'num2'], 'bcsub' => ['num1', 'num2'], 'bcmul' => ['num1', 'num2'], 'bcdiv' => ['num1', 'num2'], 'bcmod' => ['num1', 'num2'], 'bcpow' => ['num', 'exponent'], 'bcpowmod' => ['num', 'exponent', 'modulus'], 'bcsqrt' => ['num'], 'bccomp' => ['num1', 'num2'], 'simplexml_load_string' => ['data'], 'xml_parse' => ['data'], 'xml_parse_into_struct' => ['data'], 'xml_parser_create_ns' => ['separator'], 'xmlwriter_set_indent_string' => ['indentation'], 'xmlwriter_write_attribute' => ['name', 'value'], 'xmlwriter_write_attribute_ns' => ['value'], 'xmlwriter_write_pi' => ['target', 'content'], 'xmlwriter_write_cdata' => ['content'], 'xmlwriter_text' => ['content'], 'xmlwriter_write_raw' => ['content'], 'xmlwriter_write_comment' => ['content'], 'xmlwriter_write_dtd' => ['name'], 'xmlwriter_write_dtd_element' => ['name', 'content'], 'xmlwriter_write_dtd_attlist' => ['name', 'content'], 'xmlwriter_write_dtd_entity' => ['name', 'content'], 'sodium_crypto_aead_aes256gcm_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_aes256gcm_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_auth' => ['message', 'key'], 'sodium_crypto_auth_verify' => ['mac', 'message', 'key'], 'sodium_crypto_box' => ['message', 'nonce', 'key_pair'], 'sodium_crypto_box_seal' => ['message', 'public_key'], 'sodium_crypto_generichash' => ['message'], 'sodium_crypto_generichash_update' => ['message'], 'sodium_crypto_secretbox' => ['message', 'nonce', 'key'], 'sodium_crypto_secretstream_xchacha20poly1305_push' => ['message'], 'sodium_crypto_secretstream_xchacha20poly1305_pull' => ['ciphertext'], 'sodium_crypto_shorthash' => ['message', 'key'], 'sodium_crypto_sign' => ['message', 'secret_key'], 'sodium_crypto_sign_detached' => ['message'], 'sodium_crypto_sign_open' => ['signed_message', 'public_key'], 'sodium_crypto_sign_verify_detached' => ['signature', 'message', 'public_key'], 'sodium_crypto_stream_xor' => ['message', 'nonce', 'key'], 'sodium_crypto_stream_xchacha20_xor' => ['message', 'nonce', 'key'], 'imagechar' => ['char'], 'imagecharup' => ['char'], 'imageftbbox' => ['string'], 'imagefttext' => ['text'], 'imagestring' => ['string'], 'imagestringup' => ['string'], 'imagettfbbox' => ['string'], 'imagettftext' => ['text'], 'pspell_add_to_personal' => ['word'], 'pspell_add_to_session' => ['word'], 'pspell_check' => ['word'], 'pspell_config_create' => ['language', 'spelling', 'jargon', 'encoding'], 'pspell_new' => ['spelling', 'jargon', 'encoding'], 'pspell_new_personal' => ['spelling', 'jargon', 'encoding'], 'pspell_store_replacement' => ['correct'], 'pspell_suggest' => ['word'], 'stream_get_line' => ['ending'], 'stream_socket_sendto' => ['data'], 'socket_sendto' => ['data'], 'socket_write' => ['data'], 'socket_send' => ['data'], 'mail' => ['to', 'subject', 'message'], 'mb_send_mail' => ['to', 'subject', 'message'], 'ctype_alnum' => ['text'], 'ctype_alpha' => ['text'], 'ctype_cntrl' => ['text'], 'ctype_digit' => ['text'], 'ctype_graph' => ['text'], 'ctype_lower' => ['text'], 'ctype_print' => ['text'], 'ctype_punct' => ['text'], 'ctype_space' => ['text'], 'ctype_upper' => ['text'], 'ctype_xdigit' => ['text'], 'uniqid' => ['prefix']]; +} diff --git a/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php b/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php index 0b2a40999..ae71105fa 100644 --- a/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector.php @@ -22,11 +22,13 @@ use PHPStan\Type\Type; use Rector\Core\NodeAnalyzer\ArgsAnalyzer; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\ParametersAcceptorSelectorVariantsWrapper; +use Rector\Php81\Enum\NameNullToStrictNullFunctionMap; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -51,14 +53,16 @@ final class NullToStrictStringFuncCallArgRector extends AbstractRector implement */ private $propertyFetchAnalyzer; /** - * @var array + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver */ - private const ARG_POSITION_NAME_NULL_TO_STRICT_STRING = ['preg_split' => ['subject'], 'preg_match' => ['subject'], 'preg_match_all' => ['subject'], 'preg_filter' => ['replacement', 'subject'], 'preg_replace' => ['replacement', 'subject'], 'preg_replace_callback' => ['subject'], 'preg_replace_callback_array' => ['subject'], 'explode' => ['string'], 'strlen' => ['string'], 'str_contains' => ['haystack', 'needle'], 'strtotime' => ['datetime'], 'str_replace' => ['subject'], 'substr_replace' => ['string', 'replace'], 'str_ireplace' => ['search', 'replace', 'subject'], 'substr' => ['string'], 'str_starts_with' => ['haystack', 'needle'], 'strtoupper' => ['string'], 'strtolower' => ['string'], 'strpos' => ['haystack', 'needle'], 'stripos' => ['haystack', 'needle'], 'json_decode' => ['json'], 'urlencode' => ['string'], 'urldecode' => ['string'], 'rawurlencode' => ['string'], 'rawurldecode' => ['string'], 'base64_encode' => ['string'], 'base64_decode' => ['string'], 'utf8_encode' => ['string'], 'utf8_decode' => ['string'], 'bin2hex' => ['string'], 'hex2bin' => ['string'], 'hexdec' => ['hex_string'], 'octdec' => ['octal_string'], 'base_convert' => ['num'], 'htmlspecialchars' => ['string'], 'htmlspecialchars_decode' => ['string'], 'html_entity_decode' => ['string'], 'htmlentities' => ['string'], 'addslashes' => ['string'], 'addcslashes' => ['string', 'characters'], 'stripslashes' => ['string'], 'stripcslashes' => ['string'], 'quotemeta' => ['string'], 'quoted_printable_decode' => ['string'], 'quoted_printable_encode' => ['string'], 'escapeshellarg' => ['arg'], 'curl_escape' => ['string'], 'curl_unescape' => ['string'], 'convert_uuencode' => ['string'], 'setcookie' => ['value', 'path', 'domain'], 'setrawcookie' => ['value', 'path', 'domain'], 'zlib_encode' => ['data'], 'gzdeflate' => ['data'], 'gzencode' => ['data'], 'gzcompress' => ['data'], 'gzwrite' => ['data'], 'gzputs' => ['data'], 'deflate_add' => ['data'], 'inflate_add' => ['data'], 'unpack' => ['format', 'string'], 'iconv_mime_encode' => ['field_name', 'field_value'], 'iconv_mime_decode' => ['string'], 'iconv' => ['from_encoding', 'to_encoding', 'string'], 'sodium_bin2hex' => ['string'], 'sodium_hex2bin' => ['string', 'ignore'], 'sodium_bin2base64' => ['string'], 'sodium_base642bin' => ['string', 'ignore'], 'mb_detect_encoding' => ['string'], 'mb_encode_mimeheader' => ['string'], 'mb_decode_mimeheader' => ['string'], 'mb_encode_numericentity' => ['string'], 'mb_decode_numericentity' => ['string'], 'transliterator_transliterate' => ['string'], 'mysqli_real_escape_string' => ['string'], 'mysqli_escape_string' => ['string'], 'pg_escape_bytea' => ['string'], 'pg_escape_literal' => ['string'], 'pg_escape_string' => ['string'], 'pg_unescape_bytea' => ['string'], 'ucfirst' => ['string'], 'lcfirst' => ['string'], 'ucwords' => ['string'], 'trim' => ['string'], 'ltrim' => ['string'], 'rtrim' => ['string'], 'chop' => ['string'], 'str_rot13' => ['string'], 'str_shuffle' => ['string'], 'substr_count' => ['haystack', 'needle'], 'strcoll' => ['string1', 'string2'], 'str_split' => ['string'], 'chunk_split' => ['string'], 'wordwrap' => ['string'], 'strrev' => ['string'], 'str_repeat' => ['string'], 'str_pad' => ['string'], 'nl2br' => ['string'], 'strip_tags' => ['string'], 'hebrev' => ['string'], 'iconv_substr' => ['string'], 'mb_strtoupper' => ['string'], 'mb_strtolower' => ['string'], 'mb_convert_case' => ['string'], 'mb_convert_kana' => ['string'], 'mb_convert_encoding' => ['string'], 'mb_scrub' => ['string'], 'mb_substr' => ['string'], 'mb_substr_count' => ['haystack', 'needle'], 'mb_str_split' => ['string'], 'mb_split' => ['pattern', 'string'], 'sodium_pad' => ['string'], 'grapheme_substr' => ['string'], 'strrpos' => ['haystack', 'needle'], 'strripos' => ['haystack', 'needle'], 'iconv_strpos' => ['haystack', 'needle'], 'iconv_strrpos' => ['haystack', 'needle'], 'mb_strpos' => ['haystack', 'needle'], 'mb_strrpos' => ['haystack', 'needle'], 'mb_stripos' => ['haystack', 'needle'], 'mb_strripos' => ['haystack', 'needle'], 'grapheme_extract' => ['haystack'], 'grapheme_strpos' => ['haystack', 'needle'], 'grapheme_strrpos' => ['haystack', 'needle'], 'grapheme_stripos' => ['haystack', 'needle'], 'grapheme_strripos' => ['haystack', 'needle'], 'strcmp' => ['string1', 'string2'], 'strncmp' => ['string1', 'string2'], 'strcasecmp' => ['string1', 'string2'], 'strncasecmp' => ['string1', 'string2'], 'strnatcmp' => ['string1', 'string2'], 'strnatcasecmp' => ['string1', 'string2'], 'substr_compare' => ['haystack', 'needle'], 'str_ends_with' => ['haystack', 'needle'], 'collator_compare' => ['string1', 'string2'], 'collator_get_sort_key' => ['string'], 'metaphone' => ['string'], 'soundex' => ['string'], 'levenshtein' => ['string1', 'string2'], 'similar_text' => ['string1', 'string2'], 'sodium_compare' => ['string1', 'string2'], 'sodium_memcmp' => ['string1', 'string2'], 'strstr' => ['haystack', 'needle'], 'strchr' => ['haystack', 'needle'], 'stristr' => ['haystack', 'needle'], 'strrchr' => ['haystack', 'needle'], 'strpbrk' => ['string', 'characters'], 'strspn' => ['string', 'characters'], 'strcspn' => ['string', 'characters'], 'strtr' => ['string'], 'strtok' => ['string'], 'str_word_count' => ['string'], 'count_chars' => ['string'], 'iconv_strlen' => ['string'], 'mb_strlen' => ['string'], 'mb_strstr' => ['haystack', 'needle'], 'mb_strrchr' => ['haystack', 'needle'], 'mb_stristr' => ['haystack', 'needle'], 'mb_strrichr' => ['haystack', 'needle'], 'mb_strcut' => ['string'], 'mb_strwidth' => ['string'], 'mb_strimwidth' => ['string', 'trim_marker'], 'grapheme_strlen' => ['string'], 'grapheme_strstr' => ['haystack', 'needle'], 'grapheme_stristr' => ['haystack', 'needle'], 'preg_quote' => ['str'], 'mb_ereg' => ['pattern', 'string'], 'mb_eregi' => ['pattern', 'string'], 'mb_ereg_replace' => ['pattern', 'replacement', 'string'], 'mb_eregi_replace' => ['pattern', 'replacement', 'string'], 'mb_ereg_replace_callback' => ['pattern', 'string'], 'mb_ereg_match' => ['pattern', 'string'], 'mb_ereg_search_init' => ['string'], 'normalizer_normalize' => ['string'], 'normalizer_is_normalized' => ['string'], 'normalizer_get_raw_decomposition' => ['string'], 'numfmt_parse' => ['string'], 'hash' => ['algo', 'data'], 'hash_hmac' => ['algo', 'data', 'key'], 'hash_update' => ['data'], 'hash_pbkdf2' => ['algo', 'password', 'salt'], 'crc32' => ['string'], 'md5' => ['string'], 'sha1' => ['string'], 'crypt' => ['string', 'salt'], 'basename' => ['path'], 'dirname' => ['path'], 'pathinfo' => ['path'], 'sscanf' => ['string'], 'fwrite' => ['data'], 'fputs' => ['data'], 'output_add_rewrite_var' => ['name', 'value'], 'parse_url' => ['url'], 'parse_str' => ['string'], 'mb_parse_str' => ['string'], 'parse_ini_string' => ['ini_string'], 'locale_accept_from_http' => ['header'], 'msgfmt_parse' => ['string'], 'msgfmt_parse_message' => ['locale', 'pattern', 'message'], 'str_getcsv' => ['string'], 'fgetcsv' => ['escape'], 'fputcsv' => ['escape'], 'password_hash' => ['password'], 'password_verify' => ['password', 'hash'], 'bcadd' => ['num1', 'num2'], 'bcsub' => ['num1', 'num2'], 'bcmul' => ['num1', 'num2'], 'bcdiv' => ['num1', 'num2'], 'bcmod' => ['num1', 'num2'], 'bcpow' => ['num', 'exponent'], 'bcpowmod' => ['num', 'exponent', 'modulus'], 'bcsqrt' => ['num'], 'bccomp' => ['num1', 'num2'], 'simplexml_load_string' => ['data'], 'xml_parse' => ['data'], 'xml_parse_into_struct' => ['data'], 'xml_parser_create_ns' => ['separator'], 'xmlwriter_set_indent_string' => ['indentation'], 'xmlwriter_write_attribute' => ['name', 'value'], 'xmlwriter_write_attribute_ns' => ['value'], 'xmlwriter_write_pi' => ['target', 'content'], 'xmlwriter_write_cdata' => ['content'], 'xmlwriter_text' => ['content'], 'xmlwriter_write_raw' => ['content'], 'xmlwriter_write_comment' => ['content'], 'xmlwriter_write_dtd' => ['name'], 'xmlwriter_write_dtd_element' => ['name', 'content'], 'xmlwriter_write_dtd_attlist' => ['name', 'content'], 'xmlwriter_write_dtd_entity' => ['name', 'content'], 'sodium_crypto_aead_aes256gcm_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_aes256gcm_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_ietf_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_chacha20poly1305_ietf_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_xchacha20poly1305_ietf_encrypt' => ['message', 'additional_data', 'nonce', 'key'], 'sodium_crypto_aead_xchacha20poly1305_ietf_decrypt' => ['ciphertext', 'additional_data', 'nonce', 'key'], 'sodium_crypto_auth' => ['message', 'key'], 'sodium_crypto_auth_verify' => ['mac', 'message', 'key'], 'sodium_crypto_box' => ['message', 'nonce', 'key_pair'], 'sodium_crypto_box_seal' => ['message', 'public_key'], 'sodium_crypto_generichash' => ['message'], 'sodium_crypto_generichash_update' => ['message'], 'sodium_crypto_secretbox' => ['message', 'nonce', 'key'], 'sodium_crypto_secretstream_xchacha20poly1305_push' => ['message'], 'sodium_crypto_secretstream_xchacha20poly1305_pull' => ['ciphertext'], 'sodium_crypto_shorthash' => ['message', 'key'], 'sodium_crypto_sign' => ['message', 'secret_key'], 'sodium_crypto_sign_detached' => ['message'], 'sodium_crypto_sign_open' => ['signed_message', 'public_key'], 'sodium_crypto_sign_verify_detached' => ['signature', 'message', 'public_key'], 'sodium_crypto_stream_xor' => ['message', 'nonce', 'key'], 'sodium_crypto_stream_xchacha20_xor' => ['message', 'nonce', 'key'], 'imagechar' => ['char'], 'imagecharup' => ['char'], 'imageftbbox' => ['string'], 'imagefttext' => ['text'], 'imagestring' => ['string'], 'imagestringup' => ['string'], 'imagettfbbox' => ['string'], 'imagettftext' => ['text'], 'pspell_add_to_personal' => ['word'], 'pspell_add_to_session' => ['word'], 'pspell_check' => ['word'], 'pspell_config_create' => ['language', 'spelling', 'jargon', 'encoding'], 'pspell_new' => ['spelling', 'jargon', 'encoding'], 'pspell_new_personal' => ['spelling', 'jargon', 'encoding'], 'pspell_store_replacement' => ['correct'], 'pspell_suggest' => ['word'], 'stream_get_line' => ['ending'], 'stream_socket_sendto' => ['data'], 'socket_sendto' => ['data'], 'socket_write' => ['data'], 'socket_send' => ['data'], 'mail' => ['to', 'subject', 'message'], 'mb_send_mail' => ['to', 'subject', 'message'], 'ctype_alnum' => ['text'], 'ctype_alpha' => ['text'], 'ctype_cntrl' => ['text'], 'ctype_digit' => ['text'], 'ctype_graph' => ['text'], 'ctype_lower' => ['text'], 'ctype_print' => ['text'], 'ctype_punct' => ['text'], 'ctype_space' => ['text'], 'ctype_upper' => ['text'], 'ctype_xdigit' => ['text'], 'uniqid' => ['prefix']]; - public function __construct(ReflectionResolver $reflectionResolver, ArgsAnalyzer $argsAnalyzer, PropertyFetchAnalyzer $propertyFetchAnalyzer) + private $valueResolver; + public function __construct(ReflectionResolver $reflectionResolver, ArgsAnalyzer $argsAnalyzer, PropertyFetchAnalyzer $propertyFetchAnalyzer, ValueResolver $valueResolver) { $this->reflectionResolver = $reflectionResolver; $this->argsAnalyzer = $argsAnalyzer; $this->propertyFetchAnalyzer = $propertyFetchAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { @@ -132,7 +136,7 @@ public function provideMinPhpVersion() : int private function resolveNamedPositions(FuncCall $funcCall, array $args) : array { $functionName = $this->nodeNameResolver->getName($funcCall); - $argNames = self::ARG_POSITION_NAME_NULL_TO_STRICT_STRING[$functionName]; + $argNames = NameNullToStrictNullFunctionMap::FUNCTION_TO_PARAM_NAMES[$functionName]; $positions = []; foreach ($args as $position => $arg) { if (!$arg->name instanceof Identifier) { @@ -215,7 +219,7 @@ private function resolveOriginalPositions(FuncCall $funcCall, Scope $scope) : ar } $parametersAcceptor = ParametersAcceptorSelectorVariantsWrapper::select($functionReflection, $funcCall, $scope); $functionName = $functionReflection->getName(); - $argNames = self::ARG_POSITION_NAME_NULL_TO_STRICT_STRING[$functionName]; + $argNames = NameNullToStrictNullFunctionMap::FUNCTION_TO_PARAM_NAMES[$functionName]; $positions = []; foreach ($parametersAcceptor->getParameters() as $position => $parameterReflection) { if (\in_array($parameterReflection->getName(), $argNames, \true)) { @@ -226,7 +230,7 @@ private function resolveOriginalPositions(FuncCall $funcCall, Scope $scope) : ar } private function shouldSkip(FuncCall $funcCall) : bool { - $functionNames = \array_keys(self::ARG_POSITION_NAME_NULL_TO_STRICT_STRING); + $functionNames = \array_keys(NameNullToStrictNullFunctionMap::FUNCTION_TO_PARAM_NAMES); if (!$this->nodeNameResolver->isNames($funcCall, $functionNames)) { return \true; } diff --git a/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php b/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php index e7aba1920..6f4d74594 100644 --- a/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php +++ b/vendor/rector/rector/rules/Php81/Rector/Property/ReadOnlyPropertyRector.php @@ -18,6 +18,7 @@ use Rector\Core\NodeAnalyzer\ParamAnalyzer; use Rector\Core\NodeManipulator\PropertyFetchAssignManipulator; use Rector\Core\NodeManipulator\PropertyManipulator; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\MethodName; use Rector\Core\ValueObject\PhpVersionFeature; @@ -54,12 +55,18 @@ final class ReadOnlyPropertyRector extends AbstractScopeAwareRector implements M * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ private $visibilityManipulator; - public function __construct(PropertyManipulator $propertyManipulator, PropertyFetchAssignManipulator $propertyFetchAssignManipulator, ParamAnalyzer $paramAnalyzer, VisibilityManipulator $visibilityManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(PropertyManipulator $propertyManipulator, PropertyFetchAssignManipulator $propertyFetchAssignManipulator, ParamAnalyzer $paramAnalyzer, VisibilityManipulator $visibilityManipulator, BetterNodeFinder $betterNodeFinder) { $this->propertyManipulator = $propertyManipulator; $this->propertyFetchAssignManipulator = $propertyFetchAssignManipulator; $this->paramAnalyzer = $paramAnalyzer; $this->visibilityManipulator = $visibilityManipulator; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php b/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php index 4b04158bb..381407556 100644 --- a/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php +++ b/vendor/rector/rector/rules/Privatization/Guard/ParentPropertyLookupGuard.php @@ -5,7 +5,6 @@ use PhpParser\Node; use PhpParser\Node\Expr\PropertyFetch; -use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; @@ -107,7 +106,6 @@ private function isFoundInMethodStmts(array $stmts, string $propertyName, string if (!$this->propertyFetchAnalyzer->isPropertyFetch($subNode)) { return \false; } - /** @var PropertyFetch|StaticPropertyFetch $subNode */ if ($subNode instanceof PropertyFetch) { if (!$subNode->var instanceof Variable) { return \false; diff --git a/vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenCollectorRector.php b/vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenCollectorRector.php new file mode 100644 index 000000000..44693d6d9 --- /dev/null +++ b/vendor/rector/rector/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenCollectorRector.php @@ -0,0 +1,108 @@ +classAnalyzer = $classAnalyzer; + $this->visibilityManipulator = $visibilityManipulator; + $this->reflectionResolver = $reflectionResolver; + $this->doctrineEntityAnalyzer = $doctrineEntityAnalyzer; + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if ($this->shouldSkipClass($node)) { + return null; + } + if ($this->doctrineEntityAnalyzer->hasClassAnnotation($node)) { + return null; + } + $classReflection = $this->reflectionResolver->resolveClassReflection($node); + if (!$classReflection instanceof ClassReflection) { + return null; + } + if ($this->doctrineEntityAnalyzer->hasClassReflectionAttribute($classReflection)) { + return null; + } + $parentClassNames = $this->resolveCollectedParentClassNames($this->getCollectedDataNode()); + // the class is being extended in the code, so we should skip it here + if ($this->nodeNameResolver->isNames($node, $parentClassNames)) { + return null; + } + if ($node->attrGroups !== []) { + // improve reprint with correct newline + $node->setAttribute(AttributeKey::ORIGINAL_NODE, null); + } + $this->visibilityManipulator->makeFinal($node); + return $node; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('...', []); + } + private function shouldSkipClass(Class_ $class) : bool + { + if ($class->isFinal() || $class->isAbstract()) { + return \true; + } + return $this->classAnalyzer->isAnonymousClass($class); + } + /** + * @return string[] + */ + private function resolveCollectedParentClassNames(CollectedDataNode $collectedDataNode) : array + { + $parentClassCollectorData = $collectedDataNode->get(ParentClassCollector::class); + $parentClassNames = Arrays::flatten($parentClassCollectorData); + return \array_unique($parentClassNames); + } +} diff --git a/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php b/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php index 25c268706..b0a62347e 100644 --- a/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php +++ b/vendor/rector/rector/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\VariadicPlaceholder; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Removing\ValueObject\ArgumentRemover; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -20,6 +21,11 @@ */ final class ArgumentRemoverRector extends AbstractRector implements ConfigurableRectorInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var ArgumentRemover[] */ @@ -28,6 +34,10 @@ final class ArgumentRemoverRector extends AbstractRector implements Configurable * @var bool */ private $hasChanged = \false; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Removes defined arguments in defined methods and their calls.', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php b/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php index 1dc895644..703f6291c 100644 --- a/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php +++ b/vendor/rector/rector/rules/Renaming/NodeManipulator/ClassRenamer.php @@ -138,7 +138,7 @@ private function refactorPhpDoc(Node $node, array $oldToNewTypes, array $oldToNe if ($node instanceof AttributeGroup) { return \false; } - $hasChanged = $this->docBlockClassRenamer->renamePhpDocType($phpDocInfo, $oldToNewTypes); + $hasChanged = $this->docBlockClassRenamer->renamePhpDocType($phpDocInfo, $oldToNewTypes, $node); $hasChanged = $this->phpDocClassRenamer->changeTypeInAnnotationTypes($node, $phpDocInfo, $oldToNewClasses, $hasChanged); if ($hasChanged) { $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); diff --git a/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php b/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php index 4fbbea7bf..6fcda5762 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/ClassMethod/RenameAnnotationRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Property; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; @@ -33,14 +34,20 @@ final class RenameAnnotationRector extends AbstractRector implements Configurabl * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var RenameAnnotationInterface[] */ private $renameAnnotations = []; - public function __construct(DocBlockTagReplacer $docBlockTagReplacer, DocBlockUpdater $docBlockUpdater) + public function __construct(DocBlockTagReplacer $docBlockTagReplacer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->docBlockTagReplacer = $docBlockTagReplacer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php b/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php index e216c1d58..5ec5e1d55 100644 --- a/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php +++ b/vendor/rector/rector/rules/Renaming/Rector/String_/RenameStringRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Scalar\String_; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,10 +18,19 @@ */ final class RenameStringRector extends AbstractRector implements ConfigurableRectorInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var array */ private $stringChanges = []; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change string value', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php b/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php index 1ca7456ab..ae4d15b5b 100644 --- a/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php +++ b/vendor/rector/rector/rules/Strict/Rector/Empty_/DisallowedEmptyRuleFixerRector.php @@ -87,7 +87,7 @@ private function refactorBooleanNot(BooleanNot $booleanNot, Scope $scope) : ?\Ph } $empty = $booleanNot->expr; if ($empty->expr instanceof ArrayDimFetch) { - return $this->createDimFetchBooleanAnd($empty); + return $this->createDimFetchBooleanAnd($empty->expr); } if ($this->exprAnalyzer->isNonTypedFromParam($empty->expr)) { return null; @@ -103,11 +103,11 @@ private function refactorEmpty(Empty_ $empty, Scope $scope, bool $treatAsNonEmpt $exprType = $scope->getNativeType($empty->expr); return $this->exactCompareFactory->createIdenticalFalsyCompare($exprType, $empty->expr, $treatAsNonEmpty); } - private function createDimFetchBooleanAnd(Empty_ $empty) : ?BooleanAnd + private function createDimFetchBooleanAnd(ArrayDimFetch $arrayDimFetch) : ?BooleanAnd { - $exprType = $this->getType($empty->expr); - $isset = new Isset_([$empty->expr]); - $compareExpr = $this->exactCompareFactory->createNotIdenticalFalsyCompare($exprType, $empty->expr, \false); + $exprType = $this->nodeTypeResolver->getNativeType($arrayDimFetch); + $isset = new Isset_([$arrayDimFetch]); + $compareExpr = $this->exactCompareFactory->createNotIdenticalFalsyCompare($exprType, $arrayDimFetch, \false); if (!$compareExpr instanceof Expr) { return null; } diff --git a/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php b/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php index 316850d37..a85c7b58e 100644 --- a/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/Attribute/AttributeKeyToClassConstFetchRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Attribute; use PhpParser\Node\Identifier; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Transform\ValueObject\AttributeKeyToClassConstFetch; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -20,10 +21,19 @@ */ final class AttributeKeyToClassConstFetchRector extends AbstractRector implements ConfigurableRectorInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var AttributeKeyToClassConstFetch[] */ private $attributeKeysToClassConstFetches = []; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Replace key value on specific attribute to class constant', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php b/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php index 3472b6671..bdd8fb3ff 100644 --- a/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php +++ b/vendor/rector/rector/rules/Transform/Rector/String_/StringToClassConstantRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Scalar\String_; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Transform\ValueObject\StringToClassConstant; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -16,10 +17,19 @@ */ final class StringToClassConstantRector extends AbstractRector implements ConfigurableRectorInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var StringToClassConstant[] */ private $stringsToClassConstants = []; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes strings to specific constants', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/rules/TypeDeclaration/Collector/ParentClassCollector.php b/vendor/rector/rector/rules/TypeDeclaration/Collector/ParentClassCollector.php new file mode 100644 index 000000000..49d88f0a1 --- /dev/null +++ b/vendor/rector/rector/rules/TypeDeclaration/Collector/ParentClassCollector.php @@ -0,0 +1,31 @@ + + */ +final class ParentClassCollector implements Collector +{ + public function getNodeType() : string + { + return Class_::class; + } + /** + * @param Class_ $node + * @return string[]|null + */ + public function processNode(Node $node, Scope $scope) : ?array + { + if (!$node->extends instanceof Name) { + return null; + } + return [$node->extends->toString()]; + } +} diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php index f0a6fd24e..f2d5cf3b4 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ArrowFunction/AddArrowFunctionReturnTypeRector.php @@ -46,7 +46,7 @@ public function refactor(Node $node) : ?Node return null; } $returnTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::RETURN); - if ($returnTypeNode === null) { + if (!$returnTypeNode instanceof Node) { return null; } $node->returnType = $returnTypeNode; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php index aac8e1d55..77ddafb4d 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/AddParamTypeBasedOnPHPUnitDataProviderRector.php @@ -18,7 +18,9 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory; @@ -41,6 +43,16 @@ final class AddParamTypeBasedOnPHPUnitDataProviderRector extends AbstractRector * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ private $testsNodeAnalyzer; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var string */ @@ -50,10 +62,12 @@ final class AddParamTypeBasedOnPHPUnitDataProviderRector extends AbstractRector * @var string */ private const METHOD_NAME_REGEX = '#^(?\\w+)(\\(\\))?#'; - public function __construct(TypeFactory $typeFactory, TestsNodeAnalyzer $testsNodeAnalyzer) + public function __construct(TypeFactory $typeFactory, TestsNodeAnalyzer $testsNodeAnalyzer, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder) { $this->typeFactory = $typeFactory; $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php index 1a171311d..0e6bd3681 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/BoolReturnTypeFromStrictScalarReturnsRector.php @@ -24,6 +24,8 @@ use PhpParser\Node\Stmt\Return_; 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\ValueObject\PhpVersionFeature; use Rector\TypeDeclaration\NodeAnalyzer\ReturnAnalyzer; @@ -45,10 +47,22 @@ final class BoolReturnTypeFromStrictScalarReturnsRector extends AbstractRector i * @var \PHPStan\Reflection\ReflectionProvider */ private $reflectionProvider; - public function __construct(ReturnAnalyzer $returnAnalyzer, ReflectionProvider $reflectionProvider) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ReturnAnalyzer $returnAnalyzer, ReflectionProvider $reflectionProvider, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder) { $this->returnAnalyzer = $returnAnalyzer; $this->reflectionProvider = $reflectionProvider; + $this->valueResolver = $valueResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php index 1450401a0..24235b7ca 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByMethodCallTypeRector.php @@ -16,6 +16,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\UnionType; use PHPStan\Analyser\Scope; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\TypeDeclaration\Guard\ParamTypeAddGuard; @@ -43,11 +44,17 @@ final class ParamTypeByMethodCallTypeRector extends AbstractScopeAwareRector * @var \Rector\TypeDeclaration\Guard\ParamTypeAddGuard */ private $paramTypeAddGuard; - public function __construct(CallerParamMatcher $callerParamMatcher, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, ParamTypeAddGuard $paramTypeAddGuard) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(CallerParamMatcher $callerParamMatcher, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, ParamTypeAddGuard $paramTypeAddGuard, BetterNodeFinder $betterNodeFinder) { $this->callerParamMatcher = $callerParamMatcher; $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; $this->paramTypeAddGuard = $paramTypeAddGuard; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php index 267726381..fd0349e34 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ParamTypeByParentCallTypeRector.php @@ -10,6 +10,7 @@ use PHPStan\Analyser\Scope; use PHPStan\Reflection\ClassReflection; use Rector\Core\Enum\ObjectReference; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -31,10 +32,16 @@ final class ParamTypeByParentCallTypeRector extends AbstractScopeAwareRector * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; - public function __construct(CallerParamMatcher $callerParamMatcher, ReflectionResolver $reflectionResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(CallerParamMatcher $callerParamMatcher, ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder) { $this->callerParamMatcher = $callerParamMatcher; $this->reflectionResolver = $reflectionResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php index 91e341817..317d989d7 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnNeverTypeRector.php @@ -15,6 +15,7 @@ use PhpParser\Node\Stmt\Throw_; use PHPStan\Analyser\Scope; use PHPStan\Type\NeverType; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeNestingScope\ValueObject\ControlStructure; @@ -34,9 +35,15 @@ final class ReturnNeverTypeRector extends AbstractScopeAwareRector implements Mi * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ private $classMethodReturnTypeOverrideGuard; - public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, BetterNodeFinder $betterNodeFinder) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php index 0903ae1f8..07c262b6e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromReturnNewRector.php @@ -4,6 +4,7 @@ namespace Rector\TypeDeclaration\Rector\ClassMethod; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\ArrowFunction; use PhpParser\Node\Expr\Closure; use PhpParser\Node\Expr\New_; @@ -23,6 +24,7 @@ use Rector\Core\Enum\ObjectReference; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\NodeAnalyzer\ClassAnalyzer; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\PhpVersionFeature; @@ -81,7 +83,12 @@ final class ReturnTypeFromReturnNewRector extends AbstractScopeAwareRector imple * @var \Rector\NodeTypeResolver\NodeTypeResolver\NewTypeResolver */ private $newTypeResolver; - public function __construct(TypeFactory $typeFactory, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, StrictReturnNewAnalyzer $strictReturnNewAnalyzer, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer, NewTypeResolver $newTypeResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(TypeFactory $typeFactory, ReflectionProvider $reflectionProvider, ReflectionResolver $reflectionResolver, StrictReturnNewAnalyzer $strictReturnNewAnalyzer, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer, ClassAnalyzer $classAnalyzer, NewTypeResolver $newTypeResolver, BetterNodeFinder $betterNodeFinder) { $this->typeFactory = $typeFactory; $this->reflectionProvider = $reflectionProvider; @@ -91,6 +98,7 @@ public function __construct(TypeFactory $typeFactory, ReflectionProvider $reflec $this->returnTypeInferer = $returnTypeInferer; $this->classAnalyzer = $classAnalyzer; $this->newTypeResolver = $newTypeResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { @@ -213,7 +221,15 @@ private function resolveReturnNewType(array $returns) : ?array { $newTypes = []; foreach ($returns as $return) { + if (!$return->expr instanceof Expr) { + return null; + } if (!$return->expr instanceof New_) { + $returnType = $this->nodeTypeResolver->getNativeType($return->expr); + if ($returnType instanceof ObjectType) { + $newTypes[] = $returnType; + continue; + } return null; } $new = $return->expr; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php index 9c4918777..be1580eb5 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictNewArrayRector.php @@ -22,7 +22,9 @@ use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersion; use Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer; @@ -50,11 +52,23 @@ final class ReturnTypeFromStrictNewArrayRector extends AbstractScopeAwareRector * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ private $returnTypeInferer; - public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder) { $this->phpDocTypeChanger = $phpDocTypeChanger; $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; $this->returnTypeInferer = $returnTypeInferer; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php index 0939ed1ee..a3ff436f2 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/ReturnTypeFromStrictTypedPropertyRector.php @@ -6,12 +6,14 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\PropertyFetch; +use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use PHPStan\Analyser\Scope; use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Type\MixedType; use PHPStan\Type\Type; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\PhpVersionFeature; @@ -41,11 +43,17 @@ final class ReturnTypeFromStrictTypedPropertyRector extends AbstractScopeAwareRe * @var \Rector\VendorLocker\NodeVendorLocker\ClassMethodReturnTypeOverrideGuard */ private $classMethodReturnTypeOverrideGuard; - public function __construct(TypeFactory $typeFactory, ReflectionResolver $reflectionResolver, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(TypeFactory $typeFactory, ReflectionResolver $reflectionResolver, ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, BetterNodeFinder $betterNodeFinder) { $this->typeFactory = $typeFactory; $this->reflectionResolver = $reflectionResolver; $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { @@ -123,7 +131,7 @@ private function resolveReturnPropertyType(ClassMethod $classMethod) : array if (!$return->expr instanceof Expr) { return []; } - if (!$return->expr instanceof PropertyFetch) { + if (!$return->expr instanceof PropertyFetch && !$return->expr instanceof StaticPropertyFetch) { return []; } $phpPropertyReflection = $this->reflectionResolver->resolvePropertyReflectionFromPropertyFetch($return->expr); diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php index f9e2a30b4..ce6b81986 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/ClassMethod/StrictStringParamConcatRector.php @@ -20,6 +20,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Rector\VendorLocker\ParentClassMethodTypeOverrideGuard; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -34,9 +35,15 @@ final class StrictStringParamConcatRector extends AbstractRector * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ private $parentClassMethodTypeOverrideGuard; - public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, PhpDocInfoFactory $phpDocInfoFactory) { $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php index bd58e9baa..9ed084858 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Class_/ReturnTypeFromStrictTernaryRector.php @@ -13,6 +13,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -37,10 +38,16 @@ final class ReturnTypeFromStrictTernaryRector extends AbstractScopeAwareRector i * @var \Rector\TypeDeclaration\TypeInferer\ReturnTypeInferer */ private $returnTypeInferer; - public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ClassMethodReturnTypeOverrideGuard $classMethodReturnTypeOverrideGuard, ReturnTypeInferer $returnTypeInferer, BetterNodeFinder $betterNodeFinder) { $this->classMethodReturnTypeOverrideGuard = $classMethodReturnTypeOverrideGuard; $this->returnTypeInferer = $returnTypeInferer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php index 61355e0d4..9dce0244d 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Empty_/EmptyOnNullableObjectToInstanceOfRector.php @@ -74,7 +74,7 @@ public function refactor(Node $node) : ?Node if ($empty->expr instanceof ArrayDimFetch) { return null; } - $exprType = $this->getType($empty->expr); + $exprType = $this->nodeTypeResolver->getNativeType($empty->expr); if (!$exprType instanceof ObjectType) { return null; } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php index 41bda5c05..08218e021 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/FunctionLike/AddParamTypeSplFixedArrayRector.php @@ -11,6 +11,7 @@ use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\TypeWithClassName; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -25,13 +26,19 @@ final class AddParamTypeSplFixedArrayRector extends AbstractRector * @var \Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger */ private $phpDocTypeChanger; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var array */ private const SPL_FIXED_ARRAY_TO_SINGLE = ['PhpCsFixer\\Tokenizer\\Tokens' => 'PhpCsFixer\\Tokenizer\\Token', 'PhpCsFixer\\Doctrine\\Annotation\\Tokens' => 'PhpCsFixer\\Doctrine\\Annotation\\Token']; - public function __construct(PhpDocTypeChanger $phpDocTypeChanger) + public function __construct(PhpDocTypeChanger $phpDocTypeChanger, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTypeChanger = $phpDocTypeChanger; + $this->phpDocInfoFactory = $phpDocInfoFactory; } /** * @return array> diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Param/ParamTypeFromStrictTypedPropertyRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Param/ParamTypeFromStrictTypedPropertyRector.php index 7b7f3d570..2d29c2654 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Param/ParamTypeFromStrictTypedPropertyRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Param/ParamTypeFromStrictTypedPropertyRector.php @@ -17,6 +17,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\PhpVersionFeature; @@ -41,10 +42,16 @@ final class ParamTypeFromStrictTypedPropertyRector extends AbstractScopeAwareRec * @var \Rector\VendorLocker\ParentClassMethodTypeOverrideGuard */ private $parentClassMethodTypeOverrideGuard; - public function __construct(ReflectionResolver $reflectionResolver, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ReflectionResolver $reflectionResolver, ParentClassMethodTypeOverrideGuard $parentClassMethodTypeOverrideGuard, BetterNodeFinder $betterNodeFinder) { $this->reflectionResolver = $reflectionResolver; $this->parentClassMethodTypeOverrideGuard = $parentClassMethodTypeOverrideGuard; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php index 54c5aae28..c7febcc0f 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/AddPropertyTypeDeclarationRector.php @@ -70,7 +70,7 @@ public function refactorWithScope(Node $node, Scope $scope) : ?Node continue; } $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($addPropertyTypeDeclaration->getType(), TypeKind::PROPERTY); - if ($typeNode === null) { + if (!$typeNode instanceof Node) { // invalid configuration throw new ShouldNotHappenException(); } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php index 5d234625c..b05891306 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromAssignsRector.php @@ -12,7 +12,9 @@ use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\PhpVersionFeature; @@ -54,6 +56,16 @@ final class TypedPropertyFromAssignsRector extends AbstractRector implements Min * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @api * @var string @@ -69,13 +81,15 @@ final class TypedPropertyFromAssignsRector extends AbstractRector implements Min * @var bool */ private $inlinePublic = \false; - public function __construct(AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer, PropertyTypeDecorator $propertyTypeDecorator, VarTagRemover $varTagRemover, MakePropertyTypedGuard $makePropertyTypedGuard, ReflectionResolver $reflectionResolver) + public function __construct(AllAssignNodePropertyTypeInferer $allAssignNodePropertyTypeInferer, PropertyTypeDecorator $propertyTypeDecorator, VarTagRemover $varTagRemover, MakePropertyTypedGuard $makePropertyTypedGuard, ReflectionResolver $reflectionResolver, PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver) { $this->allAssignNodePropertyTypeInferer = $allAssignNodePropertyTypeInferer; $this->propertyTypeDecorator = $propertyTypeDecorator; $this->varTagRemover = $varTagRemover; $this->makePropertyTypedGuard = $makePropertyTypedGuard; $this->reflectionResolver = $reflectionResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->valueResolver = $valueResolver; } public function configure(array $configuration) : void { @@ -148,7 +162,7 @@ public function refactor(Node $node) : ?Node } $inferredType = $this->decorateTypeWithNullableIfDefaultPropertyNull($property, $inferredType); $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($inferredType, TypeKind::PROPERTY); - if ($typeNode === null) { + if (!$typeNode instanceof Node) { continue; } $hasChanged = \true; diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorReadonlyClassRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorReadonlyClassRector.php index 84cadacd4..0a8325d55 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorReadonlyClassRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorReadonlyClassRector.php @@ -5,77 +5,18 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; -use PhpParser\Node\Stmt\ClassMethod; -use PhpParser\Node\Stmt\Property; use PHPStan\Analyser\Scope; -use PHPStan\Reflection\ClassReflection; -use PHPStan\Reflection\Php\PhpPropertyReflection; -use PHPStan\Type\MixedType; -use PHPStan\Type\Type; use Rector\Core\Rector\AbstractScopeAwareRector; -use Rector\Core\Reflection\ReflectionResolver; -use Rector\Core\ValueObject\MethodName; use Rector\Core\ValueObject\PhpVersionFeature; -use Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover; -use Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer; -use Rector\PHPStanStaticTypeMapper\Enum\TypeKind; -use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector; -use Rector\TypeDeclaration\Guard\PropertyTypeOverrideGuard; -use Rector\TypeDeclaration\TypeAnalyzer\PropertyTypeDefaultValueAnalyzer; -use Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\TrustedClassMethodPropertyTypeInferer; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** - * @see \Rector\Tests\TypeDeclaration\Rector\Property\TypedPropertyFromStrictConstructorReadonlyClassRector\TypedPropertyFromStrictConstructorReadonlyClassRectorTest + * @deprecated This rule is deprecated, as based on docblock and public elements, + * use private properties and property promotion instead to use PHP language features. */ final class TypedPropertyFromStrictConstructorReadonlyClassRector extends AbstractScopeAwareRector implements MinPhpVersionInterface { - /** - * @readonly - * @var \Rector\TypeDeclaration\TypeInferer\PropertyTypeInferer\TrustedClassMethodPropertyTypeInferer - */ - private $trustedClassMethodPropertyTypeInferer; - /** - * @readonly - * @var \Rector\DeadCode\PhpDoc\TagRemover\VarTagRemover - */ - private $varTagRemover; - /** - * @readonly - * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector - */ - private $constructorAssignDetector; - /** - * @readonly - * @var \Rector\TypeDeclaration\Guard\PropertyTypeOverrideGuard - */ - private $propertyTypeOverrideGuard; - /** - * @readonly - * @var \Rector\Core\Reflection\ReflectionResolver - */ - private $reflectionResolver; - /** - * @readonly - * @var \Rector\PHPStanStaticTypeMapper\DoctrineTypeAnalyzer - */ - private $doctrineTypeAnalyzer; - /** - * @readonly - * @var \Rector\TypeDeclaration\TypeAnalyzer\PropertyTypeDefaultValueAnalyzer - */ - private $propertyTypeDefaultValueAnalyzer; - public function __construct(TrustedClassMethodPropertyTypeInferer $trustedClassMethodPropertyTypeInferer, VarTagRemover $varTagRemover, ConstructorAssignDetector $constructorAssignDetector, PropertyTypeOverrideGuard $propertyTypeOverrideGuard, ReflectionResolver $reflectionResolver, DoctrineTypeAnalyzer $doctrineTypeAnalyzer, PropertyTypeDefaultValueAnalyzer $propertyTypeDefaultValueAnalyzer) - { - $this->trustedClassMethodPropertyTypeInferer = $trustedClassMethodPropertyTypeInferer; - $this->varTagRemover = $varTagRemover; - $this->constructorAssignDetector = $constructorAssignDetector; - $this->propertyTypeOverrideGuard = $propertyTypeOverrideGuard; - $this->reflectionResolver = $reflectionResolver; - $this->doctrineTypeAnalyzer = $doctrineTypeAnalyzer; - $this->propertyTypeDefaultValueAnalyzer = $propertyTypeDefaultValueAnalyzer; - } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Add typed public properties based only on strict constructor types in readonly classes', [new CodeSample(<<<'CODE_SAMPLE' @@ -120,69 +61,11 @@ public function getNodeTypes() : array */ public function refactorWithScope(Node $node, Scope $scope) : ?Node { - $constructClassMethod = $node->getMethod(MethodName::CONSTRUCT); - if (!$constructClassMethod instanceof ClassMethod || $node->getProperties() === []) { - return null; - } - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - if (!$classReflection instanceof ClassReflection) { - return null; - } - $hasChanged = \false; - foreach ($node->getProperties() as $property) { - if (!$this->propertyTypeOverrideGuard->isLegal($property, $classReflection)) { - continue; - } - $propertyType = $this->trustedClassMethodPropertyTypeInferer->inferProperty($node, $property, $constructClassMethod); - if ($this->shouldSkipProperty($property, $propertyType, $classReflection, $scope)) { - continue; - } - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); - $propertyTypeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); - if (!$propertyTypeNode instanceof Node) { - continue; - } - $propertyProperty = $property->props[0]; - $propertyName = $this->nodeNameResolver->getName($property); - if ($this->constructorAssignDetector->isPropertyAssigned($node, $propertyName)) { - $propertyProperty->default = null; - $hasChanged = \true; - } - if ($this->propertyTypeDefaultValueAnalyzer->doesConflictWithDefaultValue($propertyProperty, $propertyType)) { - continue; - } - $property->type = $propertyTypeNode; - $this->varTagRemover->removeVarTagIfUseless($phpDocInfo, $property); - $hasChanged = \true; - } - if ($hasChanged) { - return $node; - } + \trigger_error(\sprintf('The "%s" rule is deprecated as based on docblock and public elements. Use private properties and property promotion rules instead.', self::class), \E_USER_ERROR); return null; } public function provideMinPhpVersion() : int { return PhpVersionFeature::TYPED_PROPERTIES; } - private function shouldSkipProperty(Property $property, Type $propertyType, ClassReflection $classReflection, Scope $scope) : bool - { - if (!$property->isPublic()) { - return \true; - } - if ($propertyType instanceof MixedType) { - return \true; - } - if ($this->doctrineTypeAnalyzer->isInstanceOfCollectionType($propertyType)) { - return \true; - } - $isReadOnlyByPhpdoc = \false; - $propertyName = $this->nodeNameResolver->getName($property); - if ($classReflection->hasProperty($propertyName)) { - $propertyReflection = $classReflection->getProperty($propertyName, $scope); - if ($propertyReflection instanceof PhpPropertyReflection) { - $isReadOnlyByPhpdoc = $propertyReflection->isReadOnlyByPhpDoc(); - } - } - return !$isReadOnlyByPhpdoc; - } } diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php index 3380f7448..f4971ade2 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictConstructorRector.php @@ -9,6 +9,7 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Type\MixedType; use PHPStan\Type\Type; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; @@ -69,7 +70,12 @@ final class TypedPropertyFromStrictConstructorRector extends AbstractRector impl * @var \Rector\TypeDeclaration\TypeAnalyzer\PropertyTypeDefaultValueAnalyzer */ private $propertyTypeDefaultValueAnalyzer; - public function __construct(TrustedClassMethodPropertyTypeInferer $trustedClassMethodPropertyTypeInferer, VarTagRemover $varTagRemover, PhpDocTypeChanger $phpDocTypeChanger, ConstructorAssignDetector $constructorAssignDetector, PropertyTypeOverrideGuard $propertyTypeOverrideGuard, ReflectionResolver $reflectionResolver, DoctrineTypeAnalyzer $doctrineTypeAnalyzer, PropertyTypeDefaultValueAnalyzer $propertyTypeDefaultValueAnalyzer) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(TrustedClassMethodPropertyTypeInferer $trustedClassMethodPropertyTypeInferer, VarTagRemover $varTagRemover, PhpDocTypeChanger $phpDocTypeChanger, ConstructorAssignDetector $constructorAssignDetector, PropertyTypeOverrideGuard $propertyTypeOverrideGuard, ReflectionResolver $reflectionResolver, DoctrineTypeAnalyzer $doctrineTypeAnalyzer, PropertyTypeDefaultValueAnalyzer $propertyTypeDefaultValueAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->trustedClassMethodPropertyTypeInferer = $trustedClassMethodPropertyTypeInferer; $this->varTagRemover = $varTagRemover; @@ -79,6 +85,7 @@ public function __construct(TrustedClassMethodPropertyTypeInferer $trustedClassM $this->reflectionResolver = $reflectionResolver; $this->doctrineTypeAnalyzer = $doctrineTypeAnalyzer; $this->propertyTypeDefaultValueAnalyzer = $propertyTypeDefaultValueAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictGetterMethodReturnTypeRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictGetterMethodReturnTypeRector.php index ac00bf618..9cdef806e 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictGetterMethodReturnTypeRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/Property/TypedPropertyFromStrictGetterMethodReturnTypeRector.php @@ -13,6 +13,7 @@ use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Core\ValueObject\PhpVersionFeature; @@ -54,13 +55,19 @@ final class TypedPropertyFromStrictGetterMethodReturnTypeRector extends Abstract * @var \Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector */ private $constructorAssignDetector; - public function __construct(GetterTypeDeclarationPropertyTypeInferer $getterTypeDeclarationPropertyTypeInferer, VarTagRemover $varTagRemover, ParentPropertyLookupGuard $parentPropertyLookupGuard, ReflectionResolver $reflectionResolver, ConstructorAssignDetector $constructorAssignDetector) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(GetterTypeDeclarationPropertyTypeInferer $getterTypeDeclarationPropertyTypeInferer, VarTagRemover $varTagRemover, ParentPropertyLookupGuard $parentPropertyLookupGuard, ReflectionResolver $reflectionResolver, ConstructorAssignDetector $constructorAssignDetector, PhpDocInfoFactory $phpDocInfoFactory) { $this->getterTypeDeclarationPropertyTypeInferer = $getterTypeDeclarationPropertyTypeInferer; $this->varTagRemover = $varTagRemover; $this->parentPropertyLookupGuard = $parentPropertyLookupGuard; $this->reflectionResolver = $reflectionResolver; $this->constructorAssignDetector = $constructorAssignDetector; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php b/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php index c4b4abc62..c3dab8be2 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php +++ b/vendor/rector/rector/rules/TypeDeclaration/Rector/While_/WhileNullableToInstanceofRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\While_; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -26,9 +27,15 @@ final class WhileNullableToInstanceofRector extends AbstractRector * @var \Rector\TypeDeclaration\TypeAnalyzer\NullableTypeAnalyzer */ private $nullableTypeAnalyzer; - public function __construct(NullableTypeAnalyzer $nullableTypeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(NullableTypeAnalyzer $nullableTypeAnalyzer, ValueResolver $valueResolver) { $this->nullableTypeAnalyzer = $nullableTypeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php index 68420dfb0..ebaa18fbf 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeAnalyzer/NullableTypeAnalyzer.php @@ -20,7 +20,7 @@ public function __construct(NodeTypeResolver $nodeTypeResolver) } public function resolveNullableObjectType(Expr $expr) : ?\PHPStan\Type\ObjectType { - $exprType = $this->nodeTypeResolver->getType($expr); + $exprType = $this->nodeTypeResolver->getNativeType($expr); $baseType = TypeCombinator::removeNull($exprType); if (!$baseType instanceof ObjectType) { return null; diff --git a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php index 7a8c90a56..0aafd5d21 100644 --- a/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php +++ b/vendor/rector/rector/rules/TypeDeclaration/TypeInferer/PropertyTypeInferer/TrustedClassMethodPropertyTypeInferer.php @@ -114,7 +114,7 @@ public function inferProperty(Class_ $class, Property $property, ClassMethod $cl $assignedExprs = $this->classMethodPropertyFetchManipulator->findAssignsToPropertyName($classMethod, $propertyName); $resolvedTypes = []; foreach ($assignedExprs as $assignedExpr) { - $resolvedTypes[] = $this->nodeTypeResolver->getType($assignedExpr); + $resolvedTypes[] = $this->nodeTypeResolver->getNativeType($assignedExpr); } if ($resolvedTypes === []) { return new MixedType(); diff --git a/vendor/rector/rector/src/Application/ApplicationFileProcessor.php b/vendor/rector/rector/src/Application/ApplicationFileProcessor.php index 9f553eb16..657953812 100644 --- a/vendor/rector/rector/src/Application/ApplicationFileProcessor.php +++ b/vendor/rector/rector/src/Application/ApplicationFileProcessor.php @@ -123,7 +123,7 @@ public function run(Configuration $configuration, InputInterface $input) : Proce $preFileCallback = null; } if ($configuration->isParallel()) { - $processResult = $this->runParallel($filePaths, $input, $postFileCallback); + $processResult = $this->runParallel($filePaths, $configuration, $input, $postFileCallback); } else { $processResult = $this->processFiles($filePaths, $configuration, $preFileCallback, $postFileCallback); } @@ -219,7 +219,7 @@ private function restoreErrorHandler() : void * @param string[] $filePaths * @param callable(int $stepCount): void $postFileCallback */ - private function runParallel(array $filePaths, InputInterface $input, callable $postFileCallback) : ProcessResult + private function runParallel(array $filePaths, Configuration $configuration, InputInterface $input, callable $postFileCallback) : ProcessResult { $schedule = $this->scheduleFactory->create($this->cpuCoreCountProvider->provide(), SimpleParameterProvider::provideIntParameter(Option::PARALLEL_JOB_SIZE), SimpleParameterProvider::provideIntParameter(Option::PARALLEL_MAX_NUMBER_OF_PROCESSES), $filePaths); $mainScript = $this->resolveCalledRectorBinary(); @@ -227,7 +227,7 @@ private function runParallel(array $filePaths, InputInterface $input, callable $ throw new ParallelShouldNotHappenException('[parallel] Main script was not found'); } // mimics see https://github.com/phpstan/phpstan-src/commit/9124c66dcc55a222e21b1717ba5f60771f7dda92#diff-387b8f04e0db7a06678eb52ce0c0d0aff73e0d7d8fc5df834d0a5fbec198e5daR139 - return $this->parallelFileProcessor->process($schedule, $mainScript, $postFileCallback, $input); + return $this->parallelFileProcessor->process($schedule, $mainScript, $postFileCallback, $input, $configuration); } /** * Path to called "rector" binary file, e.g. "vendor/bin/rector" returns "vendor/bin/rector" This is needed to re-call the diff --git a/vendor/rector/rector/src/Application/Collector/CollectorNodeVisitor.php b/vendor/rector/rector/src/Application/Collector/CollectorNodeVisitor.php new file mode 100644 index 000000000..f6751e5d3 --- /dev/null +++ b/vendor/rector/rector/src/Application/Collector/CollectorNodeVisitor.php @@ -0,0 +1,66 @@ +collectorRegistry = $collectorRegistry; + } + /** + * @param Node[] $nodes + */ + public function beforeTraverse(array $nodes) : ?array + { + $this->collectedDatas = []; + return null; + } + public function enterNode(Node $node) + { + $collectors = $this->collectorRegistry->getCollectors(\get_class($node)); + /** @var Scope $scope */ + $scope = $node->getAttribute(AttributeKey::SCOPE); + foreach ($collectors as $collector) { + try { + $collectedData = $collector->processNode($node, $scope); + } catch (Throwable $exception) { + // nothing to collect + continue; + } + // no data collected + if ($collectedData === null) { + continue; + } + $this->collectedDatas[] = new CollectedData($collectedData, $scope->getFile(), \get_class($collector)); + } + return null; + } + /** + * @return CollectedData[] + */ + public function getCollectedData() : array + { + return $this->collectedDatas; + } +} diff --git a/vendor/rector/rector/src/Application/Collector/CollectorProcessor.php b/vendor/rector/rector/src/Application/Collector/CollectorProcessor.php new file mode 100644 index 000000000..9e6a7c1c0 --- /dev/null +++ b/vendor/rector/rector/src/Application/Collector/CollectorProcessor.php @@ -0,0 +1,38 @@ +collectorNodeVisitor = new \Rector\Core\Application\Collector\CollectorNodeVisitor($collectorRegistry); + $nodeTraverser->addVisitor($this->collectorNodeVisitor); + $this->nodeTraverser = $nodeTraverser; + } + /** + * @param Node[] $stmts + * @return CollectedData[] + */ + public function process(array $stmts) : array + { + $this->nodeTraverser->traverse($stmts); + return $this->collectorNodeVisitor->getCollectedData(); + } +} diff --git a/vendor/rector/rector/src/Application/FileProcessor.php b/vendor/rector/rector/src/Application/FileProcessor.php index 56f669a3a..40b49b8e8 100644 --- a/vendor/rector/rector/src/Application/FileProcessor.php +++ b/vendor/rector/rector/src/Application/FileProcessor.php @@ -3,11 +3,11 @@ declare (strict_types=1); namespace Rector\Core\Application; -use RectorPrefix202309\Nette\Utils\Strings; use PHPStan\AnalysedCodeException; use Rector\Caching\Detector\ChangedFilesDetector; use Rector\ChangesReporting\ValueObjectFactory\ErrorFactory; use Rector\ChangesReporting\ValueObjectFactory\FileDiffFactory; +use Rector\Core\Application\Collector\CollectorProcessor; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\FileSystem\FilePathHelper; use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; @@ -61,6 +61,11 @@ final class FileProcessor * @var \Rector\Core\FileSystem\FilePathHelper */ private $filePathHelper; + /** + * @readonly + * @var \Rector\Core\Application\Collector\CollectorProcessor + */ + private $collectorProcessor; /** * @readonly * @var \Rector\PostRector\Application\PostFileProcessor @@ -76,12 +81,7 @@ final class FileProcessor * @var \Rector\NodeTypeResolver\NodeScopeAndMetadataDecorator */ private $nodeScopeAndMetadataDecorator; - /** - * @var string - * @see https://regex101.com/r/xP2MGa/1 - */ - private const OPEN_TAG_SPACED_REGEX = '#^(?[^\\S\\r\\n]+\\<\\?php)#m'; - public function __construct(FormatPerservingPrinter $formatPerservingPrinter, RectorNodeTraverser $rectorNodeTraverser, SymfonyStyle $symfonyStyle, FileDiffFactory $fileDiffFactory, ChangedFilesDetector $changedFilesDetector, ErrorFactory $errorFactory, FilePathHelper $filePathHelper, PostFileProcessor $postFileProcessor, RectorParser $rectorParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator) + public function __construct(FormatPerservingPrinter $formatPerservingPrinter, RectorNodeTraverser $rectorNodeTraverser, SymfonyStyle $symfonyStyle, FileDiffFactory $fileDiffFactory, ChangedFilesDetector $changedFilesDetector, ErrorFactory $errorFactory, FilePathHelper $filePathHelper, CollectorProcessor $collectorProcessor, PostFileProcessor $postFileProcessor, RectorParser $rectorParser, NodeScopeAndMetadataDecorator $nodeScopeAndMetadataDecorator) { $this->formatPerservingPrinter = $formatPerservingPrinter; $this->rectorNodeTraverser = $rectorNodeTraverser; @@ -90,12 +90,17 @@ public function __construct(FormatPerservingPrinter $formatPerservingPrinter, Re $this->changedFilesDetector = $changedFilesDetector; $this->errorFactory = $errorFactory; $this->filePathHelper = $filePathHelper; + $this->collectorProcessor = $collectorProcessor; $this->postFileProcessor = $postFileProcessor; $this->rectorParser = $rectorParser; $this->nodeScopeAndMetadataDecorator = $nodeScopeAndMetadataDecorator; } public function processFile(File $file, Configuration $configuration) : FileProcessResult { + if ($configuration->isSecondRun() && $configuration->isCollectors()) { + // 2nd run + $this->rectorNodeTraverser->prepareCollectorRectorsRun($configuration); + } // 1. parse files to nodes $parsingSystemError = $this->parseFileAndDecorateNodes($file); if ($parsingSystemError instanceof SystemError) { @@ -108,6 +113,8 @@ public function processFile(File $file, Configuration $configuration) : FileProc do { $file->changeHasChanged(\false); $newStmts = $this->rectorNodeTraverser->traverse($file->getNewStmts()); + // collect data + $fileCollectedData = $configuration->isCollectors() ? $this->collectorProcessor->process($newStmts) : []; // apply post rectors $postNewStmts = $this->postFileProcessor->traverse($newStmts); // this is needed for new tokens added in "afterTraverse()" @@ -130,7 +137,7 @@ public function processFile(File $file, Configuration $configuration) : FileProc $currentFileDiff = $this->fileDiffFactory->createFileDiffWithLineChanges($file, $file->getOriginalFileContent(), $file->getFileContent(), $rectorWithLineChanges); $file->setFileDiff($currentFileDiff); } - return new FileProcessResult([], $file->getFileDiff(), []); + return new FileProcessResult([], $file->getFileDiff(), $fileCollectedData); } private function parseFileAndDecorateNodes(File $file) : ?SystemError { @@ -172,20 +179,16 @@ private function printFile(File $file, Configuration $configuration) : void if ($ltrimOriginalFileContent === $newContent) { return; } - $cleanOriginalContent = Strings::replace($ltrimOriginalFileContent, self::OPEN_TAG_SPACED_REGEX, 'isDryRun()) { - $this->formatPerservingPrinter->dumpFile($file->getFilePath(), $newContent); } + // change file content early to make $file->hasChanged() based on new content $file->changeFileContent($newContent); + if ($configuration->isDryRun()) { + return; + } + if (!$file->hasChanged()) { + return; + } + $this->formatPerservingPrinter->dumpFile($file->getFilePath(), $newContent); } private function parseFileNodes(File $file) : void { diff --git a/vendor/rector/rector/src/Application/VersionResolver.php b/vendor/rector/rector/src/Application/VersionResolver.php index 57f7c3699..312d37027 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.3'; + public const PACKAGE_VERSION = '0.18.4'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-09-12 22:14:26'; + public const RELEASE_DATE = '2023-09-24 19:06:50'; /** * @var int */ diff --git a/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php b/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php index 95ca558c1..13253fa44 100644 --- a/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php +++ b/vendor/rector/rector/src/Autoloading/BootstrapFilesIncluder.php @@ -34,6 +34,7 @@ public function includeBootstrapFiles() : void } private function requireRectorStubs() : void { + /** @var false|string $stubsRectorDirectory */ $stubsRectorDirectory = \realpath(__DIR__ . '/../../stubs-rector'); if ($stubsRectorDirectory === \false) { return; diff --git a/vendor/rector/rector/src/Configuration/ConfigurationFactory.php b/vendor/rector/rector/src/Configuration/ConfigurationFactory.php index 788d380d3..7659d6926 100644 --- a/vendor/rector/rector/src/Configuration/ConfigurationFactory.php +++ b/vendor/rector/rector/src/Configuration/ConfigurationFactory.php @@ -29,7 +29,8 @@ public function __construct(SymfonyStyle $symfonyStyle) public function createForTests(array $paths) : Configuration { $fileExtensions = SimpleParameterProvider::provideArrayParameter(\Rector\Core\Configuration\Option::FILE_EXTENSIONS); - return new Configuration(\false, \true, \false, ConsoleOutputFormatter::NAME, $fileExtensions, $paths); + $isCollectors = SimpleParameterProvider::provideBoolParameter(\Rector\Core\Configuration\Option::COLLECTORS, \false); + return new Configuration(\false, \true, \false, ConsoleOutputFormatter::NAME, $fileExtensions, $paths, \true, null, null, \false, null, \false, $isCollectors); } /** * Needs to run in the start of the life cycle, since the rest of workflow uses it. @@ -48,7 +49,8 @@ public function createFromInput(InputInterface $input) : Configuration $parallelIdentifier = (string) $input->getOption(\Rector\Core\Configuration\Option::PARALLEL_IDENTIFIER); $isDebug = (bool) $input->getOption(\Rector\Core\Configuration\Option::DEBUG); $memoryLimit = $this->resolveMemoryLimit($input); - return new Configuration($isDryRun, $showProgressBar, $shouldClearCache, $outputFormat, $fileExtensions, $paths, $showDiffs, $parallelPort, $parallelIdentifier, $isParallel, $memoryLimit, $isDebug); + $isCollectors = SimpleParameterProvider::provideBoolParameter(\Rector\Core\Configuration\Option::COLLECTORS); + return new Configuration($isDryRun, $showProgressBar, $shouldClearCache, $outputFormat, $fileExtensions, $paths, $showDiffs, $parallelPort, $parallelIdentifier, $isParallel, $memoryLimit, $isDebug, $isCollectors); } private function shouldShowProgressBar(InputInterface $input, string $outputFormat) : bool { diff --git a/vendor/rector/rector/src/Configuration/CurrentNodeProvider.php b/vendor/rector/rector/src/Configuration/CurrentNodeProvider.php deleted file mode 100644 index 49b423b94..000000000 --- a/vendor/rector/rector/src/Configuration/CurrentNodeProvider.php +++ /dev/null @@ -1,21 +0,0 @@ -node = $node; - } - public function getNode() : ?Node - { - return $this->node; - } -} diff --git a/vendor/rector/rector/src/Configuration/Option.php b/vendor/rector/rector/src/Configuration/Option.php index ac8c55e03..878635998 100644 --- a/vendor/rector/rector/src/Configuration/Option.php +++ b/vendor/rector/rector/src/Configuration/Option.php @@ -190,4 +190,9 @@ final class Option * @var string */ public const REGISTERED_RECTOR_SETS = 'registered_rector_sets'; + /** + * @internal + * @var string + */ + public const COLLECTORS = 'collectors'; } diff --git a/vendor/rector/rector/src/Console/Command/ProcessCommand.php b/vendor/rector/rector/src/Console/Command/ProcessCommand.php index 08bb1d035..7d35582df 100644 --- a/vendor/rector/rector/src/Console/Command/ProcessCommand.php +++ b/vendor/rector/rector/src/Console/Command/ProcessCommand.php @@ -115,8 +115,21 @@ protected function execute(InputInterface $input, OutputInterface $output) : int // MAIN PHASE // 2. run Rector $processResult = $this->applicationFileProcessor->run($configuration, $input); + // 3. collectors phase + if ($processResult->getCollectedData() !== []) { + $this->symfonyStyle->newLine(2); + $this->symfonyStyle->title('Running 2nd time with collectors data'); + $configuration->setCollectedData($processResult->getCollectedData()); + $configuration->enableSecondRun(); + // reset rules in Rector traverser + $nextProcessResult = $this->applicationFileProcessor->run($configuration, $input); + // @todo merge results here + $this->symfonyStyle->newLine(3); + // unset all rectors that are not collector + // set new collector rectors - have a custom tag? yes + } // REPORTING PHASE - // 3. reporting phase + // 4. reporting phaseRunning 2nd time with collectors data // report diffs and errors $outputFormat = $configuration->getOutputFormat(); $outputFormatter = $this->outputFormatterCollector->getByName($outputFormat); diff --git a/vendor/rector/rector/src/Console/Command/WorkerCommand.php b/vendor/rector/rector/src/Console/Command/WorkerCommand.php index 25386a9e6..42b7e505c 100644 --- a/vendor/rector/rector/src/Console/Command/WorkerCommand.php +++ b/vendor/rector/rector/src/Console/Command/WorkerCommand.php @@ -5,6 +5,7 @@ use RectorPrefix202309\Clue\React\NDJson\Decoder; use RectorPrefix202309\Clue\React\NDJson\Encoder; +use PHPStan\Collectors\CollectedData; use RectorPrefix202309\React\EventLoop\StreamSelectLoop; use RectorPrefix202309\React\Socket\ConnectionInterface; use RectorPrefix202309\React\Socket\TcpConnector; @@ -23,6 +24,7 @@ use RectorPrefix202309\Symplify\EasyParallel\Enum\ReactCommand; use RectorPrefix202309\Symplify\EasyParallel\Enum\ReactEvent; use Throwable; +use RectorPrefix202309\Webmozart\Assert\Assert; /** * Inspired at: https://github.com/phpstan/phpstan-src/commit/9124c66dcc55a222e21b1717ba5f60771f7dda92 * https://github.com/phpstan/phpstan-src/blob/c471c7b050e0929daf432288770de673b394a983/src/Command/WorkerCommand.php @@ -111,8 +113,22 @@ private function runWorker(Encoder $encoder, Decoder $decoder, Configuration $co if ($action !== Action::MAIN) { return; } + $previouslyCollectedDataItems = $json[Bridge::PREVIOUSLY_COLLECTED_DATA] ?? []; + if ($previouslyCollectedDataItems !== []) { + // turn to value objects + $previouslyCollectedDatas = []; + foreach ($previouslyCollectedDataItems as $previouslyCollectedDataItem) { + Assert::keyExists($previouslyCollectedDataItem, 'data'); + Assert::keyExists($previouslyCollectedDataItem, 'filePath'); + Assert::keyExists($previouslyCollectedDataItem, 'collectorType'); + $previouslyCollectedDatas[] = CollectedData::decode($previouslyCollectedDataItem); + } + $configuration->setCollectedData($previouslyCollectedDatas); + $configuration->enableSecondRun(); + } /** @var string[] $filePaths */ $filePaths = $json[Bridge::FILES] ?? []; + Assert::notEmpty($filePaths); $processResult = $this->applicationFileProcessor->processFiles($filePaths, $configuration, $preFileCallback); /** * this invokes all listeners listening $decoder->on(...) @see \Symplify\EasyParallel\Enum\ReactEvent::DATA diff --git a/vendor/rector/rector/src/Contract/Rector/CollectorRectorInterface.php b/vendor/rector/rector/src/Contract/Rector/CollectorRectorInterface.php new file mode 100644 index 000000000..07254ed49 --- /dev/null +++ b/vendor/rector/rector/src/Contract/Rector/CollectorRectorInterface.php @@ -0,0 +1,14 @@ +tagged($tagToForget); + foreach ($taggedClasses as $taggedClass) { + $container->offsetUnset(\get_class($taggedClass)); + } + // 2. forget tagged references + $privatesAccessor = new PrivatesAccessor(); + $privatesAccessor->propertyClosure($container, 'tags', static function (array $tags) use($tagToForget) : array { + unset($tags[$tagToForget]); + return $tags; + }); + } public static function forgetService(Container $container, string $typeToForget) : void { // 1. remove the service diff --git a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php index 959aff2c0..553453f6f 100644 --- a/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php +++ b/vendor/rector/rector/src/DependencyInjection/LazyContainerFactory.php @@ -9,6 +9,8 @@ use PhpParser\Lexer; use PHPStan\Analyser\NodeScopeResolver; use PHPStan\Analyser\ScopeFactory; +use PHPStan\Collectors\Collector; +use PHPStan\Collectors\Registry; use PHPStan\File\FileHelper; use PHPStan\Parser\Parser; use PHPStan\PhpDoc\TypeNodeResolver; @@ -57,6 +59,7 @@ use Rector\Core\Console\Style\RectorStyle; use Rector\Core\Console\Style\SymfonyStyleFactory; use Rector\Core\Contract\DependencyInjection\ResetableInterface; +use Rector\Core\Contract\Rector\CollectorRectorInterface; use Rector\Core\Contract\Rector\RectorInterface; use Rector\Core\NodeDecorator\CreatedByRuleDecorator; use Rector\Core\PhpParser\Comparing\NodeComparator; @@ -175,6 +178,7 @@ use Rector\StaticTypeMapper\PhpParser\StringNodeMapper; use Rector\StaticTypeMapper\PhpParser\UnionTypeNodeMapper; use Rector\StaticTypeMapper\StaticTypeMapper; +use Rector\TypeDeclaration\Collector\ParentClassCollector; use Rector\Utils\Command\MissingInSetCommand; use Rector\Utils\Command\OutsideAnySetCommand; use RectorPrefix202309\Symfony\Component\Console\Application; @@ -242,6 +246,10 @@ public function create() : RectorConfig { $rectorConfig = new RectorConfig(); $rectorConfig->import(__DIR__ . '/../../config/config.php'); + // rector collectors + $rectorConfig->when(Registry::class)->needs('$collectors')->giveTagged(Collector::class); + // @todo collectors - just for testing purpose + $rectorConfig->collector(ParentClassCollector::class); $rectorConfig->singleton(Application::class, static function (Container $container) : Application { $application = $container->make(ConsoleApplication::class); $commandNamesToHide = ['list', 'completion', 'help']; @@ -274,6 +282,7 @@ public function create() : RectorConfig $rectorConfig->when(ConstExprParser::class)->needs('$usedAttributes')->give(['lines' => \true, 'indexes' => \true]); $rectorConfig->alias(TypeParser::class, BetterTypeParser::class); $rectorConfig->when(RectorNodeTraverser::class)->needs('$rectors')->giveTagged(RectorInterface::class); + $rectorConfig->when(RectorNodeTraverser::class)->needs('$collectorRectors')->giveTagged(CollectorRectorInterface::class); $rectorConfig->when(ConfigInitializer::class)->needs('$rectors')->giveTagged(RectorInterface::class); $rectorConfig->when(ClassNameImportSkipper::class)->needs('$classNameImportSkipVoters')->giveTagged(ClassNameImportSkipVoterInterface::class); $rectorConfig->singleton(DynamicSourceLocatorProvider::class, static function (Container $container) : DynamicSourceLocatorProvider { @@ -304,7 +313,24 @@ public function create() : RectorConfig $rectorConfig->when(Skipper::class)->needs('$skipVoters')->giveTagged(SkipVoterInterface::class); $this->registerTagged($rectorConfig, self::SKIP_VOTER_CLASSES, SkipVoterInterface::class); $rectorConfig->afterResolving(AbstractRector::class, static function (AbstractRector $rector, Container $container) : void { - $rector->autowire($container->make(NodeNameResolver::class), $container->make(NodeTypeResolver::class), $container->make(SimpleCallableNodeTraverser::class), $container->make(NodeFactory::class), $container->make(PhpDocInfoFactory::class), $container->make(StaticTypeMapper::class), $container->make(Skipper::class), $container->make(ValueResolver::class), $container->make(BetterNodeFinder::class), $container->make(NodeComparator::class), $container->make(CurrentFileProvider::class), $container->make(CreatedByRuleDecorator::class), $container->make(ChangedNodeScopeRefresher::class)); + $rector->autowire( + $container->get(NodeNameResolver::class), + $container->get(NodeTypeResolver::class), + $container->get(SimpleCallableNodeTraverser::class), + $container->get(NodeFactory::class), + // @deprecated, use injected service in your Rector rules + $container->get(PhpDocInfoFactory::class), + $container->get(StaticTypeMapper::class), + $container->get(Skipper::class), + // @deprecated, use injected service in your Rector rules + $container->get(ValueResolver::class), + // @deprecated, use injected service in your Rector rules + $container->get(BetterNodeFinder::class), + $container->get(NodeComparator::class), + $container->get(CurrentFileProvider::class), + $container->get(CreatedByRuleDecorator::class), + $container->get(ChangedNodeScopeRefresher::class) + ); }); $this->registerTagged($rectorConfig, self::PHP_PARSER_NODE_MAPPER_CLASSES, PhpParserNodeMapperInterface::class); $this->registerTagged($rectorConfig, self::PHP_DOC_NODE_DECORATOR_CLASSES, PhpDocNodeDecoratorInterface::class); diff --git a/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php b/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php index bc931faf6..94e99c1b0 100644 --- a/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php +++ b/vendor/rector/rector/src/NodeAnalyzer/PropertyFetchAnalyzer.php @@ -103,6 +103,9 @@ public function containsLocalPropertyFetchName(Trait_ $trait, string $propertyNa return $this->isLocalPropertyFetchName($node, $propertyName); }); } + /** + * @phpstan-assert-if-true PropertyFetch|StaticPropertyFetch $node + */ public function isPropertyFetch(Node $node) : bool { if ($node instanceof PropertyFetch) { diff --git a/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php b/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php index a3635d970..bf6a76700 100644 --- a/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php +++ b/vendor/rector/rector/src/NodeDecorator/PropertyTypeDecorator.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\Core\NodeDecorator; +use PhpParser\Node; use PhpParser\Node\Stmt\Property; use PHPStan\Type\Generic\GenericObjectType; use PHPStan\Type\Type; @@ -49,7 +50,7 @@ public function decorate(Property $property, ?Type $type) : void $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); if ($this->phpVersionProvider->isAtLeastPhpVersion(PhpVersionFeature::TYPED_PROPERTIES)) { $phpParserType = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::PROPERTY); - if ($phpParserType !== null) { + if ($phpParserType instanceof Node) { $property->type = $phpParserType; if ($type instanceof GenericObjectType) { $this->phpDocTypeChanger->changeVarType($property, $phpDocInfo, $type); diff --git a/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php b/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php index e6c7fc8c9..d15c30ca7 100644 --- a/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php +++ b/vendor/rector/rector/src/PhpParser/Node/NodeFactory.php @@ -159,7 +159,7 @@ public function createParamFromNameAndType(string $name, ?Type $type) : Param $param = new ParamBuilder($name); if ($type instanceof Type) { $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($type, TypeKind::PARAM); - if ($typeNode !== null) { + if ($typeNode instanceof Node) { $param->setType($typeNode); } } @@ -279,7 +279,7 @@ public function createPromotedPropertyParam(PropertyMetadata $propertyMetadata) $propertyType = $propertyMetadata->getType(); if ($propertyType instanceof Type) { $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); - if ($typeNode !== null) { + if ($typeNode instanceof Node) { $paramBuilder->setType($typeNode); } } diff --git a/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php b/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php index 38de86042..9d76eace9 100644 --- a/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php +++ b/vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php @@ -5,7 +5,10 @@ use PhpParser\Node; use PhpParser\NodeTraverser; +use PHPStan\Node\CollectedDataNode; +use Rector\Core\Contract\Rector\CollectorRectorInterface; use Rector\Core\Contract\Rector\RectorInterface; +use Rector\Core\ValueObject\Configuration; use Rector\VersionBonding\PhpVersionedFilter; final class RectorNodeTraverser extends NodeTraverser { @@ -13,6 +16,10 @@ final class RectorNodeTraverser extends NodeTraverser * @var RectorInterface[] */ private $rectors; + /** + * @var CollectorRectorInterface[] + */ + private $collectorRectors; /** * @readonly * @var \Rector\VersionBonding\PhpVersionedFilter @@ -24,10 +31,12 @@ final class RectorNodeTraverser extends NodeTraverser private $areNodeVisitorsPrepared = \false; /** * @param RectorInterface[] $rectors + * @param CollectorRectorInterface[] $collectorRectors */ - public function __construct(array $rectors, PhpVersionedFilter $phpVersionedFilter) + public function __construct(array $rectors, array $collectorRectors, PhpVersionedFilter $phpVersionedFilter) { $this->rectors = $rectors; + $this->collectorRectors = $collectorRectors; $this->phpVersionedFilter = $phpVersionedFilter; parent::__construct(); } @@ -50,6 +59,19 @@ public function refreshPhpRectors(array $rectors) : void $this->visitors = []; $this->areNodeVisitorsPrepared = \false; } + public function prepareCollectorRectorsRun(Configuration $configuration) : void + { + if ($this->collectorRectors === []) { + return; + } + $collectedDataNode = new CollectedDataNode($configuration->getCollectedData(), \false); + // hydrate abstract collector rector with configuration + foreach ($this->collectorRectors as $collectorRector) { + $collectorRector->setCollectedDataNode($collectedDataNode); + } + $this->visitors = $this->collectorRectors; + $this->areNodeVisitorsPrepared = \true; + } /** * This must happen after $this->configuration is set after ProcessCommand::execute() is run, * otherwise we get default false positives. @@ -62,8 +84,11 @@ private function prepareNodeVisitors() : void return; } // filer out by version - $activePhpRectors = $this->phpVersionedFilter->filter($this->rectors); - $this->visitors = $this->visitors === [] ? $activePhpRectors : \array_merge($this->visitors, $activePhpRectors); + $activeRectors = $this->phpVersionedFilter->filter($this->rectors); + $nonCollectorActiveRectors = \array_filter($activeRectors, static function (RectorInterface $rector) : bool { + return !$rector instanceof CollectorRectorInterface; + }); + $this->visitors = \array_merge($this->visitors, $nonCollectorActiveRectors); $this->areNodeVisitorsPrepared = \true; } } diff --git a/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php b/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php index 35072b27d..4e3a8195c 100644 --- a/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php +++ b/vendor/rector/rector/src/ProcessAnalyzer/RectifiedAnalyzer.php @@ -38,7 +38,7 @@ private function hasConsecutiveCreatedByRule(string $rectorClass, Node $node, ?N /** @var class-string[] $createdByRule */ $createdByRule = $createdByRuleNode->getAttribute(AttributeKey::CREATED_BY_RULE) ?? []; if ($createdByRule === []) { - return \false; + return !$originalNode instanceof Node && \count($node->getAttributes()) <= 1; } return \end($createdByRule) === $rectorClass; } diff --git a/vendor/rector/rector/src/Rector/AbstractCollectorRector.php b/vendor/rector/rector/src/Rector/AbstractCollectorRector.php new file mode 100644 index 000000000..f78a33124 --- /dev/null +++ b/vendor/rector/rector/src/Rector/AbstractCollectorRector.php @@ -0,0 +1,32 @@ +collectedDataNode = $collectedDataNode; + } + public function getCollectedDataNode() : CollectedDataNode + { + if (!$this->collectedDataNode instanceof CollectedDataNode) { + throw new ShouldNotHappenException('CollectedDataNode is not set'); + } + // this should be called only from CollectorRectorInterface + return $this->collectedDataNode; + } +} diff --git a/vendor/rector/rector/src/Rector/AbstractRector.php b/vendor/rector/rector/src/Rector/AbstractRector.php index 0138bdf4e..2965ff923 100644 --- a/vendor/rector/rector/src/Rector/AbstractRector.php +++ b/vendor/rector/rector/src/Rector/AbstractRector.php @@ -29,6 +29,13 @@ use Rector\PhpDocParser\NodeTraverser\SimpleCallableNodeTraverser; use Rector\Skipper\Skipper\Skipper; use Rector\StaticTypeMapper\StaticTypeMapper; +/** + * @property-read PhpDocInfoFactory $phpDocInfoFactory; @deprecated The parent AbstractRector dependency is deprecated and will be removed. Use dependency injection in your own rule instead. + * + * @property-read ValueResolver $valueResolver; @deprecated The parent AbstractRector dependency is deprecated and will be removed. Use dependency injection in your own rule instead. + * + * @property-read BetterNodeFinder $betterNodeFinder; @deprecated The parent AbstractRector dependency is deprecated and will be removed. Use dependency injection in your own rule instead. + */ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInterface { /** @@ -57,22 +64,10 @@ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInter * @var \Rector\StaticTypeMapper\StaticTypeMapper */ protected $staticTypeMapper; - /** - * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory - */ - protected $phpDocInfoFactory; /** * @var \Rector\Core\PhpParser\Node\NodeFactory */ protected $nodeFactory; - /** - * @var \Rector\Core\PhpParser\Node\Value\ValueResolver - */ - protected $valueResolver; - /** - * @var \Rector\Core\PhpParser\Node\BetterNodeFinder - */ - protected $betterNodeFinder; /** * @var \Rector\Core\PhpParser\Comparing\NodeComparator */ @@ -109,21 +104,42 @@ abstract class AbstractRector extends NodeVisitorAbstract implements RectorInter * @var int|null */ private $toBeRemovedNodeId; + /** + * @var array + */ + private $deprecatedDependencies = []; + /** + * @var array> + */ + private $cachedDeprecatedDependenciesWarning = []; + /** + * Handle deprecated dependencies compatbility + * @return mixed + */ + public function __get(string $name) + { + if (!isset($this->cachedDeprecatedDependenciesWarning[static::class][$name])) { + echo \sprintf('Get %s property from AbstractRector on %s is deprecated, inject via __construct() instead', $name, static::class); + echo \PHP_EOL; + $this->cachedDeprecatedDependenciesWarning[static::class][$name] = \true; + } + return $this->deprecatedDependencies[$name] ?? null; + } public function autowire(NodeNameResolver $nodeNameResolver, NodeTypeResolver $nodeTypeResolver, SimpleCallableNodeTraverser $simpleCallableNodeTraverser, NodeFactory $nodeFactory, PhpDocInfoFactory $phpDocInfoFactory, StaticTypeMapper $staticTypeMapper, Skipper $skipper, ValueResolver $valueResolver, BetterNodeFinder $betterNodeFinder, NodeComparator $nodeComparator, CurrentFileProvider $currentFileProvider, CreatedByRuleDecorator $createdByRuleDecorator, ChangedNodeScopeRefresher $changedNodeScopeRefresher) : void { $this->nodeNameResolver = $nodeNameResolver; $this->nodeTypeResolver = $nodeTypeResolver; $this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser; $this->nodeFactory = $nodeFactory; - $this->phpDocInfoFactory = $phpDocInfoFactory; $this->staticTypeMapper = $staticTypeMapper; $this->skipper = $skipper; - $this->valueResolver = $valueResolver; - $this->betterNodeFinder = $betterNodeFinder; $this->nodeComparator = $nodeComparator; $this->currentFileProvider = $currentFileProvider; $this->createdByRuleDecorator = $createdByRuleDecorator; $this->changedNodeScopeRefresher = $changedNodeScopeRefresher; + $this->deprecatedDependencies['phpDocInfoFactory'] = $phpDocInfoFactory; + $this->deprecatedDependencies['valueResolver'] = $valueResolver; + $this->deprecatedDependencies['betterNodeFinder'] = $betterNodeFinder; } /** * @return Node[]|null diff --git a/vendor/rector/rector/src/ValueObject/Configuration.php b/vendor/rector/rector/src/ValueObject/Configuration.php index a6e0d9922..a0ac108f8 100644 --- a/vendor/rector/rector/src/ValueObject/Configuration.php +++ b/vendor/rector/rector/src/ValueObject/Configuration.php @@ -3,6 +3,7 @@ declare (strict_types=1); namespace Rector\Core\ValueObject; +use PHPStan\Collectors\CollectedData; use Rector\ChangesReporting\Output\ConsoleOutputFormatter; use RectorPrefix202309\Webmozart\Assert\Assert; final class Configuration @@ -67,11 +68,24 @@ final class Configuration * @var bool */ private $isDebug = \false; + /** + * @readonly + * @var bool + */ + private $isCollectors = \false; + /** + * @var bool + */ + private $isSecondRun = \false; + /** + * @var CollectedData[] + */ + private $collectedData = []; /** * @param string[] $fileExtensions * @param string[] $paths */ - public function __construct(bool $isDryRun = \false, bool $showProgressBar = \true, bool $shouldClearCache = \false, string $outputFormat = ConsoleOutputFormatter::NAME, array $fileExtensions = ['php'], array $paths = [], bool $showDiffs = \true, ?string $parallelPort = null, ?string $parallelIdentifier = null, bool $isParallel = \false, ?string $memoryLimit = null, bool $isDebug = \false) + public function __construct(bool $isDryRun = \false, bool $showProgressBar = \true, bool $shouldClearCache = \false, string $outputFormat = ConsoleOutputFormatter::NAME, array $fileExtensions = ['php'], array $paths = [], bool $showDiffs = \true, ?string $parallelPort = null, ?string $parallelIdentifier = null, bool $isParallel = \false, ?string $memoryLimit = null, bool $isDebug = \false, bool $isCollectors = \false) { $this->isDryRun = $isDryRun; $this->showProgressBar = $showProgressBar; @@ -85,6 +99,7 @@ public function __construct(bool $isDryRun = \false, bool $showProgressBar = \tr $this->isParallel = $isParallel; $this->memoryLimit = $memoryLimit; $this->isDebug = $isDebug; + $this->isCollectors = $isCollectors; } public function isDryRun() : bool { @@ -141,4 +156,46 @@ public function isDebug() : bool { return $this->isDebug; } + /** + * @param CollectedData[] $collectedData + */ + public function setCollectedData(array $collectedData) : void + { + $this->collectedData = $collectedData; + } + /** + * @return CollectedData[] + */ + public function getCollectedData() : array + { + return $this->collectedData; + } + /** + * @api + */ + public function enableSecondRun() : void + { + $this->isSecondRun = \true; + } + /** + * @api + */ + public function isSecondRun() : bool + { + return $this->isSecondRun; + } + /** + * @api used in tests + */ + public function reset() : void + { + $this->isSecondRun = \false; + } + /** + * @api + */ + public function isCollectors() : bool + { + return $this->isCollectors; + } } diff --git a/vendor/rector/rector/src/ValueObject/Error/SystemError.php b/vendor/rector/rector/src/ValueObject/Error/SystemError.php index 97fb95c1d..2da973f5e 100644 --- a/vendor/rector/rector/src/ValueObject/Error/SystemError.php +++ b/vendor/rector/rector/src/ValueObject/Error/SystemError.php @@ -3,7 +3,7 @@ declare (strict_types=1); namespace Rector\Core\ValueObject\Error; -use Rector\Parallel\ValueObject\Name; +use Rector\Parallel\ValueObject\BridgeItem; use RectorPrefix202309\Symplify\EasyParallel\Contract\SerializableInterface; final class SystemError implements SerializableInterface { @@ -55,7 +55,7 @@ public function getRelativeFilePath() : ?string */ public function jsonSerialize() : array { - return [Name::MESSAGE => $this->message, Name::RELATIVE_FILE_PATH => $this->relativeFilePath, Name::LINE => $this->line, Name::RECTOR_CLASS => $this->rectorClass]; + return [BridgeItem::MESSAGE => $this->message, BridgeItem::RELATIVE_FILE_PATH => $this->relativeFilePath, BridgeItem::LINE => $this->line, BridgeItem::RECTOR_CLASS => $this->rectorClass]; } /** * @param mixed[] $json @@ -63,7 +63,7 @@ public function jsonSerialize() : array */ public static function decode(array $json) : \RectorPrefix202309\Symplify\EasyParallel\Contract\SerializableInterface { - return new self($json[Name::MESSAGE], $json[Name::RELATIVE_FILE_PATH], $json[Name::LINE], $json[Name::RECTOR_CLASS]); + return new self($json[BridgeItem::MESSAGE], $json[BridgeItem::RELATIVE_FILE_PATH], $json[BridgeItem::LINE], $json[BridgeItem::RECTOR_CLASS]); } public function getRectorClass() : ?string { diff --git a/vendor/rector/rector/src/ValueObject/FileProcessResult.php b/vendor/rector/rector/src/ValueObject/FileProcessResult.php index 6acbb9f05..f1e82fe84 100644 --- a/vendor/rector/rector/src/ValueObject/FileProcessResult.php +++ b/vendor/rector/rector/src/ValueObject/FileProcessResult.php @@ -6,6 +6,7 @@ use PHPStan\Collectors\CollectedData; use Rector\Core\ValueObject\Error\SystemError; use Rector\Core\ValueObject\Reporting\FileDiff; +use RectorPrefix202309\Webmozart\Assert\Assert; final class FileProcessResult { /** @@ -22,16 +23,18 @@ final class FileProcessResult * @var CollectedData[] * @readonly */ - private $collectedData; + private $collectedDatas; /** * @param SystemError[] $systemErrors - * @param CollectedData[] $collectedData + * @param CollectedData[] $collectedDatas */ - public function __construct(array $systemErrors, ?FileDiff $fileDiff, array $collectedData) + public function __construct(array $systemErrors, ?FileDiff $fileDiff, array $collectedDatas) { $this->systemErrors = $systemErrors; $this->fileDiff = $fileDiff; - $this->collectedData = $collectedData; + $this->collectedDatas = $collectedDatas; + Assert::allIsInstanceOf($systemErrors, SystemError::class); + Assert::allIsInstanceOf($collectedDatas, CollectedData::class); } /** * @return SystemError[] @@ -49,6 +52,6 @@ public function getFileDiff() : ?FileDiff */ public function getCollectedData() : array { - return $this->collectedData; + return $this->collectedDatas; } } diff --git a/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php b/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php index c7e292ab6..3fe30e0f9 100644 --- a/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php +++ b/vendor/rector/rector/src/ValueObject/Reporting/FileDiff.php @@ -6,7 +6,7 @@ use RectorPrefix202309\Nette\Utils\Strings; use Rector\ChangesReporting\ValueObject\RectorWithLineChange; use Rector\Core\Contract\Rector\RectorInterface; -use Rector\Parallel\ValueObject\Name; +use Rector\Parallel\ValueObject\BridgeItem; use RectorPrefix202309\Symplify\EasyParallel\Contract\SerializableInterface; use RectorPrefix202309\Webmozart\Assert\Assert; final class FileDiff implements SerializableInterface @@ -95,7 +95,7 @@ public function getFirstLineNumber() : ?int */ public function jsonSerialize() : array { - return [Name::RELATIVE_FILE_PATH => $this->relativeFilePath, Name::DIFF => $this->diff, Name::DIFF_CONSOLE_FORMATTED => $this->diffConsoleFormatted, Name::RECTORS_WITH_LINE_CHANGES => $this->rectorsWithLineChanges]; + return [BridgeItem::RELATIVE_FILE_PATH => $this->relativeFilePath, BridgeItem::DIFF => $this->diff, BridgeItem::DIFF_CONSOLE_FORMATTED => $this->diffConsoleFormatted, BridgeItem::RECTORS_WITH_LINE_CHANGES => $this->rectorsWithLineChanges]; } /** * @param array $json @@ -104,10 +104,10 @@ public function jsonSerialize() : array public static function decode(array $json) : \RectorPrefix202309\Symplify\EasyParallel\Contract\SerializableInterface { $rectorWithLineChanges = []; - foreach ($json[Name::RECTORS_WITH_LINE_CHANGES] as $rectorWithLineChangesJson) { + foreach ($json[BridgeItem::RECTORS_WITH_LINE_CHANGES] as $rectorWithLineChangesJson) { $rectorWithLineChanges[] = RectorWithLineChange::decode($rectorWithLineChangesJson); } - return new self($json[Name::RELATIVE_FILE_PATH], $json[Name::DIFF], $json[Name::DIFF_CONSOLE_FORMATTED], $rectorWithLineChanges); + return new self($json[BridgeItem::RELATIVE_FILE_PATH], $json[BridgeItem::DIFF], $json[BridgeItem::DIFF_CONSOLE_FORMATTED], $rectorWithLineChanges); } /** * @template TType as object diff --git a/vendor/rector/rector/vendor/autoload.php b/vendor/rector/rector/vendor/autoload.php index c5c126506..6339de8b4 100644 --- a/vendor/rector/rector/vendor/autoload.php +++ b/vendor/rector/rector/vendor/autoload.php @@ -22,4 +22,4 @@ require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit74b494968d871723f2b2948ff265d302::getLoader(); +return ComposerAutoloaderInitfb8962cd04c9733c8bc7564499948ec7::getLoader(); diff --git a/vendor/rector/rector/vendor/composer/autoload_classmap.php b/vendor/rector/rector/vendor/composer/autoload_classmap.php index 137149527..bd829148b 100644 --- a/vendor/rector/rector/vendor/composer/autoload_classmap.php +++ b/vendor/rector/rector/vendor/composer/autoload_classmap.php @@ -1147,6 +1147,8 @@ 'Rector\\Config\\RectorConfig' => $baseDir . '/packages/Config/RectorConfig.php', 'Rector\\Core\\Application\\ApplicationFileProcessor' => $baseDir . '/src/Application/ApplicationFileProcessor.php', 'Rector\\Core\\Application\\ChangedNodeScopeRefresher' => $baseDir . '/src/Application/ChangedNodeScopeRefresher.php', + 'Rector\\Core\\Application\\Collector\\CollectorNodeVisitor' => $baseDir . '/src/Application/Collector/CollectorNodeVisitor.php', + 'Rector\\Core\\Application\\Collector\\CollectorProcessor' => $baseDir . '/src/Application/Collector/CollectorProcessor.php', 'Rector\\Core\\Application\\FileProcessor' => $baseDir . '/src/Application/FileProcessor.php', 'Rector\\Core\\Application\\VersionResolver' => $baseDir . '/src/Application/VersionResolver.php', 'Rector\\Core\\Autoloading\\AdditionalAutoloader' => $baseDir . '/src/Autoloading/AdditionalAutoloader.php', @@ -1155,7 +1157,6 @@ 'Rector\\Core\\Bootstrap\\RectorConfigsResolver' => $baseDir . '/src/Bootstrap/RectorConfigsResolver.php', 'Rector\\Core\\Configuration\\ConfigInitializer' => $baseDir . '/src/Configuration/ConfigInitializer.php', 'Rector\\Core\\Configuration\\ConfigurationFactory' => $baseDir . '/src/Configuration/ConfigurationFactory.php', - 'Rector\\Core\\Configuration\\CurrentNodeProvider' => $baseDir . '/src/Configuration/CurrentNodeProvider.php', 'Rector\\Core\\Configuration\\Option' => $baseDir . '/src/Configuration/Option.php', 'Rector\\Core\\Configuration\\Parameter\\SimpleParameterProvider' => $baseDir . '/src/Configuration/Parameter/SimpleParameterProvider.php', 'Rector\\Core\\Configuration\\RenamedClassesDataCollector' => $baseDir . '/src/Configuration/RenamedClassesDataCollector.php', @@ -1174,6 +1175,7 @@ 'Rector\\Core\\Console\\Style\\SymfonyStyleFactory' => $baseDir . '/src/Console/Style/SymfonyStyleFactory.php', 'Rector\\Core\\Contract\\DependencyInjection\\ResetableInterface' => $baseDir . '/src/Contract/DependencyInjection/ResetableInterface.php', 'Rector\\Core\\Contract\\PhpParser\\Node\\StmtsAwareInterface' => $baseDir . '/src/Contract/PhpParser/Node/StmtsAwareInterface.php', + 'Rector\\Core\\Contract\\Rector\\CollectorRectorInterface' => $baseDir . '/src/Contract/Rector/CollectorRectorInterface.php', 'Rector\\Core\\Contract\\Rector\\ConfigurableRectorInterface' => $baseDir . '/src/Contract/Rector/ConfigurableRectorInterface.php', 'Rector\\Core\\Contract\\Rector\\RectorInterface' => $baseDir . '/src/Contract/Rector/RectorInterface.php', 'Rector\\Core\\Contract\\Rector\\ScopeAwareRectorInterface' => $baseDir . '/src/Contract/Rector/ScopeAwareRectorInterface.php', @@ -1258,6 +1260,7 @@ 'Rector\\Core\\Php\\ReservedKeywordAnalyzer' => $baseDir . '/src/Php/ReservedKeywordAnalyzer.php', 'Rector\\Core\\ProcessAnalyzer\\RectifiedAnalyzer' => $baseDir . '/src/ProcessAnalyzer/RectifiedAnalyzer.php', 'Rector\\Core\\Provider\\CurrentFileProvider' => $baseDir . '/src/Provider/CurrentFileProvider.php', + 'Rector\\Core\\Rector\\AbstractCollectorRector' => $baseDir . '/src/Rector/AbstractCollectorRector.php', 'Rector\\Core\\Rector\\AbstractRector' => $baseDir . '/src/Rector/AbstractRector.php', 'Rector\\Core\\Rector\\AbstractScopeAwareRector' => $baseDir . '/src/Rector/AbstractScopeAwareRector.php', 'Rector\\Core\\Reflection\\ClassReflectionAnalyzer' => $baseDir . '/src/Reflection/ClassReflectionAnalyzer.php', @@ -1356,6 +1359,7 @@ 'Rector\\DeadCode\\ValueObject\\BinaryToVersionCompareCondition' => $baseDir . '/rules/DeadCode/ValueObject/BinaryToVersionCompareCondition.php', 'Rector\\DeadCode\\ValueObject\\VariableAndPropertyFetchAssign' => $baseDir . '/rules/DeadCode/ValueObject/VariableAndPropertyFetchAssign.php', 'Rector\\DeadCode\\ValueObject\\VersionCompareCondition' => $baseDir . '/rules/DeadCode/ValueObject/VersionCompareCondition.php', + 'Rector\\Doctrine\\Bundle210\\Rector\\Class_\\EventSubscriberInterfaceToAttributeRector' => $vendorDir . '/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\ClassMethod\\MakeEntitySetterNullabilityInSyncWithPropertyRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/ClassMethod/MakeEntitySetterNullabilityInSyncWithPropertyRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => $vendorDir . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php', @@ -1732,6 +1736,7 @@ 'Rector\\PHPUnit\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => $vendorDir . '/rector/rector-phpunit/src/Rector/StmtsAwareInterface/WithConsecutiveRector.php', 'Rector\\PHPUnit\\Set\\PHPUnitLevelSetList' => $vendorDir . '/rector/rector-phpunit/src/Set/PHPUnitLevelSetList.php', 'Rector\\PHPUnit\\Set\\PHPUnitSetList' => $vendorDir . '/rector/rector-phpunit/src/Set/PHPUnitSetList.php', + 'Rector\\PHPUnit\\Transform\\AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector' => $vendorDir . '/rector/rector-phpunit/src/Transform/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php', 'Rector\\PHPUnit\\ValueObject\\AnnotationWithValueToAttribute' => $vendorDir . '/rector/rector-phpunit/src/ValueObject/AnnotationWithValueToAttribute.php', 'Rector\\PHPUnit\\ValueObject\\BinaryOpWithAssertMethod' => $vendorDir . '/rector/rector-phpunit/src/ValueObject/BinaryOpWithAssertMethod.php', 'Rector\\PHPUnit\\ValueObject\\ConstantWithAssertMethods' => $vendorDir . '/rector/rector-phpunit/src/ValueObject/ConstantWithAssertMethods.php', @@ -1739,7 +1744,7 @@ 'Rector\\Parallel\\Application\\ParallelFileProcessor' => $baseDir . '/packages/Parallel/Application/ParallelFileProcessor.php', 'Rector\\Parallel\\Command\\WorkerCommandLineFactory' => $baseDir . '/packages/Parallel/Command/WorkerCommandLineFactory.php', 'Rector\\Parallel\\ValueObject\\Bridge' => $baseDir . '/packages/Parallel/ValueObject/Bridge.php', - 'Rector\\Parallel\\ValueObject\\Name' => $baseDir . '/packages/Parallel/ValueObject/Name.php', + 'Rector\\Parallel\\ValueObject\\BridgeItem' => $baseDir . '/packages/Parallel/ValueObject/BridgeItem.php', 'Rector\\Php52\\Rector\\Property\\VarToPublicPropertyRector' => $baseDir . '/rules/Php52/Rector/Property/VarToPublicPropertyRector.php', 'Rector\\Php52\\Rector\\Switch_\\ContinueToBreakInSwitchRector' => $baseDir . '/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php', 'Rector\\Php53\\Rector\\FuncCall\\DirNameFileConstantToDirConstantRector' => $baseDir . '/rules/Php53/Rector/FuncCall/DirNameFileConstantToDirConstantRector.php', @@ -1878,6 +1883,7 @@ 'Rector\\Php80\\ValueObject\\PropertyPromotionCandidate' => $baseDir . '/rules/Php80/ValueObject/PropertyPromotionCandidate.php', 'Rector\\Php80\\ValueObject\\StrStartsWith' => $baseDir . '/rules/Php80/ValueObject/StrStartsWith.php', 'Rector\\Php81\\Enum\\AttributeName' => $baseDir . '/rules/Php81/Enum/AttributeName.php', + 'Rector\\Php81\\Enum\\NameNullToStrictNullFunctionMap' => $baseDir . '/rules/Php81/Enum/NameNullToStrictNullFunctionMap.php', 'Rector\\Php81\\NodeAnalyzer\\CoalesePropertyAssignMatcher' => $baseDir . '/rules/Php81/NodeAnalyzer/CoalesePropertyAssignMatcher.php', 'Rector\\Php81\\NodeAnalyzer\\ComplexNewAnalyzer' => $baseDir . '/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php', 'Rector\\Php81\\NodeFactory\\EnumFactory' => $baseDir . '/rules/Php81/NodeFactory/EnumFactory.php', @@ -1940,6 +1946,7 @@ 'Rector\\Privatization\\Guard\\ParentPropertyLookupGuard' => $baseDir . '/rules/Privatization/Guard/ParentPropertyLookupGuard.php', 'Rector\\Privatization\\NodeManipulator\\VisibilityManipulator' => $baseDir . '/rules/Privatization/NodeManipulator/VisibilityManipulator.php', 'Rector\\Privatization\\Rector\\ClassMethod\\PrivatizeFinalClassMethodRector' => $baseDir . '/rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.php', + 'Rector\\Privatization\\Rector\\Class_\\FinalizeClassesWithoutChildrenCollectorRector' => $baseDir . '/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenCollectorRector.php', 'Rector\\Privatization\\Rector\\Class_\\FinalizeClassesWithoutChildrenRector' => $baseDir . '/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenRector.php', 'Rector\\Privatization\\Rector\\MethodCall\\PrivatizeLocalGetterToPropertyRector' => $baseDir . '/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php', 'Rector\\Privatization\\Rector\\Property\\PrivatizeFinalClassPropertyRector' => $baseDir . '/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php', @@ -2252,6 +2259,7 @@ 'Rector\\TypeDeclaration\\AlreadyAssignDetector\\ConstructorAssignDetector' => $baseDir . '/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php', 'Rector\\TypeDeclaration\\AlreadyAssignDetector\\NullTypeAssignDetector' => $baseDir . '/rules/TypeDeclaration/AlreadyAssignDetector/NullTypeAssignDetector.php', 'Rector\\TypeDeclaration\\AlreadyAssignDetector\\PropertyDefaultAssignDetector' => $baseDir . '/rules/TypeDeclaration/AlreadyAssignDetector/PropertyDefaultAssignDetector.php', + 'Rector\\TypeDeclaration\\Collector\\ParentClassCollector' => $baseDir . '/rules/TypeDeclaration/Collector/ParentClassCollector.php', 'Rector\\TypeDeclaration\\Contract\\PHPStan\\TypeWithClassTypeSpecifierInterface' => $baseDir . '/rules/TypeDeclaration/Contract/PHPStan/TypeWithClassTypeSpecifierInterface.php', 'Rector\\TypeDeclaration\\FunctionLikeReturnTypeResolver' => $baseDir . '/rules/TypeDeclaration/FunctionLikeReturnTypeResolver.php', 'Rector\\TypeDeclaration\\Guard\\ParamTypeAddGuard' => $baseDir . '/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php', diff --git a/vendor/rector/rector/vendor/composer/autoload_real.php b/vendor/rector/rector/vendor/composer/autoload_real.php index 5b485ec88..4f367659d 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 ComposerAutoloaderInit74b494968d871723f2b2948ff265d302 +class ComposerAutoloaderInitfb8962cd04c9733c8bc7564499948ec7 { private static $loader; @@ -22,17 +22,17 @@ public static function getLoader() return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit74b494968d871723f2b2948ff265d302', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInitfb8962cd04c9733c8bc7564499948ec7', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit74b494968d871723f2b2948ff265d302', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInitfb8962cd04c9733c8bc7564499948ec7', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit74b494968d871723f2b2948ff265d302::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInitfb8962cd04c9733c8bc7564499948ec7::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit74b494968d871723f2b2948ff265d302::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInitfb8962cd04c9733c8bc7564499948ec7::$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 409f65490..147d4ad86 100644 --- a/vendor/rector/rector/vendor/composer/autoload_static.php +++ b/vendor/rector/rector/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit74b494968d871723f2b2948ff265d302 +class ComposerStaticInitfb8962cd04c9733c8bc7564499948ec7 { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -1367,6 +1367,8 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\Config\\RectorConfig' => __DIR__ . '/../..' . '/packages/Config/RectorConfig.php', 'Rector\\Core\\Application\\ApplicationFileProcessor' => __DIR__ . '/../..' . '/src/Application/ApplicationFileProcessor.php', 'Rector\\Core\\Application\\ChangedNodeScopeRefresher' => __DIR__ . '/../..' . '/src/Application/ChangedNodeScopeRefresher.php', + 'Rector\\Core\\Application\\Collector\\CollectorNodeVisitor' => __DIR__ . '/../..' . '/src/Application/Collector/CollectorNodeVisitor.php', + 'Rector\\Core\\Application\\Collector\\CollectorProcessor' => __DIR__ . '/../..' . '/src/Application/Collector/CollectorProcessor.php', 'Rector\\Core\\Application\\FileProcessor' => __DIR__ . '/../..' . '/src/Application/FileProcessor.php', 'Rector\\Core\\Application\\VersionResolver' => __DIR__ . '/../..' . '/src/Application/VersionResolver.php', 'Rector\\Core\\Autoloading\\AdditionalAutoloader' => __DIR__ . '/../..' . '/src/Autoloading/AdditionalAutoloader.php', @@ -1375,7 +1377,6 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\Core\\Bootstrap\\RectorConfigsResolver' => __DIR__ . '/../..' . '/src/Bootstrap/RectorConfigsResolver.php', 'Rector\\Core\\Configuration\\ConfigInitializer' => __DIR__ . '/../..' . '/src/Configuration/ConfigInitializer.php', 'Rector\\Core\\Configuration\\ConfigurationFactory' => __DIR__ . '/../..' . '/src/Configuration/ConfigurationFactory.php', - 'Rector\\Core\\Configuration\\CurrentNodeProvider' => __DIR__ . '/../..' . '/src/Configuration/CurrentNodeProvider.php', 'Rector\\Core\\Configuration\\Option' => __DIR__ . '/../..' . '/src/Configuration/Option.php', 'Rector\\Core\\Configuration\\Parameter\\SimpleParameterProvider' => __DIR__ . '/../..' . '/src/Configuration/Parameter/SimpleParameterProvider.php', 'Rector\\Core\\Configuration\\RenamedClassesDataCollector' => __DIR__ . '/../..' . '/src/Configuration/RenamedClassesDataCollector.php', @@ -1394,6 +1395,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\Core\\Console\\Style\\SymfonyStyleFactory' => __DIR__ . '/../..' . '/src/Console/Style/SymfonyStyleFactory.php', 'Rector\\Core\\Contract\\DependencyInjection\\ResetableInterface' => __DIR__ . '/../..' . '/src/Contract/DependencyInjection/ResetableInterface.php', 'Rector\\Core\\Contract\\PhpParser\\Node\\StmtsAwareInterface' => __DIR__ . '/../..' . '/src/Contract/PhpParser/Node/StmtsAwareInterface.php', + 'Rector\\Core\\Contract\\Rector\\CollectorRectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/CollectorRectorInterface.php', 'Rector\\Core\\Contract\\Rector\\ConfigurableRectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/ConfigurableRectorInterface.php', 'Rector\\Core\\Contract\\Rector\\RectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/RectorInterface.php', 'Rector\\Core\\Contract\\Rector\\ScopeAwareRectorInterface' => __DIR__ . '/../..' . '/src/Contract/Rector/ScopeAwareRectorInterface.php', @@ -1478,6 +1480,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\Core\\Php\\ReservedKeywordAnalyzer' => __DIR__ . '/../..' . '/src/Php/ReservedKeywordAnalyzer.php', 'Rector\\Core\\ProcessAnalyzer\\RectifiedAnalyzer' => __DIR__ . '/../..' . '/src/ProcessAnalyzer/RectifiedAnalyzer.php', 'Rector\\Core\\Provider\\CurrentFileProvider' => __DIR__ . '/../..' . '/src/Provider/CurrentFileProvider.php', + 'Rector\\Core\\Rector\\AbstractCollectorRector' => __DIR__ . '/../..' . '/src/Rector/AbstractCollectorRector.php', 'Rector\\Core\\Rector\\AbstractRector' => __DIR__ . '/../..' . '/src/Rector/AbstractRector.php', 'Rector\\Core\\Rector\\AbstractScopeAwareRector' => __DIR__ . '/../..' . '/src/Rector/AbstractScopeAwareRector.php', 'Rector\\Core\\Reflection\\ClassReflectionAnalyzer' => __DIR__ . '/../..' . '/src/Reflection/ClassReflectionAnalyzer.php', @@ -1576,6 +1579,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\DeadCode\\ValueObject\\BinaryToVersionCompareCondition' => __DIR__ . '/../..' . '/rules/DeadCode/ValueObject/BinaryToVersionCompareCondition.php', 'Rector\\DeadCode\\ValueObject\\VariableAndPropertyFetchAssign' => __DIR__ . '/../..' . '/rules/DeadCode/ValueObject/VariableAndPropertyFetchAssign.php', 'Rector\\DeadCode\\ValueObject\\VersionCompareCondition' => __DIR__ . '/../..' . '/rules/DeadCode/ValueObject/VersionCompareCondition.php', + 'Rector\\Doctrine\\Bundle210\\Rector\\Class_\\EventSubscriberInterfaceToAttributeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\ClassMethod\\MakeEntitySetterNullabilityInSyncWithPropertyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/ClassMethod/MakeEntitySetterNullabilityInSyncWithPropertyRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\InitializeDefaultEntityCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/InitializeDefaultEntityCollectionRector.php', 'Rector\\Doctrine\\CodeQuality\\Rector\\Class_\\MoveCurrentDateTimeDefaultInEntityToConstructorRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php', @@ -1952,6 +1956,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\PHPUnit\\Rector\\StmtsAwareInterface\\WithConsecutiveRector' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Rector/StmtsAwareInterface/WithConsecutiveRector.php', 'Rector\\PHPUnit\\Set\\PHPUnitLevelSetList' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Set/PHPUnitLevelSetList.php', 'Rector\\PHPUnit\\Set\\PHPUnitSetList' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Set/PHPUnitSetList.php', + 'Rector\\PHPUnit\\Transform\\AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector' => __DIR__ . '/..' . '/rector/rector-phpunit/src/Transform/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php', 'Rector\\PHPUnit\\ValueObject\\AnnotationWithValueToAttribute' => __DIR__ . '/..' . '/rector/rector-phpunit/src/ValueObject/AnnotationWithValueToAttribute.php', 'Rector\\PHPUnit\\ValueObject\\BinaryOpWithAssertMethod' => __DIR__ . '/..' . '/rector/rector-phpunit/src/ValueObject/BinaryOpWithAssertMethod.php', 'Rector\\PHPUnit\\ValueObject\\ConstantWithAssertMethods' => __DIR__ . '/..' . '/rector/rector-phpunit/src/ValueObject/ConstantWithAssertMethods.php', @@ -1959,7 +1964,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\Parallel\\Application\\ParallelFileProcessor' => __DIR__ . '/../..' . '/packages/Parallel/Application/ParallelFileProcessor.php', 'Rector\\Parallel\\Command\\WorkerCommandLineFactory' => __DIR__ . '/../..' . '/packages/Parallel/Command/WorkerCommandLineFactory.php', 'Rector\\Parallel\\ValueObject\\Bridge' => __DIR__ . '/../..' . '/packages/Parallel/ValueObject/Bridge.php', - 'Rector\\Parallel\\ValueObject\\Name' => __DIR__ . '/../..' . '/packages/Parallel/ValueObject/Name.php', + 'Rector\\Parallel\\ValueObject\\BridgeItem' => __DIR__ . '/../..' . '/packages/Parallel/ValueObject/BridgeItem.php', 'Rector\\Php52\\Rector\\Property\\VarToPublicPropertyRector' => __DIR__ . '/../..' . '/rules/Php52/Rector/Property/VarToPublicPropertyRector.php', 'Rector\\Php52\\Rector\\Switch_\\ContinueToBreakInSwitchRector' => __DIR__ . '/../..' . '/rules/Php52/Rector/Switch_/ContinueToBreakInSwitchRector.php', 'Rector\\Php53\\Rector\\FuncCall\\DirNameFileConstantToDirConstantRector' => __DIR__ . '/../..' . '/rules/Php53/Rector/FuncCall/DirNameFileConstantToDirConstantRector.php', @@ -2098,6 +2103,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\Php80\\ValueObject\\PropertyPromotionCandidate' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/PropertyPromotionCandidate.php', 'Rector\\Php80\\ValueObject\\StrStartsWith' => __DIR__ . '/../..' . '/rules/Php80/ValueObject/StrStartsWith.php', 'Rector\\Php81\\Enum\\AttributeName' => __DIR__ . '/../..' . '/rules/Php81/Enum/AttributeName.php', + 'Rector\\Php81\\Enum\\NameNullToStrictNullFunctionMap' => __DIR__ . '/../..' . '/rules/Php81/Enum/NameNullToStrictNullFunctionMap.php', 'Rector\\Php81\\NodeAnalyzer\\CoalesePropertyAssignMatcher' => __DIR__ . '/../..' . '/rules/Php81/NodeAnalyzer/CoalesePropertyAssignMatcher.php', 'Rector\\Php81\\NodeAnalyzer\\ComplexNewAnalyzer' => __DIR__ . '/../..' . '/rules/Php81/NodeAnalyzer/ComplexNewAnalyzer.php', 'Rector\\Php81\\NodeFactory\\EnumFactory' => __DIR__ . '/../..' . '/rules/Php81/NodeFactory/EnumFactory.php', @@ -2160,6 +2166,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\Privatization\\Guard\\ParentPropertyLookupGuard' => __DIR__ . '/../..' . '/rules/Privatization/Guard/ParentPropertyLookupGuard.php', 'Rector\\Privatization\\NodeManipulator\\VisibilityManipulator' => __DIR__ . '/../..' . '/rules/Privatization/NodeManipulator/VisibilityManipulator.php', 'Rector\\Privatization\\Rector\\ClassMethod\\PrivatizeFinalClassMethodRector' => __DIR__ . '/../..' . '/rules/Privatization/Rector/ClassMethod/PrivatizeFinalClassMethodRector.php', + 'Rector\\Privatization\\Rector\\Class_\\FinalizeClassesWithoutChildrenCollectorRector' => __DIR__ . '/../..' . '/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenCollectorRector.php', 'Rector\\Privatization\\Rector\\Class_\\FinalizeClassesWithoutChildrenRector' => __DIR__ . '/../..' . '/rules/Privatization/Rector/Class_/FinalizeClassesWithoutChildrenRector.php', 'Rector\\Privatization\\Rector\\MethodCall\\PrivatizeLocalGetterToPropertyRector' => __DIR__ . '/../..' . '/rules/Privatization/Rector/MethodCall/PrivatizeLocalGetterToPropertyRector.php', 'Rector\\Privatization\\Rector\\Property\\PrivatizeFinalClassPropertyRector' => __DIR__ . '/../..' . '/rules/Privatization/Rector/Property/PrivatizeFinalClassPropertyRector.php', @@ -2472,6 +2479,7 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 'Rector\\TypeDeclaration\\AlreadyAssignDetector\\ConstructorAssignDetector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/AlreadyAssignDetector/ConstructorAssignDetector.php', 'Rector\\TypeDeclaration\\AlreadyAssignDetector\\NullTypeAssignDetector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/AlreadyAssignDetector/NullTypeAssignDetector.php', 'Rector\\TypeDeclaration\\AlreadyAssignDetector\\PropertyDefaultAssignDetector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/AlreadyAssignDetector/PropertyDefaultAssignDetector.php', + 'Rector\\TypeDeclaration\\Collector\\ParentClassCollector' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Collector/ParentClassCollector.php', 'Rector\\TypeDeclaration\\Contract\\PHPStan\\TypeWithClassTypeSpecifierInterface' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Contract/PHPStan/TypeWithClassTypeSpecifierInterface.php', 'Rector\\TypeDeclaration\\FunctionLikeReturnTypeResolver' => __DIR__ . '/../..' . '/rules/TypeDeclaration/FunctionLikeReturnTypeResolver.php', 'Rector\\TypeDeclaration\\Guard\\ParamTypeAddGuard' => __DIR__ . '/../..' . '/rules/TypeDeclaration/Guard/ParamTypeAddGuard.php', @@ -2593,9 +2601,9 @@ class ComposerStaticInit74b494968d871723f2b2948ff265d302 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit74b494968d871723f2b2948ff265d302::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit74b494968d871723f2b2948ff265d302::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit74b494968d871723f2b2948ff265d302::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInitfb8962cd04c9733c8bc7564499948ec7::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInitfb8962cd04c9733c8bc7564499948ec7::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInitfb8962cd04c9733c8bc7564499948ec7::$classMap; }, null, ClassLoader::class); } diff --git a/vendor/rector/rector/vendor/composer/installed.json b/vendor/rector/rector/vendor/composer/installed.json index 9ef2d4cf5..c0e4fabf5 100644 --- a/vendor/rector/rector/vendor/composer/installed.json +++ b/vendor/rector/rector/vendor/composer/installed.json @@ -504,8 +504,8 @@ }, { "name": "illuminate\/container", - "version": "v10.23.0", - "version_normalized": "10.23.0.0", + "version": "v10.24.0", + "version_normalized": "10.24.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/container.git", @@ -561,8 +561,8 @@ }, { "name": "illuminate\/contracts", - "version": "v10.23.0", - "version_normalized": "10.23.0.0", + "version": "v10.24.0", + "version_normalized": "10.24.0.0", "source": { "type": "git", "url": "https:\/\/github.com\/illuminate\/contracts.git", @@ -858,17 +858,17 @@ }, { "name": "phpstan\/phpdoc-parser", - "version": "1.24.0", - "version_normalized": "1.24.0.0", + "version": "1.24.1", + "version_normalized": "1.24.1.0", "source": { "type": "git", "url": "https:\/\/github.com\/phpstan\/phpdoc-parser.git", - "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6" + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/3510b0a6274cc42f7219367cb3abfc123ffa09d6", - "reference": "3510b0a6274cc42f7219367cb3abfc123ffa09d6", + "url": "https:\/\/api.github.com\/repos\/phpstan\/phpdoc-parser\/zipball\/9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", + "reference": "9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01", "shasum": "" }, "require": { @@ -885,7 +885,7 @@ "phpunit\/phpunit": "^9.5", "symfony\/process": "^5.2" }, - "time": "2023-09-07T20:46:32+00:00", + "time": "2023-09-18T12:18:02+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -902,23 +902,23 @@ "description": "PHPDoc parser with support for nullable, intersection and generic types", "support": { "issues": "https:\/\/github.com\/phpstan\/phpdoc-parser\/issues", - "source": "https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/1.24.0" + "source": "https:\/\/github.com\/phpstan\/phpdoc-parser\/tree\/1.24.1" }, "install-path": "..\/phpstan\/phpdoc-parser" }, { "name": "phpstan\/phpstan", - "version": "1.10.33", - "version_normalized": "1.10.33.0", + "version": "1.10.35", + "version_normalized": "1.10.35.0", "source": { "type": "git", "url": "https:\/\/github.com\/phpstan\/phpstan.git", - "reference": "03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1" + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpstan\/phpstan\/zipball\/03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1", - "reference": "03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1", + "url": "https:\/\/api.github.com\/repos\/phpstan\/phpstan\/zipball\/e730e5facb75ffe09dfb229795e8c01a459f26c3", + "reference": "e730e5facb75ffe09dfb229795e8c01a459f26c3", "shasum": "" }, "require": { @@ -927,7 +927,7 @@ "conflict": { "phpstan\/phpstan-shim": "*" }, - "time": "2023-09-04T12:20:53+00:00", + "time": "2023-09-19T15:27:56+00:00", "bin": [ "phpstan", "phpstan.phar" @@ -1744,18 +1744,19 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git", - "reference": "7f9e1329d06b0b90b36dd310b562a27cfd7b6aa6" + "reference": "3596bbff47c4018c0987533cb651fce7cd0b71a4" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/7f9e1329d06b0b90b36dd310b562a27cfd7b6aa6", - "reference": "7f9e1329d06b0b90b36dd310b562a27cfd7b6aa6", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/3596bbff47c4018c0987533cb651fce7cd0b71a4", + "reference": "3596bbff47c4018c0987533cb651fce7cd0b71a4", "shasum": "" }, "require": { "php": ">=8.1" }, "require-dev": { + "doctrine\/doctrine-bundle": "^2.10", "doctrine\/orm": "^2.16", "phpstan\/extension-installer": "^1.3", "phpstan\/phpstan": "^1.10", @@ -1774,7 +1775,7 @@ "tomasvotruba\/type-coverage": "^0.2", "tomasvotruba\/unused-public": "^0.3" }, - "time": "2023-09-11T18:44:21+00:00", + "time": "2023-09-23T12:28:10+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1807,12 +1808,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-downgrade-php.git", - "reference": "86f57eee49e0beae650cbef6ff70841849cca6a0" + "reference": "e1b3dabae161de1764cc7fdc199463661d4059c6" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-downgrade-php\/zipball\/86f57eee49e0beae650cbef6ff70841849cca6a0", - "reference": "86f57eee49e0beae650cbef6ff70841849cca6a0", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-downgrade-php\/zipball\/e1b3dabae161de1764cc7fdc199463661d4059c6", + "reference": "e1b3dabae161de1764cc7fdc199463661d4059c6", "shasum": "" }, "require": { @@ -1820,13 +1821,13 @@ }, "require-dev": { "phpstan\/extension-installer": "^1.3", - "phpstan\/phpstan": "^1.9", + "phpstan\/phpstan": "^1.10", "phpstan\/phpstan-deprecation-rules": "^1.1", "phpstan\/phpstan-webmozart-assert": "^1.2", "phpunit\/phpunit": "^10.3", "rector\/phpstan-rules": "^0.7", "rector\/rector-generator": "^0.7.3", - "rector\/rector-src": "dev-tv-narrow-abstract-10", + "rector\/rector-src": "dev-main", "symplify\/easy-ci": "^11.2", "symplify\/easy-coding-standard": "^12.0", "symplify\/phpstan-extensions": "^11.3", @@ -1839,7 +1840,7 @@ "tomasvotruba\/unused-public": "^0.2", "tracy\/tracy": "^2.10" }, - "time": "2023-09-11T17:45:57+00:00", + "time": "2023-09-23T12:29:20+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1872,12 +1873,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-phpunit.git", - "reference": "d4ca7d7e4d5d6d9d61d8aa1695010a6a6df50f47" + "reference": "0fe343adc98a0cbadd7d613bb6a579cb15e1b15d" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/d4ca7d7e4d5d6d9d61d8aa1695010a6a6df50f47", - "reference": "d4ca7d7e4d5d6d9d61d8aa1695010a6a6df50f47", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-phpunit\/zipball\/0fe343adc98a0cbadd7d613bb6a579cb15e1b15d", + "reference": "0fe343adc98a0cbadd7d613bb6a579cb15e1b15d", "shasum": "" }, "require": { @@ -1888,26 +1889,26 @@ }, "require-dev": { "phpstan\/extension-installer": "^1.3", - "phpstan\/phpstan": "^1.10.25", + "phpstan\/phpstan": "^1.10.34", "phpstan\/phpstan-strict-rules": "^1.5", "phpstan\/phpstan-webmozart-assert": "^1.2.2", "phpunit\/phpunit": "^10.2", - "rector\/phpstan-rules": "^0.6", + "rector\/phpstan-rules": "^0.7", "rector\/rector-generator": "^0.7", "rector\/rector-src": "dev-main", - "symplify\/easy-ci": "^11.2.0", + "symplify\/easy-ci": "^11.3", "symplify\/easy-coding-standard": "^12.0", "symplify\/phpstan-extensions": "^11.2", "symplify\/phpstan-rules": "^11.4", "symplify\/rule-doc-generator": "^12.0", - "symplify\/vendor-patches": "^11.2.0", + "symplify\/vendor-patches": "^11.2", "tomasvotruba\/class-leak": "^0.1", "tomasvotruba\/cognitive-complexity": "^0.1", "tomasvotruba\/type-coverage": "^0.2", "tomasvotruba\/unused-public": "^0.3", "tracy\/tracy": "^2.10" }, - "time": "2023-09-11T17:34:46+00:00", + "time": "2023-09-23T12:10:56+00:00", "default-branch": true, "type": "rector-extension", "extra": { @@ -1943,12 +1944,12 @@ "source": { "type": "git", "url": "https:\/\/github.com\/rectorphp\/rector-symfony.git", - "reference": "6ef9eb731559a91c170f27c6432a0b76176f5655" + "reference": "b63fcb21a69b696165deed299530162670283e25" }, "dist": { "type": "zip", - "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/6ef9eb731559a91c170f27c6432a0b76176f5655", - "reference": "6ef9eb731559a91c170f27c6432a0b76176f5655", + "url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-symfony\/zipball\/b63fcb21a69b696165deed299530162670283e25", + "reference": "b63fcb21a69b696165deed299530162670283e25", "shasum": "" }, "require": { @@ -1962,7 +1963,7 @@ "phpunit\/phpunit": "^10.3", "rector\/phpstan-rules": "^0.6", "rector\/rector-generator": "^0.7", - "rector\/rector-src": "dev-tv-narrow-abstract-10", + "rector\/rector-src": "dev-main", "symfony\/config": "^6.3", "symfony\/dependency-injection": "^6.3", "symfony\/routing": "^6.2", @@ -1981,7 +1982,7 @@ "tomasvotruba\/unused-public": "^0.2", "tracy\/tracy": "^2.10" }, - "time": "2023-09-11T17:29:57+00:00", + "time": "2023-09-23T12:20:24+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 1a71c3ef9..27cc79339 100644 --- a/vendor/rector/rector/vendor/composer/installed.php +++ b/vendor/rector/rector/vendor/composer/installed.php @@ -2,4 +2,4 @@ namespace RectorPrefix202309; -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.23.0', 'version' => '10.23.0.0', 'reference' => 'ddc26273085fad3c471b2602ad820e0097ff7939', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v10.23.0', 'version' => '10.23.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.0', 'version' => '1.24.0.0', 'reference' => '3510b0a6274cc42f7219367cb3abfc123ffa09d6', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('pretty_version' => '1.10.33', 'version' => '1.10.33.0', 'reference' => '03b1cf9f814ba0863c4e9affea49a4d1ed9a2ed1', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), 'dev_requirement' => \false), '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' => '7f9e1329d06b0b90b36dd310b562a27cfd7b6aa6', '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' => '86f57eee49e0beae650cbef6ff70841849cca6a0', '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' => 'd4ca7d7e4d5d6d9d61d8aa1695010a6a6df50f47', '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' => '6ef9eb731559a91c170f27c6432a0b76176f5655', '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.3', 'version' => '6.3.3.0', 'reference' => '9915db259f67d21eefee768c1abcf1cc61b1fc9e', '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.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.24.0', 'version' => '10.24.0.0', 'reference' => 'ddc26273085fad3c471b2602ad820e0097ff7939', 'type' => 'library', 'install_path' => __DIR__ . '/../illuminate/container', 'aliases' => array(), 'dev_requirement' => \false), 'illuminate/contracts' => array('pretty_version' => 'v10.24.0', 'version' => '10.24.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.1', 'version' => '1.24.1.0', 'reference' => '9f854d275c2dbf84915a5c0ec9a2d17d2cd86b01', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpdoc-parser', 'aliases' => array(), 'dev_requirement' => \false), 'phpstan/phpstan' => array('pretty_version' => '1.10.35', 'version' => '1.10.35.0', 'reference' => 'e730e5facb75ffe09dfb229795e8c01a459f26c3', 'type' => 'library', 'install_path' => __DIR__ . '/../phpstan/phpstan', 'aliases' => array(), 'dev_requirement' => \false), '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' => '3596bbff47c4018c0987533cb651fce7cd0b71a4', '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' => 'e1b3dabae161de1764cc7fdc199463661d4059c6', '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' => '0fe343adc98a0cbadd7d613bb6a579cb15e1b15d', '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' => 'b63fcb21a69b696165deed299530162670283e25', '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.3', 'version' => '6.3.3.0', 'reference' => '9915db259f67d21eefee768c1abcf1cc61b1fc9e', '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/phpstan/phpdoc-parser/phpstan-baseline.neon b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon index 04100fcdd..4596cc77b 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/phpstan-baseline.neon @@ -10,11 +10,6 @@ parameters: count: 1 path: src/Ast/NodeTraverser.php - - - message: "#^Strict comparison using \\=\\=\\= between 2 and 2 will always evaluate to true\\.$#" - count: 2 - path: src/Ast/NodeTraverser.php - - message: "#^Variable property access on PHPStan\\\\PhpDocParser\\\\Ast\\\\Node\\.$#" count: 1 diff --git a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php index d23ae515d..ef2c81bf9 100644 --- a/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php +++ b/vendor/rector/rector/vendor/phpstan/phpdoc-parser/src/Parser/TypeParser.php @@ -282,34 +282,26 @@ public function isHtml(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens) : boo public function parseGeneric(\PHPStan\PhpDocParser\Parser\TokenIterator $tokens, Ast\Type\IdentifierTypeNode $baseType) : Ast\Type\GenericTypeNode { $tokens->consumeTokenType(Lexer::TOKEN_OPEN_ANGLE_BRACKET); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); + $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); + $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); $genericTypes = []; $variances = []; - [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - while ($tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { + $isFirst = \true; + while ($isFirst || $tokens->tryConsumeTokenType(Lexer::TOKEN_COMMA)) { $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - if ($tokens->tryConsumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { - // trailing comma case - $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); - $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); - $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); - if ($startLine !== null && $startIndex !== null) { - $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); - } - return $type; + // trailing comma case + if (!$isFirst && $tokens->isCurrentTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET)) { + break; } + $isFirst = \false; [$genericTypes[], $variances[]] = $this->parseGenericTypeArgument($tokens); $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); } - $tokens->tryConsumeTokenType(Lexer::TOKEN_PHPDOC_EOL); - $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); $type = new Ast\Type\GenericTypeNode($baseType, $genericTypes, $variances); - $startLine = $baseType->getAttribute(Ast\Attribute::START_LINE); - $startIndex = $baseType->getAttribute(Ast\Attribute::START_INDEX); if ($startLine !== null && $startIndex !== null) { $type = $this->enrichWithAttributes($tokens, $type, $startLine, $startIndex); } + $tokens->consumeTokenType(Lexer::TOKEN_CLOSE_ANGLE_BRACKET); return $type; } /** diff --git a/vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar b/vendor/rector/rector/vendor/phpstan/phpstan/phpstan.phar index 6bf0b9c7a97ef4769339fff85fa4544f8892ec67..226ea192c7b94353c0a34af898b5faa172ac6f8e 100644 GIT binary patch delta 326790 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 delta 329372 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%0Ax(9NJ(Yd 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

-=f*`04lFbJ-;i7MFb>>@Hr2 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

54wVv-W2-@ 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 array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main 7f9e132'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main 86f57ee'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main d4ca7d7'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main 6ef9eb7')); + public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main 3596bbf'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main e1b3dab'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 0fe343a'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main b63fcb2')); private function __construct() { } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json b/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json index f24891766..68155598c 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/composer.json @@ -23,7 +23,8 @@ "symplify\/easy-ci": "^11.2", "tomasvotruba\/unused-public": "^0.3", "tomasvotruba\/type-coverage": "^0.2", - "tomasvotruba\/class-leak": "^0.1" + "tomasvotruba\/class-leak": "^0.1", + "doctrine\/doctrine-bundle": "^2.10" }, "autoload": { "psr-4": { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-210.php b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-210.php new file mode 100644 index 000000000..7e496c692 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/config/sets/doctrine-bundle-210.php @@ -0,0 +1,10 @@ +rule(EventSubscriberInterfaceToAttributeRector::class); +}; diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rector.php index af98a3fe9..31e221f9a 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rector.php @@ -10,7 +10,8 @@ use Rector\Set\ValueObject\SetList; return static function (RectorConfig $rectorConfig) : void { $rectorConfig->importNames(); - $rectorConfig->paths([__DIR__ . '/src', __DIR__ . '/tests']); + $rectorConfig->removeUnusedImports(); + $rectorConfig->paths([__DIR__ . '/src', __DIR__ . '/rules', __DIR__ . '/tests']); $rectorConfig->skip([ // for tests '*/Source/*', diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php new file mode 100644 index 000000000..67ab689f2 --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/Bundle210/Rector/Class_/EventSubscriberInterfaceToAttributeRector.php @@ -0,0 +1,179 @@ +> + */ + public function getNodeTypes() : array + { + return [Class_::class]; + } + /** + * @param Class_ $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->hasImplements($node, 'Doctrine\\Common\\EventSubscriber')) { + return null; + } + $this->subscriberClass = $node; + $getSubscribedEventsClassMethod = $node->getMethod('getSubscribedEvents'); + if (!$getSubscribedEventsClassMethod instanceof ClassMethod) { + return null; + } + $stmts = (array) $getSubscribedEventsClassMethod->stmts; + if ($stmts === []) { + return null; + } + if ($stmts[0] instanceof Return_ && $stmts[0]->expr instanceof Array_) { + $this->handleArray($stmts); + } + $this->removeImplements($node, ['Doctrine\\Common\\EventSubscriber']); + unset($node->stmts[$getSubscribedEventsClassMethod->getAttribute(AttributeKey::STMT_KEY)]); + return $node; + } + /** + * @param array $expressions + */ + private function handleArray(array $expressions) : void + { + foreach ($expressions as $expression) { + if (!$expression instanceof Return_ || !$expression->expr instanceof Array_) { + continue; + } + $arguments = []; + $arguments = $this->parseArguments($expression->expr); + $this->addAttribute($arguments); + } + } + /** + * @return array + */ + private function parseArguments(Array_ $array) : array + { + foreach ($array->items as $item) { + if (!$item instanceof ArrayItem) { + continue; + } + $arguments[] = $item->value; + } + return $arguments ?? []; + } + /** + * @param array $arguments + */ + private function addAttribute(array $arguments) : void + { + foreach ($arguments as $argument) { + $this->subscriberClass->attrGroups[] = new AttributeGroup([new Attribute(new FullyQualified('Doctrine\\Bundle\\DoctrineBundle\\Attribute\\AsDoctrineListener'), [new Arg($argument, \false, \false, [], new Identifier('event'))])]); + } + } + private function hasImplements(Class_ $class, string $interfaceFQN) : bool + { + foreach ($class->implements as $implement) { + if ($this->nodeNameResolver->isName($implement, $interfaceFQN)) { + return \true; + } + } + return \false; + } + /** + * @param array $interfaceFQNS + */ + private function removeImplements(Class_ $class, array $interfaceFQNS) : void + { + foreach ($class->implements as $key => $implement) { + if (!$this->nodeNameResolver->isNames($implement, $interfaceFQNS)) { + continue; + } + unset($class->implements[$key]); + } + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/ClassMethod/MakeEntitySetterNullabilityInSyncWithPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/ClassMethod/MakeEntitySetterNullabilityInSyncWithPropertyRector.php index 83bef8f2e..401e5426a 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/ClassMethod/MakeEntitySetterNullabilityInSyncWithPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/ClassMethod/MakeEntitySetterNullabilityInSyncWithPropertyRector.php @@ -12,6 +12,7 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Rector\Doctrine\NodeAnalyzer\SetterClassMethodAnalyzer; use Rector\Doctrine\PhpDocParser\DoctrineDocBlockResolver; @@ -34,10 +35,16 @@ final class MakeEntitySetterNullabilityInSyncWithPropertyRector extends Abstract * @var \Rector\Doctrine\PhpDocParser\DoctrineDocBlockResolver */ private $doctrineDocBlockResolver; - public function __construct(SetterClassMethodAnalyzer $setterClassMethodAnalyzer, DoctrineDocBlockResolver $doctrineDocBlockResolver) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(SetterClassMethodAnalyzer $setterClassMethodAnalyzer, DoctrineDocBlockResolver $doctrineDocBlockResolver, PhpDocInfoFactory $phpDocInfoFactory) { $this->setterClassMethodAnalyzer = $setterClassMethodAnalyzer; $this->doctrineDocBlockResolver = $doctrineDocBlockResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php index 8f9f1186d..4ac8af571 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Class_/MoveCurrentDateTimeDefaultInEntityToConstructorRector.php @@ -13,9 +13,10 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\StringNode; -use Rector\BetterPhpDocParser\PhpDocNodeVisitor\UnionTypeNodePhpDocNodeVisitor; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\CurlyListNode; use Rector\Comments\NodeDocBlock\DocBlockUpdater; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; use Rector\Doctrine\NodeAnalyzer\ConstructorAssignPropertyAnalyzer; @@ -50,16 +51,28 @@ final class MoveCurrentDateTimeDefaultInEntityToConstructorRector extends Abstra * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var bool */ private $hasChanged = \false; - public function __construct(ConstructorManipulator $constructorManipulator, ValueAssignFactory $valueAssignFactory, ConstructorAssignPropertyAnalyzer $constructorAssignPropertyAnalyzer, DocBlockUpdater $docBlockUpdater) + public function __construct(ConstructorManipulator $constructorManipulator, ValueAssignFactory $valueAssignFactory, ConstructorAssignPropertyAnalyzer $constructorAssignPropertyAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver) { $this->constructorManipulator = $constructorManipulator; $this->valueAssignFactory = $valueAssignFactory; $this->constructorAssignPropertyAnalyzer = $constructorAssignPropertyAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/CorrectDefaultTypesOnEntityPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/CorrectDefaultTypesOnEntityPropertyRector.php index 2e41162db..f280a28ba 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/CorrectDefaultTypesOnEntityPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/CorrectDefaultTypesOnEntityPropertyRector.php @@ -16,7 +16,9 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\StringNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Exception\NotImplementedYetException; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -25,6 +27,21 @@ */ final class CorrectDefaultTypesOnEntityPropertyRector extends AbstractRector { + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(PhpDocInfoFactory $phpDocInfoFactory, ValueResolver $valueResolver) + { + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change default value types to match Doctrine annotation type', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php index 991a89083..44e39509d 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/ImproveDoctrineCollectionDocTypeInEntityRector.php @@ -12,6 +12,7 @@ use PHPStan\Reflection\Php\PhpPropertyReflection; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\NodeManipulator\AssignManipulator; use Rector\Core\Rector\AbstractRector; @@ -75,7 +76,12 @@ final class ImproveDoctrineCollectionDocTypeInEntityRector extends AbstractRecto * @var \Rector\Doctrine\NodeAnalyzer\TargetEntityResolver */ private $targetEntityResolver; - public function __construct(CollectionTypeFactory $collectionTypeFactory, AssignManipulator $assignManipulator, CollectionTypeResolver $collectionTypeResolver, CollectionVarTagValueNodeResolver $collectionVarTagValueNodeResolver, PhpDocTypeChanger $phpDocTypeChanger, DoctrineDocBlockResolver $doctrineDocBlockResolver, ReflectionResolver $reflectionResolver, AttributeFinder $attributeFinder, TargetEntityResolver $targetEntityResolver) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(CollectionTypeFactory $collectionTypeFactory, AssignManipulator $assignManipulator, CollectionTypeResolver $collectionTypeResolver, CollectionVarTagValueNodeResolver $collectionVarTagValueNodeResolver, PhpDocTypeChanger $phpDocTypeChanger, DoctrineDocBlockResolver $doctrineDocBlockResolver, ReflectionResolver $reflectionResolver, AttributeFinder $attributeFinder, TargetEntityResolver $targetEntityResolver, PhpDocInfoFactory $phpDocInfoFactory) { $this->collectionTypeFactory = $collectionTypeFactory; $this->assignManipulator = $assignManipulator; @@ -86,6 +92,7 @@ public function __construct(CollectionTypeFactory $collectionTypeFactory, Assign $this->reflectionResolver = $reflectionResolver; $this->attributeFinder = $attributeFinder; $this->targetEntityResolver = $targetEntityResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php index d1d46c8a0..833bc7e22 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/MakeEntityDateTimePropertyDateTimeInterfaceRector.php @@ -9,6 +9,7 @@ use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockClassRenamer; @@ -33,10 +34,16 @@ final class MakeEntityDateTimePropertyDateTimeInterfaceRector extends AbstractRe * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(DocBlockClassRenamer $docBlockClassRenamer, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(DocBlockClassRenamer $docBlockClassRenamer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->docBlockClassRenamer = $docBlockClassRenamer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -110,7 +117,7 @@ private function changePropertyType(Property $property, string $oldClass, string { $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property); $oldToNewTypes = [new OldToNewType(new FullyQualifiedObjectType($oldClass), new FullyQualifiedObjectType($newClass))]; - $hasChanged = $this->docBlockClassRenamer->renamePhpDocType($phpDocInfo, $oldToNewTypes); + $hasChanged = $this->docBlockClassRenamer->renamePhpDocType($phpDocInfo, $oldToNewTypes, $property); if (!$hasChanged) { return; } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/OrderByKeyToClassConstRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/OrderByKeyToClassConstRector.php index c7c1d65b5..8767cb7f0 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/OrderByKeyToClassConstRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/OrderByKeyToClassConstRector.php @@ -3,12 +3,11 @@ declare (strict_types=1); namespace Rector\Doctrine\CodeQuality\Rector\Property; -use RectorPrefix202309\Doctrine\Common\Collections\Criteria; use PhpParser\Node; +use PhpParser\Node\Attribute; use PhpParser\Node\Expr\Array_; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Property; -use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -63,7 +62,7 @@ public function refactor(Node $node) : ?Node } } // If Attribute is not OrderBy, return null - if (null === $nodeAttribute) { + if (!$nodeAttribute instanceof Attribute) { return null; } if (!isset($nodeAttribute->args[0])) { @@ -75,18 +74,15 @@ public function refactor(Node $node) : ?Node if (!isset($nodeAttribute->args[0]->value->items[0])) { return null; } - if (!$nodeAttribute->args[0]->value->items[0] instanceof Node\Expr\ArrayItem) { - return null; - } if (!$nodeAttribute->args[0]->value->items[0]->value instanceof String_) { return null; } // If Attribute value from key is not `ASC` or `DESC`, return null - if (!\in_array($nodeAttribute->args[0]->value->items[0]->value->value, ['ASC', 'asc', 'DESC', 'desc'])) { + if (!\in_array($nodeAttribute->args[0]->value->items[0]->value->value, ['ASC', 'asc', 'DESC', 'desc'], \true)) { return null; } $upper = \strtoupper($nodeAttribute->args[0]->value->items[0]->value->value); - $nodeAttribute->args[0]->value->items[0]->value = $this->nodeFactory->createClassConstFetch(Criteria::class, $upper); + $nodeAttribute->args[0]->value->items[0]->value = $this->nodeFactory->createClassConstFetch('Doctrine\\Common\\Collections\\Criteria', $upper); return $node; } } diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php index e4a40306a..4b5658483 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromColumnTypeRector.php @@ -9,10 +9,8 @@ use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; use PHPStan\Type\UnionType; -use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; -use Rector\Core\Php\PhpVersionProvider; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; -use Rector\Core\ValueObject\PhpVersion; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\Doctrine\NodeManipulator\ColumnPropertyTypeResolver; use Rector\Doctrine\NodeManipulator\NullabilityColumnPropertyTypeResolver; @@ -41,11 +39,17 @@ final class TypedPropertyFromColumnTypeRector extends AbstractRector implements * @var \Rector\Doctrine\NodeManipulator\NullabilityColumnPropertyTypeResolver */ private $nullabilityColumnPropertyTypeResolver; - public function __construct(PropertyTypeDecorator $propertyTypeDecorator, ColumnPropertyTypeResolver $columnPropertyTypeResolver, NullabilityColumnPropertyTypeResolver $nullabilityColumnPropertyTypeResolver) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PropertyTypeDecorator $propertyTypeDecorator, ColumnPropertyTypeResolver $columnPropertyTypeResolver, NullabilityColumnPropertyTypeResolver $nullabilityColumnPropertyTypeResolver, PhpDocInfoFactory $phpDocInfoFactory) { $this->propertyTypeDecorator = $propertyTypeDecorator; $this->columnPropertyTypeResolver = $columnPropertyTypeResolver; $this->nullabilityColumnPropertyTypeResolver = $nullabilityColumnPropertyTypeResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -98,7 +102,7 @@ public function refactor(Node $node) : ?\PhpParser\Node\Stmt\Property $propertyType = TypeCombinator::addNull($propertyType); } $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); - if ($typeNode === null) { + if (!$typeNode instanceof Node) { return null; } $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php index 74e3e521c..bd72d59dd 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromDoctrineCollectionRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\VarTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersion; use Rector\Doctrine\TypeAnalyzer\DoctrineCollectionTypeAnalyzer; @@ -24,9 +25,15 @@ final class TypedPropertyFromDoctrineCollectionRector extends AbstractRector imp * @var \Rector\Doctrine\TypeAnalyzer\DoctrineCollectionTypeAnalyzer */ private $doctrineCollectionTypeAnalyzer; - public function __construct(DoctrineCollectionTypeAnalyzer $doctrineCollectionTypeAnalyzer) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(DoctrineCollectionTypeAnalyzer $doctrineCollectionTypeAnalyzer, PhpDocInfoFactory $phpDocInfoFactory) { $this->doctrineCollectionTypeAnalyzer = $doctrineCollectionTypeAnalyzer; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php index ee05d9d29..37b1ba2a3 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToManyRelationTypeRector.php @@ -8,6 +8,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\Php\PhpVersionProvider; use Rector\Core\Rector\AbstractRector; @@ -44,12 +45,18 @@ final class TypedPropertyFromToManyRelationTypeRector extends AbstractRector imp * @var \Rector\Core\Php\PhpVersionProvider */ private $phpVersionProvider; - public function __construct(PropertyTypeDecorator $propertyTypeDecorator, PhpDocTypeChanger $phpDocTypeChanger, ToManyRelationPropertyTypeResolver $toManyRelationPropertyTypeResolver, PhpVersionProvider $phpVersionProvider) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PropertyTypeDecorator $propertyTypeDecorator, PhpDocTypeChanger $phpDocTypeChanger, ToManyRelationPropertyTypeResolver $toManyRelationPropertyTypeResolver, PhpVersionProvider $phpVersionProvider, PhpDocInfoFactory $phpDocInfoFactory) { $this->propertyTypeDecorator = $propertyTypeDecorator; $this->phpDocTypeChanger = $phpDocTypeChanger; $this->toManyRelationPropertyTypeResolver = $toManyRelationPropertyTypeResolver; $this->phpVersionProvider = $phpVersionProvider; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -98,7 +105,7 @@ public function refactor(Node $node) : ?\PhpParser\Node\Stmt\Property return null; } $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); - if ($typeNode === null) { + if (!$typeNode instanceof Node) { return null; } $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToOneRelationTypeRector.php b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToOneRelationTypeRector.php index 16dbde0a5..4f4d9c621 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToOneRelationTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/rules/CodeQuality/Rector/Property/TypedPropertyFromToOneRelationTypeRector.php @@ -11,6 +11,7 @@ use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\UnionType; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\Php\PhpVersionProvider; use Rector\Core\Rector\AbstractRector; @@ -47,12 +48,18 @@ final class TypedPropertyFromToOneRelationTypeRector extends AbstractRector impl * @var \Rector\Core\Php\PhpVersionProvider */ private $phpVersionProvider; - public function __construct(PropertyTypeDecorator $propertyTypeDecorator, PhpDocTypeChanger $phpDocTypeChanger, ToOneRelationPropertyTypeResolver $toOneRelationPropertyTypeResolver, PhpVersionProvider $phpVersionProvider) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PropertyTypeDecorator $propertyTypeDecorator, PhpDocTypeChanger $phpDocTypeChanger, ToOneRelationPropertyTypeResolver $toOneRelationPropertyTypeResolver, PhpVersionProvider $phpVersionProvider, PhpDocInfoFactory $phpDocInfoFactory) { $this->propertyTypeDecorator = $propertyTypeDecorator; $this->phpDocTypeChanger = $phpDocTypeChanger; $this->toOneRelationPropertyTypeResolver = $toOneRelationPropertyTypeResolver; $this->phpVersionProvider = $phpVersionProvider; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -103,7 +110,7 @@ public function refactor(Node $node) : ?\PhpParser\Node\Stmt\Property return null; } $typeNode = $this->staticTypeMapper->mapPHPStanTypeToPhpParserNode($propertyType, TypeKind::PROPERTY); - if ($typeNode === null) { + if (!$typeNode instanceof Node) { return null; } $this->completePropertyTypeOrVarDoc($propertyType, $typeNode, $node); diff --git a/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/DoctrineSetList.php b/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/DoctrineSetList.php index 4698e7d17..7878cb378 100644 --- a/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/DoctrineSetList.php +++ b/vendor/rector/rector/vendor/rector/rector-doctrine/src/Set/DoctrineSetList.php @@ -60,6 +60,10 @@ final class DoctrineSetList implements SetListInterface * @var string */ public const DOCTRINE_ORM_214 = __DIR__ . '/../../config/sets/doctrine-orm-214.php'; + /** + * @var string + */ + public const DOCTRINE_BUNDLE_210 = __DIR__ . '/../../config/sets/doctrine-bundle-210.php'; /** * @var string */ diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/composer.json b/vendor/rector/rector/vendor/rector/rector-downgrade-php/composer.json index d1e769fd6..4f52ed995 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/composer.json +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/composer.json @@ -8,13 +8,13 @@ }, "require-dev": { "phpstan\/extension-installer": "^1.3", - "phpstan\/phpstan": "^1.9", + "phpstan\/phpstan": "^1.10", "phpstan\/phpstan-deprecation-rules": "^1.1", "phpstan\/phpstan-webmozart-assert": "^1.2", "phpunit\/phpunit": "^10.3", "rector\/phpstan-rules": "^0.7", "rector\/rector-generator": "^0.7.3", - "rector\/rector-src": "dev-tv-narrow-abstract-10", + "rector\/rector-src": "dev-main", "symplify\/easy-ci": "^11.2", "symplify\/easy-coding-standard": "^12.0", "symplify\/phpstan-extensions": "^11.3", diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeJsonDecodeNullAssociativeArgRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeJsonDecodeNullAssociativeArgRector.php index 7110a9039..03915b917 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeJsonDecodeNullAssociativeArgRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradeJsonDecodeNullAssociativeArgRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\Ternary; use PHPStan\Type\BooleanType; use Rector\Core\NodeAnalyzer\ArgsAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,9 +27,15 @@ final class DowngradeJsonDecodeNullAssociativeArgRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\ArgsAnalyzer */ private $argsAnalyzer; - public function __construct(ArgsAnalyzer $argsAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) { $this->argsAnalyzer = $argsAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradePregUnmatchedAsNullConstantRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradePregUnmatchedAsNullConstantRector.php index 4e25e7c09..7bc18cbcd 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradePregUnmatchedAsNullConstantRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp72/Rector/FuncCall/DowngradePregUnmatchedAsNullConstantRector.php @@ -19,6 +19,7 @@ use PhpParser\Node\Stmt\ClassConst; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\If_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\DowngradePhp72\NodeAnalyzer\RegexFuncAnalyzer; use Rector\DowngradePhp72\NodeManipulator\BitwiseFlagCleaner; @@ -39,15 +40,21 @@ final class DowngradePregUnmatchedAsNullConstantRector extends AbstractRector * @var \Rector\DowngradePhp72\NodeAnalyzer\RegexFuncAnalyzer */ private $regexFuncAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @see https://www.php.net/manual/en/function.preg-match.php * @var string */ private const UNMATCHED_NULL_FLAG = 'PREG_UNMATCHED_AS_NULL'; - public function __construct(BitwiseFlagCleaner $bitwiseFlagCleaner, RegexFuncAnalyzer $regexFuncAnalyzer) + public function __construct(BitwiseFlagCleaner $bitwiseFlagCleaner, RegexFuncAnalyzer $regexFuncAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->bitwiseFlagCleaner = $bitwiseFlagCleaner; $this->regexFuncAnalyzer = $regexFuncAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } /** * @return array> diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php index cefda0ad3..b32ad76ba 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Array_/DowngradeArraySpreadRector.php @@ -15,6 +15,7 @@ use PHPStan\Analyser\Scope; use PHPStan\Type\Type; use Rector\Core\PhpParser\AstResolver; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\DowngradePhp81\NodeAnalyzer\ArraySpreadAnalyzer; use Rector\DowngradePhp81\NodeFactory\ArrayMergeFromArraySpreadFactory; @@ -43,11 +44,17 @@ final class DowngradeArraySpreadRector extends AbstractScopeAwareRector * @var \Rector\Core\PhpParser\AstResolver */ private $astResolver; - public function __construct(ArrayMergeFromArraySpreadFactory $arrayMergeFromArraySpreadFactory, ArraySpreadAnalyzer $arraySpreadAnalyzer, AstResolver $astResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ArrayMergeFromArraySpreadFactory $arrayMergeFromArraySpreadFactory, ArraySpreadAnalyzer $arraySpreadAnalyzer, AstResolver $astResolver, BetterNodeFinder $betterNodeFinder) { $this->arrayMergeFromArraySpreadFactory = $arrayMergeFromArraySpreadFactory; $this->arraySpreadAnalyzer = $arraySpreadAnalyzer; $this->astResolver = $astResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ArrowFunction/ArrowFunctionToAnonymousFunctionRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ArrowFunction/ArrowFunctionToAnonymousFunctionRector.php index 5e0fc222d..53e20a9ef 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ArrowFunction/ArrowFunctionToAnonymousFunctionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ArrowFunction/ArrowFunctionToAnonymousFunctionRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Return_; use PhpParser\Node\Stmt\Throw_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Php72\NodeFactory\AnonymousFunctionFactory; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -27,9 +28,15 @@ final class ArrowFunctionToAnonymousFunctionRector extends AbstractRector * @var \Rector\Php72\NodeFactory\AnonymousFunctionFactory */ private $anonymousFunctionFactory; - public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory, BetterNodeFinder $betterNodeFinder) { $this->anonymousFunctionFactory = $anonymousFunctionFactory; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeContravariantArgumentTypeRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeContravariantArgumentTypeRector.php index cace08022..24881ee59 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeContravariantArgumentTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeContravariantArgumentTypeRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\Function_; use PhpParser\Node\UnionType; use PHPStan\Reflection\ClassReflection; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Core\NodeAnalyzer\ParamAnalyzer; use Rector\Core\Rector\AbstractRector; @@ -42,15 +43,21 @@ final class DowngradeContravariantArgumentTypeRector extends AbstractRector * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var bool */ private $hasChanged = \false; - public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ParamAnalyzer $paramAnalyzer, ReflectionResolver $reflectionResolver) + public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ParamAnalyzer $paramAnalyzer, ReflectionResolver $reflectionResolver, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTypeChanger = $phpDocTypeChanger; $this->paramAnalyzer = $paramAnalyzer; $this->reflectionResolver = $reflectionResolver; + $this->phpDocInfoFactory = $phpDocInfoFactory; } /** * @return array> diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeCovariantReturnTypeRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeCovariantReturnTypeRector.php index 51b207c00..14e7cb675 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeCovariantReturnTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/ClassMethod/DowngradeCovariantReturnTypeRector.php @@ -17,6 +17,7 @@ use PHPStan\Type\StaticType; use PHPStan\Type\ThisType; use PHPStan\Type\Type; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -66,7 +67,12 @@ final class DowngradeCovariantReturnTypeRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ReturnTagRemover $returnTagRemover, ReflectionResolver $reflectionResolver, PrivatesAccessor $privatesAccessor, UnionTypeAnalyzer $unionTypeAnalyzer, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ReturnTagRemover $returnTagRemover, ReflectionResolver $reflectionResolver, PrivatesAccessor $privatesAccessor, UnionTypeAnalyzer $unionTypeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTypeChanger = $phpDocTypeChanger; $this->returnTagRemover = $returnTagRemover; @@ -74,6 +80,7 @@ public function __construct(PhpDocTypeChanger $phpDocTypeChanger, ReturnTagRemov $this->privatesAccessor = $privatesAccessor; $this->unionTypeAnalyzer = $unionTypeAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { 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 fa84a6e28..4d7910897 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 @@ -8,14 +8,13 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\Ternary; use PhpParser\Node\Scalar\String_; -use PHPStan\Analyser\Scope; -use Rector\Core\Rector\AbstractScopeAwareRector; +use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\Tests\DowngradePhp74\Rector\FuncCall\DowngradeProcOpenArrayCommandArgRector\DowngradeProcOpenArrayCommandArgRectorTest */ -final class DowngradeProcOpenArrayCommandArgRector extends AbstractScopeAwareRector +final class DowngradeProcOpenArrayCommandArgRector extends AbstractRector { public function getRuleDefinition() : RuleDefinition { @@ -37,7 +36,7 @@ public function getNodeTypes() : array /** * @param FuncCall $node */ - public function refactorWithScope(Node $node, Scope $scope) : ?FuncCall + public function refactor(Node $node) : ?FuncCall { if (!$this->isName($node, 'proc_open')) { return null; diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeStripTagsCallWithArrayRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeStripTagsCallWithArrayRector.php index ffe652f00..8d4d2ac9d 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeStripTagsCallWithArrayRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/FuncCall/DowngradeStripTagsCallWithArrayRector.php @@ -18,6 +18,7 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Name; use PhpParser\Node\Scalar\String_; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -26,6 +27,15 @@ */ final class DowngradeStripTagsCallWithArrayRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Convert 2nd argument in `strip_tags()` from array to string', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Identical/DowngradeFreadFwriteFalsyToNegationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Identical/DowngradeFreadFwriteFalsyToNegationRector.php index 5d422fc2c..7ec1759c2 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Identical/DowngradeFreadFwriteFalsyToNegationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Identical/DowngradeFreadFwriteFalsyToNegationRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\BinaryOp\Identical; use PhpParser\Node\Expr\BooleanNot; use PhpParser\Node\Expr\FuncCall; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,10 +17,19 @@ */ final class DowngradeFreadFwriteFalsyToNegationRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var string[] */ private const FUNC_FREAD_FWRITE = ['fread', 'fwrite']; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes fread() or fwrite() compare to false to negation check', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Property/DowngradeTypedPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Property/DowngradeTypedPropertyRector.php index 272604432..a826da8c6 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Property/DowngradeTypedPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp74/Rector/Property/DowngradeTypedPropertyRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr; use PhpParser\Node\NullableType; use PhpParser\Node\Stmt\Property; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\NodeManipulator\PropertyDecorator; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -21,9 +22,15 @@ final class DowngradeTypedPropertyRector extends AbstractRector * @var \Rector\NodeManipulator\PropertyDecorator */ private $propertyDecorator; - public function __construct(PropertyDecorator $propertyDecorator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(PropertyDecorator $propertyDecorator, ValueResolver $valueResolver) { $this->propertyDecorator = $propertyDecorator; + $this->valueResolver = $valueResolver; } /** * @return array> diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradeAttributeToAnnotationRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradeAttributeToAnnotationRector.php index a3e267814..6a8b84345 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradeAttributeToAnnotationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradeAttributeToAnnotationRector.php @@ -13,6 +13,7 @@ use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Rector\AbstractRector; @@ -38,6 +39,11 @@ final class DowngradeAttributeToAnnotationRector extends AbstractRector implemen * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var string[] */ @@ -50,10 +56,11 @@ final class DowngradeAttributeToAnnotationRector extends AbstractRector implemen * @var bool */ private $isDowngraded = \false; - public function __construct(DoctrineAnnotationFactory $doctrineAnnotationFactory, DocBlockUpdater $docBlockUpdater) + public function __construct(DoctrineAnnotationFactory $doctrineAnnotationFactory, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->doctrineAnnotationFactory = $doctrineAnnotationFactory; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradePropertyPromotionRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradePropertyPromotionRector.php index 54150e8d2..b18fb40c4 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradePropertyPromotionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Class_/DowngradePropertyPromotionRector.php @@ -15,7 +15,9 @@ use PhpParser\Node\Stmt\PropertyProperty; use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTypeChanger; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\PhpParser\Printer\BetterStandardPrinter; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; @@ -39,10 +41,22 @@ final class DowngradePropertyPromotionRector extends AbstractRector * @var \Rector\Core\PhpParser\Printer\BetterStandardPrinter */ private $betterStandardPrinter; - public function __construct(PhpDocTypeChanger $phpDocTypeChanger, BetterStandardPrinter $betterStandardPrinter) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(PhpDocTypeChanger $phpDocTypeChanger, BetterStandardPrinter $betterStandardPrinter, PhpDocInfoFactory $phpDocInfoFactory, BetterNodeFinder $betterNodeFinder) { $this->phpDocTypeChanger = $phpDocTypeChanger; $this->betterStandardPrinter = $betterStandardPrinter; + $this->phpDocInfoFactory = $phpDocInfoFactory; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Enum_/DowngradeEnumToConstantListClassRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Enum_/DowngradeEnumToConstantListClassRector.php index 2a0f52c45..4b16ec6b4 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Enum_/DowngradeEnumToConstantListClassRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Enum_/DowngradeEnumToConstantListClassRector.php @@ -18,6 +18,7 @@ use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\ReflectionProvider; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\DowngradePhp80\NodeAnalyzer\EnumAnalyzer; @@ -49,12 +50,18 @@ final class DowngradeEnumToConstantListClassRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(ClassFromEnumFactory $classFromEnumFactory, ReflectionProvider $reflectionProvider, EnumAnalyzer $enumAnalyzer, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(ClassFromEnumFactory $classFromEnumFactory, ReflectionProvider $reflectionProvider, EnumAnalyzer $enumAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->classFromEnumFactory = $classFromEnumFactory; $this->reflectionProvider = $reflectionProvider; $this->enumAnalyzer = $enumAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeThrowExprRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeThrowExprRector.php index f0716b0d3..77124157e 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeThrowExprRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/Expression/DowngradeThrowExprRector.php @@ -23,6 +23,7 @@ use PhpParser\Node\Stmt\If_; use PhpParser\Node\Stmt\Return_; use Rector\Core\NodeManipulator\BinaryOpManipulator; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\NodeAnalyzer\CoalesceAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -44,10 +45,16 @@ final class DowngradeThrowExprRector extends AbstractRector * @var \Rector\Core\NodeManipulator\BinaryOpManipulator */ private $binaryOpManipulator; - public function __construct(CoalesceAnalyzer $coalesceAnalyzer, BinaryOpManipulator $binaryOpManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(CoalesceAnalyzer $coalesceAnalyzer, BinaryOpManipulator $binaryOpManipulator, BetterNodeFinder $betterNodeFinder) { $this->coalesceAnalyzer = $coalesceAnalyzer; $this->binaryOpManipulator = $binaryOpManipulator; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { @@ -161,8 +168,8 @@ private function hasThrowInAssignExpr(Assign $assign) : bool */ private function refactorReturn(Return_ $return) : ?array { - $throwExpr = $this->betterNodeFinder->findFirstInstanceOf($return, Throw_::class); - if (!$throwExpr instanceof Throw_) { + $throw = $this->betterNodeFinder->findFirstInstanceOf($return, Throw_::class); + if (!$throw instanceof Throw_) { return null; } if ($return->expr instanceof Coalesce) { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeArrayFilterNullableCallbackRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeArrayFilterNullableCallbackRector.php index ec98d2109..1ba797ca9 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeArrayFilterNullableCallbackRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/FuncCall/DowngradeArrayFilterNullableCallbackRector.php @@ -26,6 +26,7 @@ use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\StringType; use Rector\Core\NodeAnalyzer\ArgsAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -42,9 +43,15 @@ final class DowngradeArrayFilterNullableCallbackRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\ArgsAnalyzer */ private $argsAnalyzer; - public function __construct(ArgsAnalyzer $argsAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ArgsAnalyzer $argsAnalyzer, ValueResolver $valueResolver) { $this->argsAnalyzer = $argsAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/New_/DowngradeArbitraryExpressionsSupportRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/New_/DowngradeArbitraryExpressionsSupportRector.php index 83b6e8435..c4a542e3e 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/New_/DowngradeArbitraryExpressionsSupportRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp80/Rector/New_/DowngradeArbitraryExpressionsSupportRector.php @@ -15,6 +15,7 @@ use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Expression; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\NodeFactory\NamedVariableFactory; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -32,9 +33,15 @@ final class DowngradeArbitraryExpressionsSupportRector extends AbstractRector * @var \Rector\NodeFactory\NamedVariableFactory */ private $namedVariableFactory; - public function __construct(NamedVariableFactory $namedVariableFactory) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(NamedVariableFactory $namedVariableFactory, BetterNodeFinder $betterNodeFinder) { $this->namedVariableFactory = $namedVariableFactory; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNewInInitializerRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNewInInitializerRector.php index 61cf7060f..8e06eea34 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNewInInitializerRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/FunctionLike/DowngradeNewInInitializerRector.php @@ -27,6 +27,7 @@ use PhpParser\Node\Stmt\Return_; use PhpParser\Node\UnionType; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; use Rector\Php72\NodeFactory\AnonymousFunctionFactory; @@ -44,9 +45,15 @@ final class DowngradeNewInInitializerRector extends AbstractRector * @var \Rector\Php72\NodeFactory\AnonymousFunctionFactory */ private $anonymousFunctionFactory; - public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(AnonymousFunctionFactory $anonymousFunctionFactory, BetterNodeFinder $betterNodeFinder) { $this->anonymousFunctionFactory = $anonymousFunctionFactory; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Property/DowngradeReadonlyPropertyRector.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Property/DowngradeReadonlyPropertyRector.php index c1ed48403..ca251cf9a 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Property/DowngradeReadonlyPropertyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/rules/DowngradePhp81/Rector/Property/DowngradeReadonlyPropertyRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\Property; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\Privatization\NodeManipulator\VisibilityManipulator; @@ -30,14 +31,19 @@ final class DowngradeReadonlyPropertyRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + protected $phpDocInfoFactory; /** * @var string */ private const TAGNAME = 'readonly'; - public function __construct(VisibilityManipulator $visibilityManipulator, DocBlockUpdater $docBlockUpdater) + public function __construct(VisibilityManipulator $visibilityManipulator, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->visibilityManipulator = $visibilityManipulator; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } /** * @return array> diff --git a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/ExprInTopStmtMatcher.php b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/ExprInTopStmtMatcher.php index a80ad491e..eb8e1499f 100644 --- a/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/ExprInTopStmtMatcher.php +++ b/vendor/rector/rector/vendor/rector/rector-downgrade-php/src/NodeAnalyzer/ExprInTopStmtMatcher.php @@ -6,7 +6,6 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\Closure; -use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Do_; use PhpParser\Node\Stmt\Echo_; use PhpParser\Node\Stmt\Expression; diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/composer.json b/vendor/rector/rector/vendor/rector/rector-phpunit/composer.json index bec5b037a..84235c309 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/composer.json +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/composer.json @@ -9,17 +9,17 @@ "require-dev": { "rector\/rector-src": "dev-main", "phpunit\/phpunit": "^10.2", - "phpstan\/phpstan": "^1.10.25", + "phpstan\/phpstan": "^1.10.34", "symplify\/phpstan-rules": "^11.4", "symplify\/phpstan-extensions": "^11.2", "symplify\/easy-coding-standard": "^12.0", "symplify\/rule-doc-generator": "^12.0", - "rector\/phpstan-rules": "^0.6", + "rector\/phpstan-rules": "^0.7", "phpstan\/extension-installer": "^1.3", "phpstan\/phpstan-strict-rules": "^1.5", "phpstan\/phpstan-webmozart-assert": "^1.2.2", - "symplify\/vendor-patches": "^11.2.0", - "symplify\/easy-ci": "^11.2.0", + "symplify\/vendor-patches": "^11.2", + "symplify\/easy-ci": "^11.3", "rector\/rector-generator": "^0.7", "tomasvotruba\/type-coverage": "^0.2", "tomasvotruba\/unused-public": "^0.3", diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rector.php index c2b06b10c..dd06f03db 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rector.php @@ -11,7 +11,7 @@ return static function (RectorConfig $rectorConfig) : void { $rectorConfig->importNames(); $rectorConfig->removeUnusedImports(); - $rectorConfig->paths([__DIR__ . '/src', __DIR__ . '/tests', __DIR__ . '/rules', __DIR__ . '/rules-tests']); + $rectorConfig->paths([__DIR__ . '/config', __DIR__ . '/src', __DIR__ . '/tests', __DIR__ . '/rules', __DIR__ . '/rules-tests', __DIR__ . '/rector.php', __DIR__ . '/ecs.php']); $rectorConfig->skip([ // for tests '*/Source/*', diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php index d7f8e7b2f..31003d1af 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DataProviderAnnotationToAttributeRector.php @@ -10,6 +10,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\Reflection\ClassReflection; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -50,13 +51,19 @@ final class DataProviderAnnotationToAttributeRector extends AbstractRector imple * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, ReflectionResolver $reflectionResolver, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, ReflectionResolver $reflectionResolver, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->phpDocTagRemover = $phpDocTagRemover; $this->reflectionResolver = $reflectionResolver; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php index 7afbac2bc..21dcce771 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/DependsAnnotationWithValueToAttributeRector.php @@ -9,6 +9,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -43,12 +44,18 @@ final class DependsAnnotationWithValueToAttributeRector extends AbstractRector i * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php index b329aba97..bc9159522 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/ClassMethod/TestWithAnnotationToAttributeRector.php @@ -9,11 +9,14 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\PhpAttribute\NodeFactory\PhpAttributeGroupFactory; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** @@ -22,7 +25,7 @@ * * @see \Rector\PHPUnit\Tests\AnnotationsToAttributes\Rector\ClassMethod\TestWithAnnotationToAttributeRector\TestWithAnnotationToAttributeRectorTest */ -final class TestWithAnnotationToAttributeRector extends AbstractRector +final class TestWithAnnotationToAttributeRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly @@ -44,12 +47,18 @@ final class TestWithAnnotationToAttributeRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpAttributeGroupFactory $phpAttributeGroupFactory, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -126,4 +135,8 @@ public function refactor(Node $node) : ?Node $node->attrGroups = \array_merge($node->attrGroups, $attributeGroups); return $node; } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::ATTRIBUTES; + } } diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php index 3d4171550..074c2c9f5 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/AnnotationWithValueToAttributeRector.php @@ -9,6 +9,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; @@ -40,15 +41,21 @@ final class AnnotationWithValueToAttributeRector extends AbstractRector implemen * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var AnnotationWithValueToAttribute[] */ private $annotationWithValueToAttributes = []; - public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, DocBlockUpdater $docBlockUpdater) + public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTagRemover = $phpDocTagRemover; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php index 1e6dbc806..e0f3ffba2 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/CoversAnnotationWithValueToAttributeRector.php @@ -10,6 +10,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -44,12 +45,18 @@ final class CoversAnnotationWithValueToAttributeRector extends AbstractRector im * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, TestsNodeAnalyzer $testsNodeAnalyzer, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PhpDocTagRemover $phpDocTagRemover, PhpAttributeGroupFactory $phpAttributeGroupFactory, TestsNodeAnalyzer $testsNodeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTagRemover = $phpDocTagRemover; $this->phpAttributeGroupFactory = $phpAttributeGroupFactory; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php index 087c5bb2d..7385d9fdf 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/AnnotationsToAttributes/Rector/Class_/TicketAnnotationToAttributeRector.php @@ -3,8 +3,8 @@ declare (strict_types=1); namespace Rector\PHPUnit\AnnotationsToAttributes\Rector\Class_; -use PhpParser\Node\Arg; use PhpParser\Node; +use PhpParser\Node\Arg; use PhpParser\Node\Attribute; use PhpParser\Node\AttributeGroup; use PhpParser\Node\Name\FullyQualified; @@ -15,14 +15,13 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use RectorPrefix202309\PHPUnit\Framework\Attributes\Ticket; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; -use Rector\PHPUnit\ValueObject\AnnotationWithValueToAttribute; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; -use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @changelog https://docs.phpunit.de/en/10.0/annotations.html#ticket @@ -41,10 +40,16 @@ final class TicketAnnotationToAttributeRector extends AbstractRector implements * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestAnnotationWithPrefixedFunctionRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestAnnotationWithPrefixedFunctionRector.php index be26c9c36..894e44b37 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestAnnotationWithPrefixedFunctionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/ClassMethod/ReplaceTestAnnotationWithPrefixedFunctionRector.php @@ -6,6 +6,7 @@ use PhpParser\Comment\Doc; use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -32,11 +33,17 @@ final class ReplaceTestAnnotationWithPrefixedFunctionRector extends AbstractRect * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddSeeTestAnnotationRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddSeeTestAnnotationRector.php index 1af92304d..67dae8993 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddSeeTestAnnotationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/AddSeeTestAnnotationRector.php @@ -10,6 +10,7 @@ use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; use PHPStan\Reflection\ReflectionProvider; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -41,16 +42,22 @@ final class AddSeeTestAnnotationRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * @var string */ private const SEE = 'see'; - public function __construct(ReflectionProvider $reflectionProvider, PhpDocTagRemover $phpDocTagRemover, TestClassNameResolver $testClassNameResolver, DocBlockUpdater $docBlockUpdater) + public function __construct(ReflectionProvider $reflectionProvider, PhpDocTagRemover $phpDocTagRemover, TestClassNameResolver $testClassNameResolver, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->reflectionProvider = $reflectionProvider; $this->phpDocTagRemover = $phpDocTagRemover; $this->testClassNameResolver = $testClassNameResolver; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php index 3ef24fe01..1f8d9bbe5 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/Class_/YieldDataProviderRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Core\PhpParser\NodeTransformer; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -40,11 +41,17 @@ final class YieldDataProviderRector extends AbstractRector * @var \Rector\PHPUnit\NodeFinder\DataProviderClassMethodFinder */ private $dataProviderClassMethodFinder; - public function __construct(NodeTransformer $nodeTransformer, TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(NodeTransformer $nodeTransformer, TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, PhpDocInfoFactory $phpDocInfoFactory) { $this->nodeTransformer = $nodeTransformer; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->dataProviderClassMethodFinder = $dataProviderClassMethodFinder; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertRegExpRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertRegExpRector.php index a21586a7a..5d3682667 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertRegExpRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertRegExpRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Identifier; use PhpParser\Node\Scalar\LNumber; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -26,6 +27,11 @@ final class AssertRegExpRector extends AbstractRector * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ private $testsNodeAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var string */ @@ -42,9 +48,10 @@ final class AssertRegExpRector extends AbstractRector * @var string */ private const ASSERT_NOT_EQUALS = 'assertNotEquals'; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameTrueFalseToAssertTrueFalseRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameTrueFalseToAssertTrueFalseRector.php index d7452406f..071d17651 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameTrueFalseToAssertTrueFalseRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/CodeQuality/Rector/MethodCall/AssertSameTrueFalseToAssertTrueFalseRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\ArgumentMover; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; @@ -26,10 +27,16 @@ final class AssertSameTrueFalseToAssertTrueFalseRector extends AbstractRector * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ private $testsNodeAnalyzer; - public function __construct(ArgumentMover $argumentMover, TestsNodeAnalyzer $testsNodeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ArgumentMover $argumentMover, TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver) { $this->argumentMover = $argumentMover; $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php index bfc2dd6a0..7096387fc 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/AddProphecyTraitRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\TraitUse; use PHPStan\Reflection\ClassReflection; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; @@ -32,14 +33,20 @@ final class AddProphecyTraitRector extends AbstractRector * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var string */ private const PROPHECY_TRAIT = 'Prophecy\\PhpUnit\\ProphecyTrait'; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ReflectionResolver $reflectionResolver) + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->reflectionResolver = $reflectionResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php index 55f95591c..48de9ab41 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit100/Rector/Class_/StaticDataProviderClassMethodRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\PHPUnit\NodeFinder\DataProviderClassMethodFinder; @@ -33,11 +34,17 @@ final class StaticDataProviderClassMethodRector extends AbstractRector * @var \Rector\Privatization\NodeManipulator\VisibilityManipulator */ private $visibilityManipulator; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, VisibilityManipulator $visibilityManipulator) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, DataProviderClassMethodFinder $dataProviderClassMethodFinder, VisibilityManipulator $visibilityManipulator, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->dataProviderClassMethodFinder = $dataProviderClassMethodFinder; $this->visibilityManipulator = $visibilityManipulator; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/AddDoesNotPerformAssertionToNonAssertingTestRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/AddDoesNotPerformAssertionToNonAssertingTestRector.php index a0aae8845..c0bcbb87c 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/AddDoesNotPerformAssertionToNonAssertingTestRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/AddDoesNotPerformAssertionToNonAssertingTestRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\PhpDocParser\Ast\PhpDoc\GenericTagValueNode; use PHPStan\PhpDocParser\Ast\PhpDoc\PhpDocTagNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\Php80\NodeAnalyzer\PhpAttributeAnalyzer; @@ -48,13 +49,19 @@ final class AddDoesNotPerformAssertionToNonAssertingTestRector extends AbstractR * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, AssertCallAnalyzer $assertCallAnalyzer, MockedVariableAnalyzer $mockedVariableAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, AssertCallAnalyzer $assertCallAnalyzer, MockedVariableAnalyzer $mockedVariableAnalyzer, PhpAttributeAnalyzer $phpAttributeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->assertCallAnalyzer = $assertCallAnalyzer; $this->mockedVariableAnalyzer = $mockedVariableAnalyzer; $this->phpAttributeAnalyzer = $phpAttributeAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/ExceptionAnnotationRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/ExceptionAnnotationRector.php index 37ced4361..8caa936cc 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/ExceptionAnnotationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit60/Rector/ClassMethod/ExceptionAnnotationRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Stmt\ClassMethod; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -41,18 +42,24 @@ final class ExceptionAnnotationRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; /** * In reversed order, which they should be called in code. * * @var array */ private const ANNOTATION_TO_METHOD = ['expectedExceptionMessageRegExp' => 'expectExceptionMessageRegExp', 'expectedExceptionMessage' => 'expectExceptionMessage', 'expectedExceptionCode' => 'expectExceptionCode', 'expectedException' => 'expectException']; - public function __construct(ExpectExceptionMethodCallFactory $expectExceptionMethodCallFactory, PhpDocTagRemover $phpDocTagRemover, TestsNodeAnalyzer $testsNodeAnalyzer, DocBlockUpdater $docBlockUpdater) + public function __construct(ExpectExceptionMethodCallFactory $expectExceptionMethodCallFactory, PhpDocTagRemover $phpDocTagRemover, TestsNodeAnalyzer $testsNodeAnalyzer, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->expectExceptionMethodCallFactory = $expectExceptionMethodCallFactory; $this->phpDocTagRemover = $phpDocTagRemover; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/AssertEqualsParameterToSpecificMethodsTypeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/AssertEqualsParameterToSpecificMethodsTypeRector.php index a5f5744c8..62e71f532 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/AssertEqualsParameterToSpecificMethodsTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit80/Rector/MethodCall/AssertEqualsParameterToSpecificMethodsTypeRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\StaticCall; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\PHPUnit\NodeFactory\AssertCallFactory; @@ -30,10 +31,16 @@ final class AssertEqualsParameterToSpecificMethodsTypeRector extends AbstractRec * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ private $testsNodeAnalyzer; - public function __construct(AssertCallFactory $assertCallFactory, TestsNodeAnalyzer $testsNodeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(AssertCallFactory $assertCallFactory, TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver) { $this->assertCallFactory = $assertCallFactory; $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php index c7ddd7a61..fdadbe04d 100644 --- a/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/rules/PHPUnit90/Rector/MethodCall/SpecificAssertContainsWithoutIdentityRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; use PHPStan\Type\StringType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -23,13 +24,19 @@ final class SpecificAssertContainsWithoutIdentityRector extends AbstractRector * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ private $testsNodeAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var array> */ private const OLD_METHODS_NAMES_TO_NEW_NAMES = ['string' => ['assertContains' => 'assertContainsEquals', 'assertNotContains' => 'assertNotContainsEquals']]; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, ValueResolver $valueResolver) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { 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 9be8ecd88..46a9d7383 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 @@ -16,23 +16,32 @@ use PhpParser\Node\Scalar\LNumber; use PhpParser\Node\Stmt\Expression; use PhpParser\Node\Stmt\Return_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; +use Rector\Core\ValueObject\PhpVersionFeature; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; +use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; /** * @see \Rector\PHPUnit\Tests\Rector\StmtsAwareInterface\WithConsecutiveRector\WithConsecutiveRectorTest */ -final class WithConsecutiveRector extends AbstractRector +final class WithConsecutiveRector extends AbstractRector implements MinPhpVersionInterface { /** * @readonly * @var \Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer */ private $testsNodeAnalyzer; - public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(TestsNodeAnalyzer $testsNodeAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->testsNodeAnalyzer = $testsNodeAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { @@ -112,6 +121,10 @@ public function refactor(Node $node) $matcherAssign = new Assign(new Variable('matcher'), $expectsMethodCall); return [new Expression($matcherAssign), $node]; } + public function provideMinPhpVersion() : int + { + return PhpVersionFeature::MATCH_EXPRESSION; + } private function createClosure(MethodCall $expectsMethodCall) : Closure { $closure = new Closure(); diff --git a/vendor/rector/rector/vendor/rector/rector-phpunit/src/Transform/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Transform/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php new file mode 100644 index 000000000..aee3b555f --- /dev/null +++ b/vendor/rector/rector/vendor/rector/rector-phpunit/src/Transform/AssertEqualsOrAssertSameFloatParameterToSpecificMethodsTypeRector.php @@ -0,0 +1,96 @@ +assertCallFactory = $assertCallFactory; + $this->testsNodeAnalyzer = $testsNodeAnalyzer; + } + public function getRuleDefinition() : RuleDefinition + { + return new RuleDefinition('Change assertEquals()/assertSame() method using float on expected argument to new specific alternatives.', [new CodeSample( + // code before + <<<'CODE_SAMPLE' +$this->assertSame(10.20, $value); +$this->assertEquals(10.20, $value); +$this->assertEquals(10.200, $value); +$this->assertSame(10, $value); +CODE_SAMPLE +, + <<<'CODE_SAMPLE' +$this->assertEqualsWithDelta(10.20, $value, 0.01); +$this->assertEqualsWithDelta(10.20, $value, 0.01); +$this->assertEqualsWithDelta(10.200, $value, 0.001); +$this->assertSame(10, $value); +CODE_SAMPLE + + )]); + } + /** + * @return array> + */ + public function getNodeTypes() : array + { + return [MethodCall::class]; + } + /** + * @param MethodCall $node + */ + public function refactor(Node $node) : ?Node + { + if (!$this->testsNodeAnalyzer->isPHPUnitMethodCallNames($node, ['assertEquals', 'assertSame'])) { + return null; + } + $args = $node->getArgs(); + $firstValue = $args[0]->value; + if (!$firstValue instanceof DNumber) { + return null; + } + $newMethodCall = $this->assertCallFactory->createCallWithName($node, 'assertEqualsWithDelta'); + $newMethodCall->args[0] = $args[0]; + $newMethodCall->args[1] = $args[1]; + $newMethodCall->args[2] = new Arg(new DNumber($this->generateDelta($firstValue))); + return $newMethodCall; + } + private function generateDelta(DNumber $dNumber) : float + { + $rawValueNumber = $dNumber->getAttribute('rawValue'); + $countDecimals = \strrpos((string) $rawValueNumber, '.'); + if ($countDecimals === \false) { + throw new InvalidArgumentException('First argument passed in the function is not a float.'); + } + $countHowManyDecimals = \strlen((string) $rawValueNumber) - $countDecimals - 2; + if ($countHowManyDecimals < 1) { + return 0.1; + } + $mountFloat = \number_format(0.0, $countHowManyDecimals, '.', '0') . '1'; + return (float) $mountFloat; + } +} diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/composer.json b/vendor/rector/rector/vendor/rector/rector-symfony/composer.json index 7fae71fcc..7c557a9b8 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/composer.json +++ b/vendor/rector/rector/vendor/rector/rector-symfony/composer.json @@ -14,7 +14,7 @@ "phpunit\/phpunit": "^10.3", "rector\/phpstan-rules": "^0.6", "rector\/rector-generator": "^0.7", - "rector\/rector-src": "dev-tv-narrow-abstract-10", + "rector\/rector-src": "dev-main", "symfony\/config": "^6.3", "symfony\/dependency-injection": "^6.3", "symfony\/routing": "^6.2", diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/ResponseStatusCodeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/ResponseStatusCodeRector.php index e630d04e8..9e84703a2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/ResponseStatusCodeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/BinaryOp/ResponseStatusCodeRector.php @@ -9,7 +9,6 @@ use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; -use PhpParser\Node\Identifier; use PhpParser\Node\Scalar\LNumber; use PHPStan\Type\ObjectType; use Rector\Core\Rector\AbstractRector; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/RemoveUnusedRequestParamRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/RemoveUnusedRequestParamRector.php index dac71bb83..3b76007d2 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/RemoveUnusedRequestParamRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/RemoveUnusedRequestParamRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Reflection\ClassReflection; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer; @@ -34,11 +35,17 @@ final class RemoveUnusedRequestParamRector extends AbstractRector * @var \Rector\FamilyTree\NodeAnalyzer\ClassChildAnalyzer */ private $classChildAnalyzer; - public function __construct(ControllerAnalyzer $controllerAnalyzer, ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ControllerAnalyzer $controllerAnalyzer, ReflectionResolver $reflectionResolver, ClassChildAnalyzer $classChildAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->controllerAnalyzer = $controllerAnalyzer; $this->reflectionResolver = $reflectionResolver; $this->classChildAnalyzer = $classChildAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ResponseReturnTypeControllerActionRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ResponseReturnTypeControllerActionRector.php index 2429d4440..df23470cb 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ResponseReturnTypeControllerActionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/ResponseReturnTypeControllerActionRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\NullableType; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Doctrine\NodeAnalyzer\AttrinationFinder; use Rector\Symfony\Enum\SensioAttribute; @@ -33,10 +34,16 @@ final class ResponseReturnTypeControllerActionRector extends AbstractRector * @var \Rector\Doctrine\NodeAnalyzer\AttrinationFinder */ private $attrinationFinder; - public function __construct(ControllerAnalyzer $controllerAnalyzer, AttrinationFinder $attrinationFinder) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ControllerAnalyzer $controllerAnalyzer, AttrinationFinder $attrinationFinder, BetterNodeFinder $betterNodeFinder) { $this->controllerAnalyzer = $controllerAnalyzer; $this->attrinationFinder = $attrinationFinder; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/TemplateAnnotationToThisRenderRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/TemplateAnnotationToThisRenderRector.php index 563b85b6d..5de878447 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/TemplateAnnotationToThisRenderRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/ClassMethod/TemplateAnnotationToThisRenderRector.php @@ -19,9 +19,11 @@ use PHPStan\Type\MixedType; use PHPStan\Type\ObjectType; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\Annotation\AnnotationAnalyzer; use Rector\Symfony\Enum\SymfonyAnnotation; @@ -75,7 +77,17 @@ final class TemplateAnnotationToThisRenderRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(ArrayUnionResponseTypeAnalyzer $arrayUnionResponseTypeAnalyzer, ReturnTypeDeclarationUpdater $returnTypeDeclarationUpdater, ThisRenderFactory $thisRenderFactory, PhpDocTagRemover $phpDocTagRemover, EmptyReturnNodeFinder $emptyReturnNodeFinder, AnnotationAnalyzer $annotationAnalyzer, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(ArrayUnionResponseTypeAnalyzer $arrayUnionResponseTypeAnalyzer, ReturnTypeDeclarationUpdater $returnTypeDeclarationUpdater, ThisRenderFactory $thisRenderFactory, PhpDocTagRemover $phpDocTagRemover, EmptyReturnNodeFinder $emptyReturnNodeFinder, AnnotationAnalyzer $annotationAnalyzer, DocBlockUpdater $docBlockUpdater, BetterNodeFinder $betterNodeFinder, PhpDocInfoFactory $phpDocInfoFactory) { $this->arrayUnionResponseTypeAnalyzer = $arrayUnionResponseTypeAnalyzer; $this->returnTypeDeclarationUpdater = $returnTypeDeclarationUpdater; @@ -84,6 +96,8 @@ public function __construct(ArrayUnionResponseTypeAnalyzer $arrayUnionResponseTy $this->emptyReturnNodeFinder = $emptyReturnNodeFinder; $this->annotationAnalyzer = $annotationAnalyzer; $this->docBlockUpdater = $docBlockUpdater; + $this->betterNodeFinder = $betterNodeFinder; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php index be7fc8033..40d11aa31 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/LoadValidatorMetadataToAnnotationRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Property; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -46,12 +47,18 @@ final class LoadValidatorMetadataToAnnotationRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(MethodCallAnnotationAssertResolver $methodCallAnnotationAssertResolver, PropertyAnnotationAssertResolver $propertyAnnotationAssertResolver, ClassAnnotationAssertResolver $classAnnotationAssertResolver, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(MethodCallAnnotationAssertResolver $methodCallAnnotationAssertResolver, PropertyAnnotationAssertResolver $propertyAnnotationAssertResolver, ClassAnnotationAssertResolver $classAnnotationAssertResolver, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->methodCallAnnotationAssertResolver = $methodCallAnnotationAssertResolver; $this->propertyAnnotationAssertResolver = $propertyAnnotationAssertResolver; $this->classAnnotationAssertResolver = $classAnnotationAssertResolver; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php index 8a963663c..730b6973f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Class_/MakeCommandLazyRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Expr; use PhpParser\Node\Expr\MethodCall; +use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; @@ -81,10 +82,7 @@ public function refactor(Node $node) : ?Node private function resolveCommandNameFromSetName(Class_ $class) : ?Expr { $configureClassMethod = $class->getMethod('configure'); - if (!$configureClassMethod instanceof ClassMethod) { - return null; - } - if ($configureClassMethod->stmts === null) { + if (!$configureClassMethod instanceof ClassMethod || $configureClassMethod->stmts === null) { return null; } foreach ($configureClassMethod->stmts as $key => $stmt) { @@ -95,18 +93,32 @@ private function resolveCommandNameFromSetName(Class_ $class) : ?Expr continue; } $methodCall = $stmt->expr; - if (!$this->isName($methodCall->name, 'setName')) { - continue; - } - if (!$this->isObjectType($methodCall->var, new ObjectType('Symfony\\Component\\Console\\Command\\Command'))) { - continue; + if ($methodCall->var instanceof Variable) { + return $this->resolveFromNonFluentMethodCall($methodCall, $configureClassMethod, $key); } - $commandNameEpxr = $methodCall->getArgs()[0]->value; - unset($configureClassMethod->stmts[$key]); - return $commandNameEpxr; + $expr = null; + $this->traverseNodesWithCallable($stmt, function (Node $node) use(&$expr) { + if ($node instanceof MethodCall && $this->isName($node->name, 'setName')) { + $expr = $node->getArgs()[0]->value; + // remove nested call + return $node->var; + } + return null; + }); + return $expr; } return null; } + private function resolveFromNonFluentMethodCall(MethodCall $methodCall, ClassMethod $classMethod, int $key) : ?Expr + { + if (!$this->isName($methodCall->name, 'setName')) { + return null; + } + $expr = $methodCall->getArgs()[0]->value; + // cleanup fluent call + unset($classMethod->stmts[$key]); + return $expr; + } private function createStaticProtectedPropertyWithDefault(string $name, Node $node) : Property { $property = new \PhpParser\Builder\Property($name); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php index d2135a213..465ec4ec0 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/CodeQuality/Rector/Closure/StringExtensionToConfigBuilderRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Param; use PhpParser\Node\Stmt\Expression; use Rector\Core\Exception\NotImplementedYetException; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Naming\Naming\PropertyNaming; use Rector\Symfony\NodeAnalyzer\SymfonyClosureExtensionMatcher; @@ -41,15 +42,21 @@ final class StringExtensionToConfigBuilderRector extends AbstractRector * @var \Rector\Naming\Naming\PropertyNaming */ private $propertyNaming; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var array */ private const EXTENSION_KEY_TO_CLASS_MAP = ['security' => 'Symfony\\Config\\SecurityConfig', 'framework' => 'Symfony\\Config\\FrameworkConfig']; - public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, SymfonyClosureExtensionMatcher $symfonyClosureExtensionMatcher, PropertyNaming $propertyNaming) + public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, SymfonyClosureExtensionMatcher $symfonyClosureExtensionMatcher, PropertyNaming $propertyNaming, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; $this->symfonyClosureExtensionMatcher = $symfonyClosureExtensionMatcher; $this->propertyNaming = $propertyNaming; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/ClassMethod/AddRouteAnnotationRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/ClassMethod/AddRouteAnnotationRector.php index c96812df3..037bec229 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/ClassMethod/AddRouteAnnotationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/ClassMethod/AddRouteAnnotationRector.php @@ -9,6 +9,7 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\StringNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser; use Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\CurlyListNode; use Rector\Core\Rector\AbstractRector; @@ -38,11 +39,17 @@ final class AddRouteAnnotationRector extends AbstractRector * @var \Rector\BetterPhpDocParser\PhpDocParser\StaticDoctrineAnnotationParser\ArrayParser */ private $arrayParser; - public function __construct(SymfonyRoutesProviderInterface $symfonyRoutesProvider, SymfonyRouteTagValueNodeFactory $symfonyRouteTagValueNodeFactory, ArrayParser $arrayParser) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(SymfonyRoutesProviderInterface $symfonyRoutesProvider, SymfonyRouteTagValueNodeFactory $symfonyRouteTagValueNodeFactory, ArrayParser $arrayParser, PhpDocInfoFactory $phpDocInfoFactory) { $this->symfonyRoutesProvider = $symfonyRoutesProvider; $this->symfonyRouteTagValueNodeFactory = $symfonyRouteTagValueNodeFactory; $this->arrayParser = $arrayParser; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getNodeTypes() : array { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceArgsToServiceNamedArgRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceArgsToServiceNamedArgRector.php index 7259fe066..32a3c562e 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceArgsToServiceNamedArgRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceArgsToServiceNamedArgRector.php @@ -16,6 +16,7 @@ use PHPStan\Reflection\Php\PhpParameterReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -35,10 +36,16 @@ final class ServiceArgsToServiceNamedArgRector extends AbstractRector * @var \PHPStan\Reflection\ReflectionProvider */ private $reflectionProvider; - public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ReflectionProvider $reflectionProvider) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ReflectionProvider $reflectionProvider, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; $this->reflectionProvider = $reflectionProvider; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { @@ -150,10 +157,10 @@ private function isServiceArgsMethodCall(MethodCall $methodCall) : bool } return $this->isObjectType($methodCall->var, new ObjectType('Symfony\\Component\\DependencyInjection\\Loader\\Configurator\\ServiceConfigurator')); } - private function createArgMethodCall(string $parameterName, Expr $expr, ?MethodCall $argMethodCall, MethodCall $node) : MethodCall + private function createArgMethodCall(string $parameterName, Expr $expr, ?MethodCall $argMethodCall, MethodCall $methodCall) : MethodCall { $argArgs = [new Arg(new String_($parameterName)), new Arg($expr)]; - $callerExpr = $argMethodCall instanceof MethodCall ? $argMethodCall : $node->var; + $callerExpr = $argMethodCall instanceof MethodCall ? $argMethodCall : $methodCall->var; return new MethodCall($callerExpr, 'arg', $argArgs); } /** diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSettersToSettersAutodiscoveryRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSettersToSettersAutodiscoveryRector.php index 301d114eb..f6ca4a5df 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSettersToSettersAutodiscoveryRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceSettersToSettersAutodiscoveryRector.php @@ -18,6 +18,7 @@ use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ObjectType; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\MinimalSharedStringSolver; use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; @@ -45,16 +46,22 @@ final class ServiceSettersToSettersAutodiscoveryRector extends AbstractRector * @var \Symfony\Component\Filesystem\Filesystem */ private $filesystem; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @readonly * @var \Rector\Symfony\MinimalSharedStringSolver */ private $minimalSharedStringSolver; - public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ReflectionProvider $reflectionProvider, Filesystem $filesystem) + public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ReflectionProvider $reflectionProvider, Filesystem $filesystem, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; $this->reflectionProvider = $reflectionProvider; $this->filesystem = $filesystem; + $this->valueResolver = $valueResolver; $this->minimalSharedStringSolver = new MinimalSharedStringSolver(); } public function getRuleDefinition() : RuleDefinition diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceTagsToDefaultsAutoconfigureRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceTagsToDefaultsAutoconfigureRector.php index 84f95f8ad..7c505cd11 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceTagsToDefaultsAutoconfigureRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServiceTagsToDefaultsAutoconfigureRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Stmt\Expression; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -24,6 +25,11 @@ final class ServiceTagsToDefaultsAutoconfigureRector extends AbstractRector * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ private $symfonyPhpClosureDetector; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var string[] */ @@ -35,9 +41,10 @@ final class ServiceTagsToDefaultsAutoconfigureRector extends AbstractRector 'monolog.logger', 'security.voter', ]; - public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector) + public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php index d0c59802b..ef84ba63a 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Configs/Rector/Closure/ServicesSetNameToSetTypeRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Scalar\String_; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -26,6 +27,11 @@ final class ServicesSetNameToSetTypeRector extends AbstractRector * @var \Rector\Symfony\NodeAnalyzer\SymfonyPhpClosureDetector */ private $symfonyPhpClosureDetector; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var array */ @@ -38,9 +44,10 @@ final class ServicesSetNameToSetTypeRector extends AbstractRector * @var array */ private $servicesNamesByType = []; - public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector) + public function __construct(SymfonyPhpClosureDetector $symfonyPhpClosureDetector, ValueResolver $valueResolver) { $this->symfonyPhpClosureDetector = $symfonyPhpClosureDetector; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/MaxLengthSymfonyFormOptionToAttrRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/MaxLengthSymfonyFormOptionToAttrRector.php index d6c9f1f30..48f9b7fed 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/MaxLengthSymfonyFormOptionToAttrRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony25/Rector/MethodCall/MaxLengthSymfonyFormOptionToAttrRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Scalar\String_; use PHPStan\Type\ObjectType; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -23,6 +24,15 @@ */ final class MaxLengthSymfonyFormOptionToAttrRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change form option "max_length" to a form "attr" > "max_length"', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony26/Rector/MethodCall/RedirectToRouteRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony26/Rector/MethodCall/RedirectToRouteRector.php index c7dac5352..1804cfb07 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony26/Rector/MethodCall/RedirectToRouteRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony26/Rector/MethodCall/RedirectToRouteRector.php @@ -6,6 +6,7 @@ use PhpParser\Node; use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\TypeAnalyzer\ControllerAnalyzer; use RectorPrefix202309\Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -21,9 +22,15 @@ final class RedirectToRouteRector extends AbstractRector * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ private $controllerAnalyzer; - public function __construct(ControllerAnalyzer $controllerAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ControllerAnalyzer $controllerAnalyzer, ValueResolver $valueResolver) { $this->controllerAnalyzer = $controllerAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony27/Rector/MethodCall/ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony27/Rector/MethodCall/ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector.php index a765c527c..3719b1643 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony27/Rector/MethodCall/ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony27/Rector/MethodCall/ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer; use Rector\Symfony\NodeAnalyzer\FormCollectionAnalyzer; @@ -37,15 +38,21 @@ final class ChangeCollectionTypeOptionNameFromTypeToEntryTypeRector extends Abst * @var \Rector\Symfony\NodeAnalyzer\FormCollectionAnalyzer */ private $formCollectionAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var array */ private const OLD_TO_NEW_OPTION_NAME = ['type' => 'entry_type', 'options' => 'entry_options']; - public function __construct(FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormCollectionAnalyzer $formCollectionAnalyzer) + public function __construct(FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormCollectionAnalyzer $formCollectionAnalyzer, ValueResolver $valueResolver) { $this->formAddMethodCallAnalyzer = $formAddMethodCallAnalyzer; $this->formOptionsArrayMatcher = $formOptionsArrayMatcher; $this->formCollectionAnalyzer = $formCollectionAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php index 37f361b9e..d1005ac30 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/GetRequestRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use Rector\Core\Exception\ShouldNotHappenException; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\Bridge\NodeAnalyzer\ControllerMethodAnalyzer; use Rector\Symfony\TypeAnalyzer\ControllerAnalyzer; @@ -32,6 +33,11 @@ final class GetRequestRector extends AbstractRector * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ private $controllerAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; /** * @var string */ @@ -40,10 +46,11 @@ final class GetRequestRector extends AbstractRector * @var string|null */ private $requestVariableAndParamName; - public function __construct(ControllerMethodAnalyzer $controllerMethodAnalyzer, ControllerAnalyzer $controllerAnalyzer) + public function __construct(ControllerMethodAnalyzer $controllerMethodAnalyzer, ControllerAnalyzer $controllerAnalyzer, BetterNodeFinder $betterNodeFinder) { $this->controllerMethodAnalyzer = $controllerMethodAnalyzer; $this->controllerAnalyzer = $controllerAnalyzer; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php index c33530cd9..179996048 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/ClassMethod/RemoveDefaultGetBlockPrefixRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,6 +21,15 @@ */ final class RemoveDefaultGetBlockPrefixRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Rename `getBlockPrefix()` if it returns the default value - class to underscore, e.g. UserFormType = user_form', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ChangeStringCollectionOptionToConstantRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ChangeStringCollectionOptionToConstantRector.php index 56c66b20e..6586efd13 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ChangeStringCollectionOptionToConstantRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/ChangeStringCollectionOptionToConstantRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\FormHelper\FormTypeStringToTypeProvider; use Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer; @@ -45,12 +46,18 @@ final class ChangeStringCollectionOptionToConstantRector extends AbstractRector * @var \Rector\Symfony\NodeAnalyzer\FormCollectionAnalyzer */ private $formCollectionAnalyzer; - public function __construct(FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormTypeStringToTypeProvider $formTypeStringToTypeProvider, FormCollectionAnalyzer $formCollectionAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormTypeStringToTypeProvider $formTypeStringToTypeProvider, FormCollectionAnalyzer $formCollectionAnalyzer, ValueResolver $valueResolver) { $this->formAddMethodCallAnalyzer = $formAddMethodCallAnalyzer; $this->formOptionsArrayMatcher = $formOptionsArrayMatcher; $this->formTypeStringToTypeProvider = $formTypeStringToTypeProvider; $this->formCollectionAnalyzer = $formCollectionAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/FormTypeInstanceToClassConstRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/FormTypeInstanceToClassConstRector.php index 2611666ac..d5cb06aa6 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/FormTypeInstanceToClassConstRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony30/Rector/MethodCall/FormTypeInstanceToClassConstRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\NodeAnalyzer\FormAddMethodCallAnalyzer; use Rector\Symfony\NodeAnalyzer\FormCollectionAnalyzer; @@ -56,13 +57,19 @@ final class FormTypeInstanceToClassConstRector extends AbstractRector * @var \Rector\Symfony\TypeAnalyzer\ControllerAnalyzer */ private $controllerAnalyzer; - public function __construct(FormInstanceToFormClassConstFetchConverter $formInstanceToFormClassConstFetchConverter, FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormCollectionAnalyzer $formCollectionAnalyzer, ControllerAnalyzer $controllerAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(FormInstanceToFormClassConstFetchConverter $formInstanceToFormClassConstFetchConverter, FormAddMethodCallAnalyzer $formAddMethodCallAnalyzer, FormOptionsArrayMatcher $formOptionsArrayMatcher, FormCollectionAnalyzer $formCollectionAnalyzer, ControllerAnalyzer $controllerAnalyzer, ValueResolver $valueResolver) { $this->formInstanceToFormClassConstFetchConverter = $formInstanceToFormClassConstFetchConverter; $this->formAddMethodCallAnalyzer = $formAddMethodCallAnalyzer; $this->formOptionsArrayMatcher = $formOptionsArrayMatcher; $this->formCollectionAnalyzer = $formCollectionAnalyzer; $this->controllerAnalyzer = $controllerAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/MergeMethodAnnotationToRouteAnnotationRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/MergeMethodAnnotationToRouteAnnotationRector.php index 6fd88782b..42cf6ceca 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/MergeMethodAnnotationToRouteAnnotationRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/MergeMethodAnnotationToRouteAnnotationRector.php @@ -8,8 +8,8 @@ use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; use Rector\BetterPhpDocParser\PhpDoc\StringNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; -use Rector\BetterPhpDocParser\Printer\PhpDocInfoPrinter; use Rector\BetterPhpDocParser\ValueObject\PhpDoc\DoctrineAnnotation\CurlyListNode; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; @@ -35,10 +35,16 @@ final class MergeMethodAnnotationToRouteAnnotationRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(PhpDocTagRemover $phpDocTagRemover, DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->phpDocTagRemover = $phpDocTagRemover; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/RemoveServiceFromSensioRouteRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/RemoveServiceFromSensioRouteRector.php index 3235610f1..383fe3b31 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/RemoveServiceFromSensioRouteRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/RemoveServiceFromSensioRouteRector.php @@ -7,6 +7,8 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -21,9 +23,15 @@ final class RemoveServiceFromSensioRouteRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + public function __construct(DocBlockUpdater $docBlockUpdater, PhpDocInfoFactory $phpDocInfoFactory) { $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -67,7 +75,10 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + if (!$phpDocInfo instanceof PhpDocInfo) { + return null; + } $doctrineAnnotationTagValueNode = $phpDocInfo->getByAnnotationClass('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Route'); if (!$doctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) { return null; diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/ReplaceSensioRouteAnnotationWithSymfonyRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/ReplaceSensioRouteAnnotationWithSymfonyRector.php index e0d989212..47031c6d3 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/ReplaceSensioRouteAnnotationWithSymfonyRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony34/Rector/ClassMethod/ReplaceSensioRouteAnnotationWithSymfonyRector.php @@ -6,8 +6,12 @@ use PhpParser\Node; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; -use Rector\BetterPhpDocParser\PhpDoc\DoctrineAnnotationTagValueNode; +use Rector\BetterPhpDocParser\PhpDoc\ArrayItemNode; +use Rector\BetterPhpDocParser\PhpDoc\StringNode; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo; +use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; use Rector\BetterPhpDocParser\PhpDocManipulator\PhpDocTagRemover; +use Rector\BetterPhpDocParser\PhpDocNodeFinder\PhpDocNodeByTypeFinder; use Rector\Comments\NodeDocBlock\DocBlockUpdater; use Rector\Core\Configuration\RenamedClassesDataCollector; use Rector\Core\Rector\AbstractRector; @@ -43,12 +47,28 @@ final class ReplaceSensioRouteAnnotationWithSymfonyRector extends AbstractRector * @var \Rector\Comments\NodeDocBlock\DocBlockUpdater */ private $docBlockUpdater; - public function __construct(SymfonyRouteTagValueNodeFactory $symfonyRouteTagValueNodeFactory, PhpDocTagRemover $phpDocTagRemover, RenamedClassesDataCollector $renamedClassesDataCollector, DocBlockUpdater $docBlockUpdater) + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocNodeFinder\PhpDocNodeByTypeFinder + */ + private $phpDocNodeByTypeFinder; + /** + * @readonly + * @var \Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory + */ + private $phpDocInfoFactory; + /** + * @var string + */ + private const SENSIO_ROUTE_NAME = 'Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Route'; + public function __construct(SymfonyRouteTagValueNodeFactory $symfonyRouteTagValueNodeFactory, PhpDocTagRemover $phpDocTagRemover, RenamedClassesDataCollector $renamedClassesDataCollector, DocBlockUpdater $docBlockUpdater, PhpDocNodeByTypeFinder $phpDocNodeByTypeFinder, PhpDocInfoFactory $phpDocInfoFactory) { $this->symfonyRouteTagValueNodeFactory = $symfonyRouteTagValueNodeFactory; $this->phpDocTagRemover = $phpDocTagRemover; $this->renamedClassesDataCollector = $renamedClassesDataCollector; $this->docBlockUpdater = $docBlockUpdater; + $this->phpDocNodeByTypeFinder = $phpDocNodeByTypeFinder; + $this->phpDocInfoFactory = $phpDocInfoFactory; } public function getRuleDefinition() : RuleDefinition { @@ -92,21 +112,54 @@ public function getNodeTypes() : array */ public function refactor(Node $node) : ?Node { - $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); - if ($phpDocInfo->hasByAnnotationClass(SymfonyAnnotation::ROUTE)) { + // early return in case of non public method + if ($node instanceof ClassMethod && !$node->isPublic()) { + return null; + } + $phpDocInfo = $this->phpDocInfoFactory->createFromNode($node); + if (!$phpDocInfo instanceof PhpDocInfo) { return null; } - $doctrineAnnotationTagValueNode = $phpDocInfo->getByAnnotationClass('Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Route'); - if (!$doctrineAnnotationTagValueNode instanceof DoctrineAnnotationTagValueNode) { + $sensioDoctrineAnnotationTagValueNodes = $this->phpDocNodeByTypeFinder->findDoctrineAnnotationsByClass($phpDocInfo->getPhpDocNode(), self::SENSIO_ROUTE_NAME); + // nothing to find + if ($sensioDoctrineAnnotationTagValueNodes === []) { return null; } - $this->renamedClassesDataCollector->addOldToNewClasses(['Sensio\\Bundle\\FrameworkExtraBundle\\Configuration\\Route' => SymfonyAnnotation::ROUTE]); - $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $doctrineAnnotationTagValueNode); - // unset service, that is deprecated - $values = $doctrineAnnotationTagValueNode->getValues(); - $symfonyRouteTagValueNode = $this->symfonyRouteTagValueNodeFactory->createFromItems($values); - $phpDocInfo->addTagValueNode($symfonyRouteTagValueNode); + foreach ($sensioDoctrineAnnotationTagValueNodes as $sensioDoctrineAnnotationTagValueNode) { + $this->phpDocTagRemover->removeTagValueFromNode($phpDocInfo, $sensioDoctrineAnnotationTagValueNode); + // unset service, that is deprecated + $sensioDoctrineAnnotationTagValueNode->removeValue('service'); + $values = $sensioDoctrineAnnotationTagValueNode->getValues(); + $symfonyRouteTagValueNode = $this->symfonyRouteTagValueNodeFactory->createFromItems($values); + // avoid adding this one + if ($node instanceof Class_ && $this->isSingleItemWithDefaultPath($values)) { + continue; + } + $phpDocInfo->addTagValueNode($symfonyRouteTagValueNode); + } + $this->renamedClassesDataCollector->addOldToNewClasses([self::SENSIO_ROUTE_NAME => SymfonyAnnotation::ROUTE]); $this->docBlockUpdater->updateRefactoredNodeWithPhpDocInfo($node); return $node; } + /** + * @param mixed[] $values + */ + private function isSingleItemWithDefaultPath(array $values) : bool + { + if (\count($values) !== 1) { + return \false; + } + $singleValue = $values[0]; + if (!$singleValue instanceof ArrayItemNode) { + return \false; + } + if ($singleValue->key !== null) { + return \false; + } + $stringNode = $singleValue->value; + if (!$stringNode instanceof StringNode) { + return \false; + } + return $singleValue->value->value === '/'; + } } diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/ConstFetch/ConstraintUrlOptionRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/ConstFetch/ConstraintUrlOptionRector.php index e4ea188ec..ae26ec830 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/ConstFetch/ConstraintUrlOptionRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony40/Rector/ConstFetch/ConstraintUrlOptionRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\ArrayItem; use PhpParser\Node\Expr\New_; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -19,10 +20,19 @@ */ final class ConstraintUrlOptionRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var string */ private const URL_CONSTRAINT_CLASS = 'Symfony\\Component\\Validator\\Constraints\\Url'; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Turns true value to `Url::CHECK_DNS_TYPE_ANY` in Validator in Symfony.', [new CodeSample('$constraint = new Url(["checkDNS" => true]);', '$constraint = new Url(["checkDNS" => Url::CHECK_DNS_TYPE_ANY]);')]); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/RootNodeTreeBuilderRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/RootNodeTreeBuilderRector.php index 926069c50..0e78a1ac1 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/RootNodeTreeBuilderRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony42/Rector/New_/RootNodeTreeBuilderRector.php @@ -12,6 +12,7 @@ use PhpParser\Node\Stmt\Expression; use PHPStan\Type\ObjectType; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -22,6 +23,15 @@ */ final class RootNodeTreeBuilderRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(BetterNodeFinder $betterNodeFinder) + { + $this->betterNodeFinder = $betterNodeFinder; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes TreeBuilder with root() call to constructor passed root and getRootNode() call', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/ClassMethod/EventDispatcherParentConstructRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/ClassMethod/EventDispatcherParentConstructRector.php index dbdd948e8..6b1f2f549 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/ClassMethod/EventDispatcherParentConstructRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/ClassMethod/EventDispatcherParentConstructRector.php @@ -3,13 +3,14 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony43\Rector\ClassMethod; -use PHPStan\Reflection\ClassReflection; use PhpParser\Node; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; use PHPStan\Analyser\Scope; +use PHPStan\Reflection\ClassReflection; use Rector\Core\Enum\ObjectReference; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\MethodName; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -19,6 +20,15 @@ */ final class EventDispatcherParentConstructRector extends AbstractScopeAwareRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(BetterNodeFinder $betterNodeFinder) + { + $this->betterNodeFinder = $betterNodeFinder; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Removes parent construct method call in EventDispatcher class', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/ConvertRenderTemplateShortNotationToBundleSyntaxRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/ConvertRenderTemplateShortNotationToBundleSyntaxRector.php index fa7a3ef16..37ddf0b22 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/ConvertRenderTemplateShortNotationToBundleSyntaxRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/ConvertRenderTemplateShortNotationToBundleSyntaxRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Scalar\String_; use PHPStan\Type\ObjectType; use PHPStan\Type\ThisType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -22,6 +23,15 @@ */ final class ConvertRenderTemplateShortNotationToBundleSyntaxRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Change Twig template short name to bundle syntax in render calls from controllers', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/MakeDispatchFirstArgumentEventRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/MakeDispatchFirstArgumentEventRector.php index 74b274c4f..2b577f5d7 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/MakeDispatchFirstArgumentEventRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/MakeDispatchFirstArgumentEventRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -26,9 +27,15 @@ final class MakeDispatchFirstArgumentEventRector extends AbstractRector * @var \Rector\NodeTypeResolver\TypeAnalyzer\StringTypeAnalyzer */ private $stringTypeAnalyzer; - public function __construct(StringTypeAnalyzer $stringTypeAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(StringTypeAnalyzer $stringTypeAnalyzer, ValueResolver $valueResolver) { $this->stringTypeAnalyzer = $stringTypeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertIsSuccessfulRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertIsSuccessfulRector.php index 853bd0d7f..a44d53c1f 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertIsSuccessfulRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertIsSuccessfulRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Scalar\String_; use Rector\Core\NodeAnalyzer\ExprAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Symfony\NodeAnalyzer\SymfonyTestCaseAnalyzer; @@ -37,11 +38,17 @@ final class WebTestCaseAssertIsSuccessfulRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\ExprAnalyzer */ private $exprAnalyzer; - public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer, ValueResolver $valueResolver) { $this->symfonyTestCaseAnalyzer = $symfonyTestCaseAnalyzer; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->exprAnalyzer = $exprAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertResponseCodeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertResponseCodeRector.php index f75cdf846..d5cf71bda 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertResponseCodeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertResponseCodeRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\StaticCall; use PHPStan\Type\ObjectType; use Rector\Core\NodeAnalyzer\ExprAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Symfony\NodeAnalyzer\SymfonyTestCaseAnalyzer; @@ -37,11 +38,17 @@ final class WebTestCaseAssertResponseCodeRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\ExprAnalyzer */ private $exprAnalyzer; - public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer, ValueResolver $valueResolver) { $this->symfonyTestCaseAnalyzer = $symfonyTestCaseAnalyzer; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->exprAnalyzer = $exprAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php index 52a373c1e..48f35083c 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/MethodCall/WebTestCaseAssertSelectorTextContainsRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Scalar\String_; use Rector\Core\NodeAnalyzer\ExprAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\PHPUnit\NodeAnalyzer\TestsNodeAnalyzer; use Rector\Symfony\NodeAnalyzer\SymfonyTestCaseAnalyzer; @@ -37,11 +38,17 @@ final class WebTestCaseAssertSelectorTextContainsRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\ExprAnalyzer */ private $exprAnalyzer; - public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(SymfonyTestCaseAnalyzer $symfonyTestCaseAnalyzer, TestsNodeAnalyzer $testsNodeAnalyzer, ExprAnalyzer $exprAnalyzer, ValueResolver $valueResolver) { $this->symfonyTestCaseAnalyzer = $symfonyTestCaseAnalyzer; $this->testsNodeAnalyzer = $testsNodeAnalyzer; $this->exprAnalyzer = $exprAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/StmtsAwareInterface/TwigBundleFilesystemLoaderToTwigRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/StmtsAwareInterface/TwigBundleFilesystemLoaderToTwigRector.php index 594e1e31f..d3a17a6ef 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/StmtsAwareInterface/TwigBundleFilesystemLoaderToTwigRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony43/Rector/StmtsAwareInterface/TwigBundleFilesystemLoaderToTwigRector.php @@ -5,17 +5,16 @@ use PhpParser\Node; use PhpParser\Node\Arg; -use PhpParser\Node\Expr; use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Expression; +use PHPStan\Type\ObjectType; use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; -use PHPStan\Type\ObjectType; /** * @see \Rector\Symfony\Tests\Symfony43\Rector\StmtsAwareInterface\TwigBundleFilesystemLoaderToTwigRector\TwigBundleFilesystemLoaderToTwigRectorTest */ diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/ClassMethod/ConsoleExecuteReturnIntRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/ClassMethod/ConsoleExecuteReturnIntRector.php index 25c8214cb..ca37dddcb 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/ClassMethod/ConsoleExecuteReturnIntRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony44/Rector/ClassMethod/ConsoleExecuteReturnIntRector.php @@ -18,6 +18,7 @@ use PHPStan\Type\IntegerType; use PHPStan\Type\ObjectType; use Rector\Core\NodeAnalyzer\TerminatedNodeAnalyzer; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -32,13 +33,19 @@ final class ConsoleExecuteReturnIntRector extends AbstractRector * @var \Rector\Core\NodeAnalyzer\TerminatedNodeAnalyzer */ private $terminatedNodeAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var bool */ private $hasChanged = \false; - public function __construct(TerminatedNodeAnalyzer $terminatedNodeAnalyzer) + public function __construct(TerminatedNodeAnalyzer $terminatedNodeAnalyzer, ValueResolver $valueResolver) { $this->terminatedNodeAnalyzer = $terminatedNodeAnalyzer; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/CommandConstantReturnCodeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/CommandConstantReturnCodeRector.php index 7dfae96d4..5fe7e0055 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/CommandConstantReturnCodeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony51/Rector/ClassMethod/CommandConstantReturnCodeRector.php @@ -9,6 +9,7 @@ use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Return_; use PHPStan\Reflection\ClassReflection; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\Core\Rector\AbstractRector; use Rector\Core\Reflection\ReflectionResolver; use Rector\Symfony\ValueObject\ConstantMap\SymfonyCommandConstantMap; @@ -26,9 +27,15 @@ final class CommandConstantReturnCodeRector extends AbstractRector * @var \Rector\Core\Reflection\ReflectionResolver */ private $reflectionResolver; - public function __construct(ReflectionResolver $reflectionResolver) + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\BetterNodeFinder + */ + private $betterNodeFinder; + public function __construct(ReflectionResolver $reflectionResolver, BetterNodeFinder $betterNodeFinder) { $this->reflectionResolver = $reflectionResolver; + $this->betterNodeFinder = $betterNodeFinder; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/DefinitionAliasSetPrivateToSetPublicRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/DefinitionAliasSetPrivateToSetPublicRector.php index 4dff2320a..4793a7b77 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/DefinitionAliasSetPrivateToSetPublicRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/DefinitionAliasSetPrivateToSetPublicRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\ConstFetch; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -17,12 +18,18 @@ */ final class DefinitionAliasSetPrivateToSetPublicRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var ObjectType[] */ private $definitionObjectTypes = []; - public function __construct() + public function __construct(ValueResolver $valueResolver) { + $this->valueResolver = $valueResolver; $this->definitionObjectTypes = [new ObjectType('Symfony\\Component\\DependencyInjection\\Alias'), new ObjectType('Symfony\\Component\\DependencyInjection\\Definition')]; } public function getRuleDefinition() : RuleDefinition diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ReflectionExtractorEnableMagicCallExtractorRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ReflectionExtractorEnableMagicCallExtractorRector.php index 15ee639ef..a14c48ecc 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ReflectionExtractorEnableMagicCallExtractorRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ReflectionExtractorEnableMagicCallExtractorRector.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Scalar\String_; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -20,6 +21,11 @@ */ final class ReflectionExtractorEnableMagicCallExtractorRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var string */ @@ -32,6 +38,10 @@ final class ReflectionExtractorEnableMagicCallExtractorRector extends AbstractRe * @var string[] */ private const METHODS_WITH_OPTION = ['getWriteInfo', 'getReadInfo']; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Migrates from deprecated enable_magic_call_extraction context option in ReflectionExtractor', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ValidatorBuilderEnableAnnotationMappingRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ValidatorBuilderEnableAnnotationMappingRector.php index 1da4632a8..951f5fef8 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ValidatorBuilderEnableAnnotationMappingRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/MethodCall/ValidatorBuilderEnableAnnotationMappingRector.php @@ -7,6 +7,7 @@ use PhpParser\Node\Arg; use PhpParser\Node\Expr\MethodCall; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -16,6 +17,15 @@ */ final class ValidatorBuilderEnableAnnotationMappingRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Migrates from deprecated ValidatorBuilder->enableAnnotationMapping($reader) to ValidatorBuilder->enableAnnotationMapping(true)->setDoctrineAnnotationReader($reader)', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyAccessorCreationBooleanToFlagsRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyAccessorCreationBooleanToFlagsRector.php index 4ccc31c19..09a150e1d 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyAccessorCreationBooleanToFlagsRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony52/Rector/New_/PropertyAccessorCreationBooleanToFlagsRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\BinaryOp\BitwiseOr; use PhpParser\Node\Expr\New_; use PhpParser\Node\Name; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,6 +19,15 @@ */ final class PropertyAccessorCreationBooleanToFlagsRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes first argument of PropertyAccessor::__construct() to flags from boolean', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php index c25b31dbc..5823ccb04 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony53/Rector/MethodCall/SwiftSetBodyToHtmlPlainMethodCallRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Identifier; use PHPStan\Type\ObjectType; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; use Symplify\RuleDocGenerator\ValueObject\RuleDefinition; @@ -18,6 +19,15 @@ */ final class SwiftSetBodyToHtmlPlainMethodCallRector extends AbstractRector { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Changes setBody() method call on Swift_Message into a html() or plain() based on second argument', [new CodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/FuncCall/ReplaceServiceArgumentRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/FuncCall/ReplaceServiceArgumentRector.php index a90b6fa81..5655cf0f3 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/FuncCall/ReplaceServiceArgumentRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony60/Rector/FuncCall/ReplaceServiceArgumentRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Scalar\String_; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Symfony\ValueObject\ReplaceServiceArgument; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample; @@ -18,10 +19,19 @@ */ final class ReplaceServiceArgumentRector extends AbstractRector implements ConfigurableRectorInterface { + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var ReplaceServiceArgument[] */ private $replaceServiceArguments = []; + public function __construct(ValueResolver $valueResolver) + { + $this->valueResolver = $valueResolver; + } public function getRuleDefinition() : RuleDefinition { return new RuleDefinition('Replace defined service() argument in Symfony PHP config', [new ConfiguredCodeSample(<<<'CODE_SAMPLE' diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ClassMethod/ArgumentValueResolverToValueResolverRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ClassMethod/ArgumentValueResolverToValueResolverRector.php index fedc03df6..8e9aadd9b 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ClassMethod/ArgumentValueResolverToValueResolverRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/ClassMethod/ClassMethod/ArgumentValueResolverToValueResolverRector.php @@ -88,14 +88,13 @@ private function shouldRefactorClass(Class_ $class) : bool return \false; } /** - * * @return array{bool, Expr|null, Expr|null} */ private function extractSupportsArguments(Class_ $class, int $key, ClassMethod $classMethod) : array { $isIdentical = \true; $supportFirstArg = $supportSecondArg = null; - if (null === $classMethod->getStmts()) { + if ($classMethod->getStmts() === null) { return [$isIdentical, $supportFirstArg, $supportSecondArg]; } foreach ($classMethod->getStmts() as $stmt) { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageSubscriberInterfaceToAttributeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageSubscriberInterfaceToAttributeRector.php index 4e76e894e..277b213c8 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageSubscriberInterfaceToAttributeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony62/Rector/Class_/MessageSubscriberInterfaceToAttributeRector.php @@ -3,17 +3,18 @@ declare (strict_types=1); namespace Rector\Symfony\Symfony62\Rector\Class_; -use PhpParser\Node\Expr\Yield_; -use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Array_; -use PhpParser\Node\Name; use PhpParser\Node\Expr\ArrayItem; -use PhpParser\Node\Expr; +use PhpParser\Node\Expr\ClassConstFetch; +use PhpParser\Node\Expr\Yield_; use PhpParser\Node\Identifier; -use PhpParser\Node; +use PhpParser\Node\Name; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PhpParser\Node\Stmt\Expression; +use Rector\Core\PhpParser\Node\Value\ValueResolver; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\MethodName; use Rector\Core\ValueObject\PhpVersionFeature; @@ -44,6 +45,11 @@ final class MessageSubscriberInterfaceToAttributeRector extends AbstractRector i * @var \Rector\Symfony\NodeAnalyzer\ClassAnalyzer */ private $classAnalyzer; + /** + * @readonly + * @var \Rector\Core\PhpParser\Node\Value\ValueResolver + */ + private $valueResolver; /** * @var \PhpParser\Node\Stmt\Class_ */ @@ -52,11 +58,12 @@ final class MessageSubscriberInterfaceToAttributeRector extends AbstractRector i * @var string */ private $newInvokeMethodName; - public function __construct(MessengerHelper $messengerHelper, ClassManipulator $classManipulator, ClassAnalyzer $classAnalyzer) + public function __construct(MessengerHelper $messengerHelper, ClassManipulator $classManipulator, ClassAnalyzer $classAnalyzer, ValueResolver $valueResolver) { $this->messengerHelper = $messengerHelper; $this->classManipulator = $classManipulator; $this->classAnalyzer = $classAnalyzer; + $this->valueResolver = $valueResolver; } public function provideMinPhpVersion() : int { @@ -134,7 +141,7 @@ public function refactor(Node $node) : ?Node return null; } $stmts = (array) $getHandledMessagesClassMethod->stmts; - if ([] === $stmts) { + if ($stmts === []) { return null; } if ($stmts[0] instanceof Expression && $stmts[0]->expr instanceof Yield_) { @@ -184,7 +191,7 @@ private function parseArguments(Array_ $array, string &$method) : array } $key = (string) $this->valueResolver->getValue($item->key); $value = $this->valueResolver->getValue($item->value); - if ('method' === $key) { + if ($key === 'method') { $method = $value; continue; } @@ -201,7 +208,7 @@ private function addAttribute(string $classMethodName, array $arguments) : void if (!$classMethod instanceof ClassMethod) { return; } - if (MethodName::INVOKE === $classMethodName) { + if ($classMethodName === MethodName::INVOKE) { $this->renameInvoke($classMethod); } $this->messengerHelper->addAttribute($classMethod, $arguments); diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/SignalableCommandInterfaceReturnTypeRector.php b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/SignalableCommandInterfaceReturnTypeRector.php index 40340b3e5..09ddec22a 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/SignalableCommandInterfaceReturnTypeRector.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/rules/Symfony63/Rector/Class_/SignalableCommandInterfaceReturnTypeRector.php @@ -1,15 +1,16 @@ > */ private const OLD_TO_NEW_CLASSES = ['Twig_Function_Method' => 'Twig_SimpleFunction', 'Twig_Filter_Method' => 'Twig_SimpleFilter']; - public function __construct(ReflectionResolver $reflectionResolver) + public function __construct(ReflectionResolver $reflectionResolver, ValueResolver $valueResolver) { $this->reflectionResolver = $reflectionResolver; + $this->valueResolver = $valueResolver; } public function getRuleDefinition() : RuleDefinition { diff --git a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Command/SetAliasesMethodCallExtractor.php b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Command/SetAliasesMethodCallExtractor.php index 97f8d022f..cbfb4b6d9 100644 --- a/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Command/SetAliasesMethodCallExtractor.php +++ b/vendor/rector/rector/vendor/rector/rector-symfony/src/NodeAnalyzer/Command/SetAliasesMethodCallExtractor.php @@ -71,7 +71,8 @@ public function resolveCommandAliasesFromAttributeOrSetter(Class_ $class) : ?Arr if (!$this->isSetAliasesMethodCall($node)) { return null; } - $firstArgValue = $node->getArgs()[0]->value; + $firstArg = $node->getArgs()[0]; + $firstArgValue = $firstArg->value; if (!$firstArgValue instanceof Array_) { return null; }